DX9中有多个Rendertargets

时间:2009-07-09 17:35:29

标签: c++ directx hlsl

我已经设置了

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;
};

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

3 个答案:

答案 0 :(得分: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;
}

什么是buffer0,1& 2?它们是调用CreateTexture()的结果吗? (或者说是该纹理的表面)。如果是,请确保使用渲染目标使用标志创建纹理:D3DUSAGE_RENDERTARGET。

确保您的卡可以支持渲染到多个RT。 (忘记怎么做 - 但我怀疑它不会支持他们。)

如果您已正确创建缓冲区,请正确设置它们,并正确地从像素着色器中写出正确的值,然后我看不出会出现什么问题。 PIX *对MRTS的评价是什么?他们是不是写了,而且显示出来的是错误的?

ps:你希望打个电话,对吧? :)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

ColorWriteEnable = red | green | blue;
效果文件中的

。其他一切都是正确的。 但我不知道为什么会这样做。