我正在爲unity3d編寫着色器。着色器使用多個渲染目標來呈現後期處理效果。Unity3d,多個渲染目標 - Direct3D/OpenGl中的不同行爲
但是,我遇到了一個有趣的問題。
當Unity3d運行在Direct3D模式,默認情況下所有的標準着色器將數據寫入到僅第一顏色緩衝液(即,具有索引0)。即如果我將3個顏色緩衝區添加到相機,請撥打Camera.Render
帶索引0的顏色緩衝區將包含渲染場景,除非某些着色器專門寫入,否則所有其他緩衝區都將保持不變。我的着色器利用這種行爲(我使用緩衝區索引1和2來累積後期處理效果所需的數據)。
然而,在OpenGL模式下的標準unity3d着色器中的所有顏色緩衝區寫一次。即如果我將多個渲染緩衝區附加到相機上,請致電Camera.Render
,所有3個緩衝區都將包含渲染場景的副本。
這打破了我在OpenGL模式下的着色器。
我該如何解決這個問題?我需要一次渲染整個場景,只有具有特定着色器的對象才能修改其他顏色緩衝區。
我需要渲染的場景一氣呵成,因爲使用圖層蒙版,使團結重新計算投影陰影的所有燈光,我需要的陰影是正確的。
建議?
您是否嘗試過在相機上手動操作命令緩衝區? http://docs.unity3d.com/ScriptReference/Camera.GetCommandBuffers.html –
@MaxYankov:不,如果你更具體,它會有所幫助。我發現我可以在那裏插入額外的命令,但我不知道我該怎麼處理緩衝區。我不記得D3D/OGL是否在任何地方記錄默認的MRT行爲。基本上,如果着色器只寫入第一個緩衝區,則在D3D上,二級緩衝區不變。在OGL上他們從第一緩衝區接收信息的副本。這是標準的統一着色器。 – SigTerm
我希望我可以更具體一些,但我認爲我沒有足夠的經驗。但是,如果我遇到這個問題,這是我可以挖掘的地方。 –