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

标签 directx-11 pixel-shader render-to-texture compute-shader

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

任何帮助,将不胜感激。

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

最佳答案

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

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

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

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 中,您不需要将深度写入普通缓冲区,您可以只使用深度缓冲区。

对于像素/计算着色器同步,您不能在同一设备上同时运行像素着色器和计算着色器,因此当您的绘制调用完成时,纹理已准备好在计算中用于调度。

关于directx-11 - 在directx 11中一次渲染到多个纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12730309/

相关文章:

c++ - 在调用某些设备上下文函数时,我的一些 D3D11 对象将自己作为 ComPtr 清空

c++ - 将原始 IOS 相机数据上传到纹理

windows - 将两个视频流合并为一个流,如画中画 (WMF)

c# - DirectX 11 是否支持 .NET?

hlsl - 如何在球体上应用柏林噪声?

xna-4.0 - 试图使高斯模糊更强/更模糊 - XNA 4.0 HLSL

java - 有没有适用于 JAVA 的 HLSL 或 HYDRA Pixel Shader 语言?

opengl - OpenGL/OpenGLES 中的帧缓冲区纹理行为

textures - 从多个纹理创建新纹理 SDL-2

C++/DirectX 'level editor'