2011-02-01 30 views
0

私はマネージドdirectX 2.0(私はDirectX9と同じだと思う)を使ってアプリケーションを作っています。私はHLSLを初めて使っているので、私がやっていることがばかげている。私は単に格納されているテクスチャ(グローバル変数として割り当てられている)を画面に出力するシンプルなピクセルシェーダを作成していますが、代わりにテクスチャをレンダリングしていることがわかります(別のレンダリングテクスチャ、このシェーダはテストシェーダです)。DirectX 9 HLSLテクスチャサンプリング問題

次のように私の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に格納されているものですそれは何をすることになっています。私は、この行にDepthTextureでRenderTextureを交換しようとしている:

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

と出力はDepthTextureあるので、それは明らかにそこからデータを取っているとテクスチャが正しくフォーマットされています。

HLSLに渡されたテクスチャからサンプルするタイミングと、描画されたデータからサンプリングするタイミングを教えてくれる良いチュートリアルは誰も知っていますか?

+0

TBH Managed DXはサポートされていません。あなたはSlimDXを使うほうがはるかに優れています。 – Goz

+0

シェーダがテクスチャをどのようにサンプリングし、私の質問に無関係であるかは、確かに影響しません。 –

答えて

2

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

関連する問題