1

我已经设置

m_lpD3DDevice->SetRenderTarget(0,Buffer1);
m_lpD3DDevice->SetRenderTarget(1,Buffer2);
m_lpD3DDevice->SetRenderTarget(2,Buffer2);

如果我渲染像素着色器只会影响第一个渲染目标。

它的输出结构是

struct PS_OUTPUT
{
    float4 Color0    :  COLOR0;
    float4 Color1    :  COLOR1;
    float4 Color2    :  COLOR2;
};

我还需要做什么来影响其他两个渲染目标?

4

3 回答 3

1

在您的像素着色器中,确保您返回的是结构而不是 float4。也不要将语义 COLOR0 置于函数签名中,即不要这样做:

PS_OUTPUT myPS(VS_OUTPUT): COLOR0

我怀疑这会编译,但它可能会使编译器感到困惑。一个简单的 MRT 着色器如下所示:

PS_OUTPUT myPS(VS_OUTPUT)
{
    PS_OUTPUT out;
    out.color0 = float4(0.5,0.5,0.5,1.0);
    out.color1 = float4(0.2,0.5,0.8,1.0);
    out.color2 = float4(0.8,0.5,0.2,1.0);
    return out;
}

什么是缓冲区 0、1 和 2?它们是调用 CreateTexture() 的结果吗?(或者更确切地说是该纹理的表面)。如果是,请确保使用渲染目标使用标志创建纹理:D3DUSAGE_RENDERTARGET。

确保您的卡可以支持渲染到多个 RT。(忘记了如何做到这一点 - 但我怀疑它不会支持他们。)

如果您正确地创建了缓冲区,正确地设置了它们,并且正确地从像素着色器中写入了正确的值,那么我看不出会出现什么问题。PIX* 对 MRTS 有何评价?他们是否被写给了他们,而他们的显示出了问题?

ps:你希望你打了一个平局,对吧?:)

*PIX 是 DirectX SDK 中的应用程序。如果您以前没有使用过它,那您真的错过了:)

于 2009-07-09T18:02:27.263 回答
1

每个目标都有一个单独的颜色写入掩码。目标 0 的默认写入掩码为 0xf(启用所有通道),但其他目标的默认写入掩码为 0x0。在效果文件中覆盖它是一种方法(您是否想要启用 alpha?),或者您可以使用 SetRenderState 更改它。请参阅 D3DRS_COLORWRITEENABLE{1,2,3} 状态的文档。

于 2009-07-14T20:05:07.463 回答
0

我现在终于有了答案。我所要做的就是设置

ColorWriteEnable = red | green | blue;

在效果文件中。其他一切都是正确的。但我不知道为什么这使它起作用。

于 2009-07-10T14:22:37.007 回答