DirectX 9 HLSL纹理采样问题

时间:2011-02-01 22:10:17

标签: c# directx textures hlsl sampling

我正在使用托管的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何时从传入的纹理中采样以及何时从绘制的数据中采样?

1 个答案:

答案 0 :(得分:2)

我认为Sprite会忽略效果状态 - 它只是将您指定的纹理部分复制到给定位置。它不会运行当前着色器。看起来你只是想用当前效果绘制一个窗口大小的四边形;而不是使用Sprite,您可能只想直接使用Device.DrawPrimitives。