2012-10-04 134 views
5

我想通过一次使用C++ directx 11 SDK呈现两个纹理。我想要一个纹理包含结果图像的每个像素的颜色(我在渲染3D场景时通常在屏幕上看到的颜色),以及另一个纹理来包含每个像素和深度的法线(3个浮点用于常规和1个浮点深度)。目前,我能想到的是创建两个渲染目标,并将第一遍渲染为颜色,第二遍渲染目标分别将法线和深度传递给每个渲染目标。但是,这看起来浪费时间,因为我可以在第一遍中获取每个像素颜色,法线和深度的信息。那么有没有办法以像素着色器输出两个纹理?在directx中渲染多个纹理11

任何帮助,将不胜感激。

P.S.我正在考虑像素着色器中的RWTexture2D或RWStructuredBuffer。一点背景:我将需要这两个图像在计算着色器中进一步处理。这引出了同步的一个侧面问题:由于像素着色器(与计算着色器不同)每次都写入一个像素,我怎么知道像素着色器何时完成并告诉计算着色器开始图像后期处理?

回答

10

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

你既可以绑定目标与使用输出OMSetRenderTargets

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

有一个在http://hieroglyph3.codeplex.com/(DefferedRendering)的例子,然后演示了如何写两个纹理一次。

基本上只是你的像素着色器将输出的结构,而不是一个单一的颜色:

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

此外,在DirectX11的你应该不需要写深度到正常的缓冲区,你可以使用深度缓冲。

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

+0

谢谢。特别是对于链接。你无法想象这些人有多大的帮助。再次感谢。顺便说一句,“深度缓冲区”是指像素着色器的SV_Depth值? (我认为我在某处读过这篇文章,但我不太确定。)+1并接受答案。 – l3utterfly

+0

没有probs。 SV_Depth是如果你想写你自己的深度值,它在某些情况下是有用的(PixelShader光线追踪器的深度,或者一些纹理阵列的小提琴)。我的意思是DepthStencil资源也可以作为Shader资源视图绑定,所以既然你也将一个深度缓冲区绑定到你的场景中,你可以重用它,它是免费的) – catflier