私はマネージド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に渡されたテクスチャからサンプルするタイミングと、描画されたデータからサンプリングするタイミングを教えてくれる良いチュートリアルは誰も知っていますか?
TBH Managed DXはサポートされていません。あなたはSlimDXを使うほうがはるかに優れています。 – Goz
シェーダがテクスチャをどのようにサンプリングし、私の質問に無関係であるかは、確かに影響しません。 –