在 directx 11 中一次渲染到多个纹理

2024-01-11

我正在尝试使用 C++ directx 11 SDK 一次渲染到两个纹理。我希望一个纹理包含结果图像的每个像素的颜色(渲染 3D 场景时我通常在屏幕上看到的颜色),另一个纹理包含每个像素的法线和深度(3 个浮点表示法线,1 个浮点表示法线)为深度)。现在,我能想到的是创建两个渲染目标,并将第一个通道渲染为颜色,第二个通道分别渲染每个渲染目标的法线和深度。然而,这似乎是浪费时间,因为我可以在第一遍中获取每个像素的颜色、法线和深度的信息。那么有没有办法用像素着色器以某种方式输出两个纹理?

任何帮助,将不胜感激。

附:我正在考虑像素着色器中的 RWTexture2D 或 RWStructuredBuffer 的一些内容。一点背景知识:我需要这两个图像在计算着色器中进行进一步处理。这就带来了同步的一个附带问题:由于像素着色器(与计算着色器不同)一次写入每个像素,我如何知道像素着色器何时完成并告诉计算着色器开始图像后处理?


您需要使用 MRT(多渲染目标)一次性渲染它。

您可以使用 OMSetRenderTargets 将两个目标绑定为输出

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476464(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ff476464(v=vs.85).aspx

有一个例子http://hieroglyph3.codeplex.com/ http://hieroglyph3.codeplex.com/(DefferedRendering) 然后展示如何同时写入两个纹理。

这是一个小样本:

ID3D11DeviceContext* deviceContext; //Your immediate context

ID3D11RenderTargetView* m_pRenderViews[2]; //Not more than D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT (8)
m_pRenderViews[0] = pRTV1; //First target
m_pRenderViews[1] = pRTV2; //second target

deviceContext->OMSetRenderTargets(2, &m_pRenderViews[0], NULL); //NULL means no depth stencil attached

然后你的像素着色器将需要输出一个结构而不是单一颜色:

struct PS_OUTPUT
{
    float4 Color: SV_Target0;
    float4 Normal: SV_Target1;
};

PS_OUTPUT PS(float4 p: SV_Position, float2 uv : TEXCOORD0)
{
      PS_OUTPUT output;
      output.Color = //Set first output
      output.Normal= //Set second output
      return output;
}

另外,在 DirectX11 中,您不需要将深度写入普通缓冲区,只需使用深度缓冲区即可。

对于像素/计算着色器同步,您无法在同一设备上同时运行像素着色器和计算着色器,因此当绘制调用完成后,纹理就可以在计算中用于调度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 directx 11 中一次渲染到多个纹理 的相关文章

随机推荐