0

我正在使用托管的 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 中的内容,这是它应该做的。我尝试在这一行中将 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 回答