我已经设置了
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;
};
我还需要做些什么才能影响其他两个渲染目标?
答案 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;
效果文件中的。其他一切都是正确的。 但我不知道为什么会这样做。