私は自分のdefferedレンダリングエンジンに取り組んでいます。拡散反射光カラー、ビュースペースの法線、および深度(今のところ)を含むg-bufferにシーンをレンダリングしています。私は第2レンダリング段階に指向性ライトを実装しましたが、それはうまく機能します。ここで、少し難しいポイントライトをレンダリングしたいと思います。
g-bufferには深さしかなく、すべてのピクセルで行列を乗算する余裕がないため、ビュースペースのシェーダーのポイントライトの位置が必要です。ライトの位置を取得し、同じマトリックスで変換しました。これにより、シェーダーですべての頂点を変換し、シーン内の頂点と整列するようにします(D3DXVec3Transformを使用)。しかし、そうではありません。変換された位置は、ビュースペースの位置をほとんど表していません。x、y座標がチャートから外れているため、(-1,1)の範囲から大きく外れていることがよくあります。変換された位置はカメラの向きをいくらか尊重しますが、ライトの動きが速すぎて、y軸が反転します。カメラが(0,0,0)にある場合にのみ、ライトは画面中央の(0,0)にあります。フレームごとに実行される関連するレンダリングコードは次のとおりです。
D3DXMATRIX matView; // the view transform matrix
D3DXMATRIX matProjection; // the projection transform matrix
D3DXMatrixLookAtLH(&matView,
&D3DXVECTOR3 (x,y,z), // the camera position
&D3DXVECTOR3 (xt,yt,zt), // the look-at position
&D3DXVECTOR3 (0.0f, 0.0f, 1.0f)); // the up direction
D3DXMatrixPerspectiveFovLH(&matProjection,
fov, // the horizontal field of view
asp, // aspect ratio
znear, // the near view-plane
zfar); // the far view-plane
D3DXMATRIX vysl=matView*matProjection;
eff->SetMatrix("worldViewProj",&vysl); //vertices are transformed ok ín shader
//render g-buffer
D3DXVECTOR4 lpos; D3DXVECTOR3 lpos2(0,0,0);
D3DXVec3Transform(&lpos,&lpos2,&vysl); //transforming lpos into lpos2 using vysl, still the same matrix
eff->SetVector("poslight",&lpos); //but there is already a mess in lpos at this time
//render the fullscreen quad with wrong lighting
関連するシェーダーコードではありませんが、それでも、このように明るい位置が表示されます(IN.textureを渡すと、私は怠惰になります):
float dist=length(float2(IN.texture0*2-1)-float2(poslight.xy));
OUT.col=tex2D(Sdiff,IN.texture0)/dist;
投影せずにmatViewだけでライトを変換しようとしましたが、問題は同じです。シェーダーでライトを変換すると、同じ結果になるため、問題はマトリックス自体にあります。しかし、それは頂点を変換するのと同じ行列です!頂点の扱いはどのように異なりますか?
コードを見て、どこに間違いがあるのか教えていただけますか?私にはそれはうまくいくはずですが、そうではありません。前もって感謝します。