2016-12-31 67 views
0

我试着将着色器中的变换矩阵与矢量直接相乘,而不做不必要的运输。据HLSL的mul文档:HLSL mul和D3DXMATRIX顺序不匹配

mul(x, y)乘以xy使用矩阵数学。内部维度x-columns和y-rows必须相等。

x [in]该输入值为x。如果x是矢量,则将其视为一行 矢量。

y [in]该输入值为y。如果y是一个向量,则将其视为列 向量。

我在C++代码:

const D3DXMATRIX viewProjection = view * projection; 
... 
const D3DXMATRIX modelViewProjection = model * viewProjection; 

其中modelViewProjection是被复制到一个恒定缓冲行优先顺序矩阵,未调换。然而,对于这个在HLSL工作,我需要的位置矢量乘以转换矩阵:

output.position = mul(transformation, position); 

这是什么mul文档说的相反。

有人可以解释这里的不匹配吗?

回答

0

deprecated D3DXMath库和更现代的DirectXMath使用行主矩阵顺序。 HLSL语言默认使用列主矩阵顺序,因为它对乘法稍微有效。因此,设置常量缓冲常量的大多数用法都会转置矩阵数据。在几乎所有情况下,在这里转换矩阵的任何“成本”都会被系统中的所有其他延迟隐藏。

您当然可以告诉HLSL使用行主矩阵顺序,这意味着HLSL mul需要对每个顶点执行额外的指令,这就是为什么每次更新通常值得在CPU上进行一次转置的原因。

请参阅MSDN

+0

谢谢!我发现这个指令['#pragma pack_matrix(row_major)'](https://msdn.microsoft.com/en-us/library/windows/desktop/dd607354(v = vs.85).aspx)和['D3DCOMPILE_PACK_MATRIX_ROW_MAJOR '](https://msdn.microsoft.com/en-us/library/windows/desktop/gg615083(v = vs.85).aspx)编译器常量。但是有没有提到改变订单的效率?我查看了生成的字节码,唯一不同的是使用了一些'dcl_temps'([details](https://gist.github.com/anonymous/57b59374f51e29de928a2cb5bd3ae044))。 – user367035