0


DirectX 11、c++ でディファード シェーディングを実現しようとしています。G-Buffer を作成し、それにシーンをレンダリングすることができました (「GPU PerfStudio」で確認)。最終的なライティング ステージで問題が発生しています。SV_Position が返す座標を使用して、テクスチャ (拡散、法線、鏡面反射光) から読み取ることができません。

これは、光を形状としてレンダリングするために使用されるピクセル シェーダーです。

Texture2D<float4> Diffuse   : register( t0 );
Texture2D<float4> Normal    : register( t1 );
Texture2D<float4> Position  : register( t2 );

cbuffer MaterialBuffer : register( b1 )
{
    float4 ambient;
    float4 diffuse;
    float4 specular;
}
//--------------------------------------------------------------------------------------
struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
    float4 PosVS:   POSITION;
    float4 Color : COLOR0;
    float4 normal : NORMAL;
};

float4 main(VS_OUTPUT input) : SV_TARGET
{

    //return Diffuse[screenPosition.xy]+Normal[screenPosition.xy]+Position[screenPosition.xy];
    //return float4(1.0f, 1.0f, 1.0f, 1.0f);
//--------------------------------------------------------------------------------------
    //Problematic line
    float4 b=Diffuse.Load(int3(input.Pos.xy,0));
//--------------------------------------------------------------------------------------
    return b;
}

「GPU PerfStudio」で入力テクスチャが適切にバインドされていることを確認しました。

上記のコードは、テクスチャをクリアするために使用した色を返しています (私のデバッグから、戻り値がピクセル位置 0,0 であることがわかりました)。

問題のある行を次のように置き換えると:-

float4 b=Diffuse.Load(int3(350,300,0));

次に、適切な形状の光で 350,300 ピクセルの位置に値をレンダリングします。

ありがとう

4

2 に答える 2

0

D3D11_CREATE_DEVICE_DEBUGデバイスの作成時にデバッグ フラグを付けて試し、出力ログを確認しましたか。Vertex ステージと Pixel ステージの間で署名の不一致が発生する場合があります。sv_position セマンティックが正しく動作しない理由を説明します。

于 2013-10-20T19:05:07.590 に答える