我正在使用托管的directX 2.0(我认为它与DirectX9相同)制作应用程序,而且我是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();
输出是存储在RenderTexture中的任何内容,而不是存储在DepthTexture中的内容,而这正是它应该做的事情。我尝试在此行中使用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 :(得分:2)
我认为Sprite会忽略效果状态 - 它只是将您指定的纹理部分复制到给定位置。它不会运行当前着色器。看起来你只是想用当前效果绘制一个窗口大小的四边形;而不是使用Sprite,您可能只想直接使用Device.DrawPrimitives。