2012-10-04 220 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