2

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

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

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

我知道可能有几件事可能与此消息有关...我想是否有人可以解释如何正确使用多个渲染目标索引。您是否还更改了每个渲染目标的技术。现在我的着色器有一个“普通技术”和一个“深度技术”和管道的“后处理技术”。

谢谢你的时间。

这是更多代码:

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);
4

2 回答 2

2

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

于 2012-08-31T19:08:52.577 回答
2

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

这就是我发现的:

首先你必须检查你的 D3DCAPS9.NumSimultaneousRTs。大于1吗?所有渲染目标必须是相同的分辨率和位深度,但可以是不同的格式。您不能使用任何抗锯齿。

于 2012-10-24T09:34:59.090 回答