画面にグラフィックをレンダリングするアプリケーションを書いています。アプリケーションは、Direct3D9グラフィックモジュールとDirect3D10グラフィックモジュールを切り替えることができます(D3D9とD3D10の両方をラップするDLLを作成しました)。テストメッシュ(D3DX9およびDirectX10サンプルにあるDXUTライブラリでストックメッシュとして提供されるトーラス)をレンダリングしようとすると、Direct3D10モジュールの動作がかなり奇妙になります。これが私が得たものです。
D3D9:
D3D10:
ビュー、射影、およびワールドマトリックスは、どちらの場合も同じです。唯一異なるのは、デバイス初期化コードとHLSLエフェクトファイルです(簡単にするために、アンビエントカラーのみを適用し、高度な照明やテクスチャリングなどは使用しません)。これは、デバイスの初期化が間違っているか、シェーダーが不良であることが原因である可能性がありますか?ヒントをいただければ幸いです。リクエストに応じて、任意のコードを投稿できます。
Game Dev StackExchangeの男は、おそらく転置されたプロジェクションマトリックスが原因であると示唆しました。シェーダーファイルで行列が乗算される順序を置き換えてみました。取得できるほとんどすべての順列を試しましたが、画面に正しい出力がありません。
前もって感謝します。編集:これが.fxファイルです。PSは無視してかまいませんが、そこでは何も面白いことが起こっていません。
//Basic ambient light shader with no textures
matrix World;
matrix View;
matrix Projection;
float4 AmbientColor : AMBIENT = float4(1.0, 1.0, 1.0, 1.0);
float AmbientIntensity = 1.0;
struct VS_OUTPUT
{
float4 Position : SV_POSITION; // vertex position
float4 Color : COLOR0; // vertex color
};
RasterizerState rsWireframe { FillMode = WireFrame; };
VS_OUTPUT RenderSceneVS( float4 vPos : POSITION)
{
VS_OUTPUT output;
matrix WorldProjView = mul(World, mul(View, Projection));
vPos = mul(vPos, WorldProjView);
output.Position = vPos;
output.Color.rgb = AmbientColor * AmbientIntensity;
output.Color.a = AmbientColor.a;
return output;
}
struct PS_OUTPUT
{
float4 RGBColor : SV_Target; // Pixel color
};
PS_OUTPUT RenderScenePS( VS_OUTPUT In )
{
PS_OUTPUT output;
output.RGBColor = In.Color;
return output;
}
technique10 Ambient
{
pass P0
{
SetRasterizerState( rsWireframe );
SetVertexShader( CompileShader( vs_4_0, RenderSceneVS( ) ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, RenderScenePS( ) ) );
}
}