0

私はマネージ DirectX 2.0 (DirectX9 と同じだと思います) を使用してアプリケーションを作成しています。保存されたテクスチャ (グローバル変数として割り当てられた) を画面に出力する単純なピクセル シェーダを作成していますが、代わりに渡されたテクスチャをレンダリングしていることがわかります (別のレンダリングされたテクスチャも渡しています。このシェーダはテスト シェーダです)。

私のHLSLコードは次のとおりです。

texture inputTex;
sampler2D InputSampler = sampler_state
{
    Texture = <inputTex>;
};
texture DepthTexture;
sampler2D DepthSampler = sampler_state
{
    Texture = (DepthTexture);
    MinFilter = Linear;
    MagFilter = Linear;
    MipFilter = Linear;   
    AddressU  = Clamp;
    AddressV  = Clamp;
};
float4 testPass(float2 TextureCoordinate : TEXCOORD0) : COLOR0
{
    float4 new_color = saturate(tex2D(DepthSampler,TextureCoordinate));
    new_color.a=1;
    return new_color;
}
technique DoF
{
    pass Pass0
    {
        PixelShader = compile ps_2_0 testPass();
    }
}

私のC#は次のとおりです。

postProc.SetValue("DepthTexture", DepthTexture);
postProc.Begin(FX.DoNotSaveState);
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1.0f, 0);
device.BeginScene();
{
    postProc.SetValue("inputTex", RenderTexture);
    postProc.CommitChanges();
    postProc.BeginPass(0);
    sprite.Draw(RenderTexture, new Rectangle(0, 0, WINDOWWIDTH, WINDOWHEIGHT), new Vector3(0, 0, 0), new Vector3(0, 0, 0), Color.Black);
    postProc.EndPass();
    postProc.End();
    sprite.End();
}
device.EndScene();
device.Present();

出力は、DepthTexture に保存されているものとは対照的に、RenderTexture に保存されているものです。この行で RenderTexture を DepthTexture と交換しようとしました。

sprite.Draw(RenderTexture, new Rectangle(0, 0, WINDOWWIDTH, WINDOWHEIGHT), new Vector3(0, 0, 0), new Vector3(0, 0, 0), Color.Black);

出力は DepthTexture であるため、明らかにそこからデータを取得しており、テクスチャは適切にフォーマットされています。

渡されたテクスチャからいつサンプリングし、いつ描画データからサンプリングするかを HLSL に伝える方法の良いチュートリアルを知っている人はいますか?

4

1 に答える 1

2

Sprite は効果の状態を無視すると思います。指定したテクスチャの部分を指定された場所にコピーするだけです。現在のシェーダーは実行されません。現在の効果でウィンドウサイズのクワッドを描画しようとしているようです。Sprite を使用する代わりに、おそらく Device.DrawPrimitives を直接使用したいでしょう。

于 2011-02-05T07:01:49.170 に答える