DirectX9中的多个渲染目标

时间:2012-04-14 22:03:52

标签: c++ graphics directx rendering deferred

我正在尝试在DirectX9中实现非常基本的延迟着色。我现在有能力只使用2个渲染目标(后缓冲区和另一个纹理)。所以我可以渲染法线或深度而不是两者。我的问题是有人可以解释如何渲染到多个纹理目标。我的印象是我可以使用类似下面的代码。它仅在索引为零时才有效,这可能意味着其中一个表面未被写入。

d3dDevice->SetRenderTarget(0, surfaceDepth);
d3dDevice->SetRenderTarget(1, surfaceNormal);

我收到此消息:Direct3D9:(WARN):无法渲染到也用作纹理的渲染目标。渲染目标被检测为绑定,但无法检测纹理是否实际用于渲染。

我知道可能有一些与此消息有关的事情......我想如果有人能够解释如何正确使用多个渲染目标索引。您是否也为每个渲染目标更改了技术。现在,我的着色器具有“常规技术”和“深度技术”以及管道的“后处理技术”。

感谢您的时间。

这里有更多代码:

SetTransforms();
d3dDevice->SetRenderTarget(0, surfaceDepth);
HR(d3dDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, 0xff000000, 1.0f, 0));
scenes[sceneIndex]->setTechnique("depthTech");
scenes[sceneIndex]->render(dt);

d3dDevice->SetRenderTarget(1, surfaceNormal);
HR(d3dDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, 0xff000000, 1.0f, 0));
scenes[sceneIndex]->setTechnique("normalTech");
scenes[sceneIndex]->render(dt);

2 个答案:

答案 0 :(得分:2)

您只需为所有目标设置d3dDevice-> SetRenderTarget(n,surface),其中n是目标数字,然后设置输出到像素着色器中的多个渲染目标结构的技术

答案 1 :(得分:2)

你的问题让我更加深入地发现了这个问题。

这就是我发现的:

首先你必须检查你的D3DCAPS9.NumSimultaneousRTs。它超过1吗? 所有rendertargets必须是相同的结果和位深度,但可以是不同的格式。 你不能使用任何抗锯齿。