0

画面にグラフィックをレンダリングするアプリケーションを書いています。アプリケーションは、Direct3D9グラフィックモジュールとDirect3D10グラフィックモジュールを切り替えることができます(D3D9とD3D10の両方をラップするDLLを作成しました)。テストメッシュ(D3DX9およびDirectX10サンプルにあるDXUTライブラリでストックメッシュとして提供されるトーラス)をレンダリングしようとすると、Direct3D10モジュールの動作がかなり奇妙になります。これが私が得たものです。

D3D9: D3D9モジュールによってレンダリングされたトーラス。

D3D10: 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( ) ) );            
    }
}
4

3 に答える 3

2

vPos.w = 1.0f であることを確認してください。そうでない場合、行列の乗算が暴走し、奇妙な結果が生じます。

于 2013-02-28T12:22:42.543 に答える
1

問題の原因は不明ですが、次のことを確認できます。

  • 変換行列を含む定数バッファーが、ガベージデータではなく、「何かで初期化」されていることを確認してください
  • 頂点バッファで法線/接線を使用する場合は、(頂点ごとに) ガベージ データをそこに入れないようにしてください。
  • 頂点レイアウトの説明が頂点シェーダー (.hlsl) の入力と一致することを確認してください。一致しない場合でも、コンパイルして実行するだけで予期しないメッシュが表示されることがあります。
  • DX9でどうなっているのかわかりませんが、座標に何かがあるかもしれません。変換行列の頂点バッファのzに-1を掛けると役立つかもしれません

編集:単純なメッシュをバッファーに入れ、たとえば立方体 (三角形でも) を入れて、正しく描画されているかどうかを確認することもお勧めします。

于 2013-02-27T15:56:44.833 に答える
0

マトリックスをシェーダー定数として設定する前に、マトリックスを転置する必要があります。xnamath を使用している場合は、定数バッファーに設定する前に、ワールド、ビュー、および射影行列のそれぞれで XMMatrixTranspose() 関数を使用します。

于 2013-02-27T22:49:35.227 に答える