[英]C++ matrix-vector multiplication
使用3d图形时,样本着色器通常使用以下操作进行矢量位置转换:
result = mul(matrix, vector);
这显然意味着:
result = mul(vector, matrix_transposed);
另外,仅提及,为简化起见,大多数线性代数库倾向于仅保留vector * matrix
乘法运算。
现在:假设我想使用一些具体的矩阵( 例如 ,让我们使用D3DX
矩阵运算)来变换某些vector
(例如 , 位置 ) 。 因此,我构造了简单的世界视图投影矩阵,然后将其传递给我的着色器。
D3DXMatrixRotationX(&world, 0.05f);
D3DXMatrixLookAtLH(&view, &D3DXVECTOR3(400.0f, 80.0f, 0.0f),
&D3DXVECTOR3(0.1f, 0.1f, 0.0f),
&D3DXVECTOR3(0.0f, 1.0f, 0.0f));
D3DXMatrixPerspectiveFovLH(&projection, 0.5f, 800.0f / 600.0f, 1.0f, 1500.0f);
D3DXMATRIX wvp = world * view * projection;
Set Shader Parameter (wvp); // Pseudocode here
接下来是我无法理解的部分-如果这样做,着色器代码应为
result = mul(vector, wvp)
为了使这种转换起作用(向量从矩阵的左侧乘以)。
为什么会这样? 大多数样本着色器如何在内部进行result = mul(wvp, vector)
转换(并且在将其设置为参数之前,它们不会转置矩阵)?
我哪里错了?
谢谢。
更多信息D3DX
矩阵具有以行为主的对齐方式,我正在使用相应的函数,该函数cgSetMatrixParameterfr
主的矩阵作为参数(在我的特殊情况下为cgSetMatrixParameterfr
)。
当然,我可以通过调用函数cgSetMatrixParameterfc
来“转置”该矩阵,该函数将输入数据视为列主矩阵(并“自动” 转置它),但这太荒谬了。
数学上(以及编程中)的惯例是,您将向量乘以右起的线性变换: matrix * vector == transformed vector
。 所以我不明白你的抱怨。 矩阵已设置为正确的矩阵。 如果要从左侧乘以矢量, 则需要对矩阵进行转置: result = mul(vector, transpose(wvp))
编辑:好的,Direct3D实际上做相反的事情。 它将左侧的向量相乘(将它们作为行而不是列进行处理)。 例如,OpenGL像普通人一样从右边复制。 因此,您需要将转置矩阵加载到cg程序中。
如果两个矩阵都是对角线,正方形并且大小相同,则乘法是可交换的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.