2016-12-31 4 views
0

シェーダの変換マトリックスにベクトルを直接乗せようとしています。 HLSLのmulドキュメントによると:HLSL mulとD3DXMATRIXのオーダーの不一致

mul(x, y)乗算xy行列演算を使用して。内部次元x列とy行は等しくなければなりません。

x [in]x入力値。 xがベクターの場合は、行 として扱います。

y [in]y入力値。 yがベクターの場合は、 ベクターの列として扱います。

Iは、C++コードを持っている:modelViewProjectionが一定のバッファにコピーされる行優先順序行列で

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

は、転置されません。 mulドキュメントが言っていることの反対である

output.position = mul(transformation, position); 

:しかし、これは私がように位置ベクトルとの変換行列を乗算する必要がHLSLで作業するため。

誰かが不一致をここで説明できますか?

答えて

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