顶点着色器中矩阵的乘法
multiplication of matrices in vertex shader
本文关键字:顶点 更新时间:2023-10-16
当我在 CPU 上乘以矩阵时
D3DXMATRIX mb = mbb.matWorld * mbb.matView * mbb.matProj;
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(D3DXMATRIX);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA initData;
ZeroMemory(&initData, sizeof(initData));
initData.pSysMem = &mb;
//*****************************************
cbuffer ConstantBuffer : register(cb0)
{
matrix mat;
float4 vs(float4 pos : POSITION) : SV_POSITION
{
float4 ret = mul(pos, mat);
return ret;
}
效果很好。但是当我在 GPU 上执行此操作时
struct Buffer
{
D3DXMATRIX mat[3];
};
Buffer b;
// b[..] = ....
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(D3DXMATRIX) * 3;
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA initData;
ZeroMemory(&initData, sizeof(initData));
initData.pSysMem = &b;
//*****************************************
cbuffer ConstantBuffer : register(cb0)
{
matrix matWorld;
matrix matView;
matrix matProj;
}
float4 vs(float4 pos : POSITION)
{
float4 ret = mul(pos, matWorld);
ret = mul(ret, matView);
ret = mul(ret, matProj);
return ret;
}
屏幕上不呈现任何内容。怎么了?
我一直在使用 PIX 进行调试,它表明在两个版本中,后顶点是相同的。
我注意到这是由投影矩阵引起的。对于我的投影矩阵,我做到了:
D3DXMatrixPerspectiveFovLH(&mbb.matProj, D3DX_PI / 2, (float) init_params.width / init_params.height, 0.01f, 100.0f)
固定
在将矩阵传递给顶点着色器之前,我必须转置矩阵。
此外,您可以随时在 mul() 中切换参数顺序;
多(矩阵,矢量);
这样,由于 mul() 将"矩阵"解释为行主,因此乘法将正确完成。
相关文章:
- 如何循环打印顶点结构
- D3D11-将混合权重和索引传递到顶点着色器
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 如何将一半传递给顶点着色器?
- 在 DirectX 11 中从 GPU 读回顶点缓冲区(并获取顶点)
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 使用 OpenGL 4.5 更改所选顶点的颜色
- Direct3D 11 - HLSL - 获取顶点索引 ID
- 创建异构顶点数据数组的可移植方法
- 使用 glvertex4i 传递网格面索引时的顶点着色器错误
- 无法从 cso 文件创建顶点着色器(从 fx 文件创建)
- OpenGL 相机移动程序顶点着色器问题
- 使用 std::list 存储顶点并使用 SFML 绘制它们
- 为什么顶点数组对象会导致错误?
- 从 CGAL 3D 网格生成中获取顶点坐标的 -6.27744e+66:mesh_implicit_sphere示例
- 将顶点位置从顶点传递到片段着色器 - 仅在使用 Nsight 进行调试时有效
- FBX SDK 在预期 3 个顶点时返回 4 个顶点
- 我对 MyGraph 属性顶点名称和边权重有问题