0

D3DXMatrices のベクトルの内容をシェーダーに使用したいと考えています。

m_pLightMatrices->SetMatrixArray(&currentLightMatrices[0].m[0][0],0,numLights);

ベクトルの内部構造はわかっているので、これは問題になりません (ただの動的配列であるため)。

構造体を埋めるために hlsl でこの行列にアクセスすると、次の奇妙な動作が発生します。

struct LightTest
{
 float3 LightPos; 
 float LightRange; 
 float4 LightDiffuse; 
 float3 LightAtt;
};

float4x4 currentLight = gLights[0];

LightTest lt;
lt.LightPos = currentLight._m00_m01_m02; //{0,0,0}
lt.LightDiffuse = currentLight[1].rgba; //{0,0,0,0}
lt.LightRange = currentLight._m03; //this gives me a value
lt.LightAtt = currentLight[2].xyz; //{0,0,0}

デバッグ中に、マトリックスが必要な変数でうまく埋められていることがわかります。構造体の内容をハードコードでチェックしようとすると、LightRange を除いてすべてゼロになります。

ご覧のとおり、float4x4 にアクセスするさまざまな方法を試しましたが、他の結果はありませんでした。

hlsl がすべての変数をコピーしないのはなぜですか?

4

2 に答える 2

0

状況によっては、HLSLに更新するためにCommitChangesを呼び出す必要があります。

また、これを行うことは本当に一種の悪です。ベクターなどを別々に送ってみましたか?

于 2010-05-29T22:06:39.967 に答える
0

私は問題を解決することができました。なぜ今それが機能するのかを明確にする必要があります。

入力レイアウトが設定される前に SetMatrixArray() 関数を配置したところ、突然完全に機能しました。

以前は、他のすべての変数 (ワールド マトリックスなど) と一緒に更新関数内にあり、それらは正常に機能していました。

于 2010-05-29T21:47:44.510 に答える