DirectX9 中的多个呈现目标

Multiple Render Targets in DirectX9

本文关键字:目标 DirectX9      更新时间:2023-10-16

我正在尝试在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);

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

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

这就是我发现的:

首先,您必须检查您的D3DCAPS9。NumSimultaneousRTs.是不是多于1?所有呈现目标必须是相同的资源和位深度,但可以是不同的格式。不能使用任何抗锯齿。