您需要使用 MRT(多个渲染目标)一次性渲染它。
您可以使用 OMSetRenderTargets 将两个目标绑定为输出
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 中,您不需要将深度写入普通缓冲区,您可以只使用深度缓冲区。
对于像素/计算着色器同步,您不能在同一设备上同时运行像素着色器和计算着色器,因此当您的绘制调用完成时,纹理已准备好在计算中用于调度。