天天看點

ue4模型為啥這麼亮_UE4關于Render In Depth Pass不起效問題及解決

ue4模型為啥這麼亮_UE4關于Render In Depth Pass不起效問題及解決

半透明的物體一般不會寫Depth,就會導緻模型的内部和背面也被畫出來,模型就會看起來像一個透視圖。解決這個的方法是在第一個Pass中隻寫入Depth,不渲染任何像素,然後在第二個Pass中把RenderState設為DepthLEqual,這樣就可以用DepthTest過濾掉我們不希望渲染出來的内部和背部了。

ue4模型為啥這麼亮_UE4關于Render In Depth Pass不起效問題及解決

我在UE4.24中嘗試用這個思路解決頭發的半透明渲染亂序的問題,但是發現諸多問題。

第一個Pass中隻寫入Depth,最開始我用的方法是關閉模型選項Render In Main Pass,僅寫入CustomDepth

ue4模型為啥這麼亮_UE4關于Render In Depth Pass不起效問題及解決

問題1:mobile RenderInMainPass和CustomDepth沖突

表現:模型勾選Custom Depth則RenderInMainPass失效(無論是否啟用模型都會渲染)

官方解決:

The Unreal Engine Issues and Bug Tracker​issues.unrealengine.com

ue4模型為啥這麼亮_UE4關于Render In Depth Pass不起效問題及解決

我參照官方Bug頁面解決了這個顯示問題,不過後來我發現CustomDepth并不對正常的深度測試有效,半透明還是會亂序,不過CustomDepth可以通過在半透明材質中去手動摳出來實作深度測試,其中也有問題,具體可以參考我的另一篇文章UE4 CustomDepth mobile es3.1不起效問題 - 知乎 (zhihu.com)。這裡暫時擱置這個Bug。下面還是讨論正常的Depth寫入。

問題2:Render in Depth pass模型選項無效

預期:關閉RenderInMainPass的情況下勾選Render in Depth pass渲染深度

實際:關閉RenderInMainPass,即使勾選Render in Depth pass仍然不渲染深度,無論PC還是Mobile ES3.1都無效(測試工具:RenderDoc)

類似問題:

Render only depth​answers.unrealengine.com

ue4模型為啥這麼亮_UE4關于Render In Depth Pass不起效問題及解決

Render to Scene Depth Buffer Only​answers.unrealengine.com

經實測發現即使勾上Render In Depth,也不會渲染深度~

ue4模型為啥這麼亮_UE4關于Render In Depth Pass不起效問題及解決

解決方案:

對于StaticMesh而言,找到其GetViewRelevance函數(其它每種Mesh都有對應的GetViewRelevance函數這裡不列舉了)

EngineSourceRuntimeEnginePrivateStaticMeshRender.cpp FStaticMeshSceneProxy::GetViewRelevance(...)

...

Result.bRenderInMainPass = ShouldRenderInMainPass();

在此處添加一行代碼:

+ -> Result.bRenderInDepthPass = ShouldRenderInDepthPass(); (這就是為什麼開啟了Render In Depth Pass選項卻沒有渲染深度的原因,估計是程式員漏寫了~ )

...

ok, build ue4 project , 問題解決。

我們再來測試一下,關閉Opaque模型的RendeInMainPass并且打開RendeInDepth:

ue4模型為啥這麼亮_UE4關于Render In Depth Pass不起效問題及解決

這裡有點奇怪的是這麼一整後頭發變成黑色了,猜測一下原因應該是因為寫入了頭發深度,由于深度測試這裡本該渲染頭發,而我們又關閉了頭發的MainPass渲染,是以就沒有任何顔色寫入,就是黑色了。

打開Buffer可視化看一下SceneDepth:

ue4模型為啥這麼亮_UE4關于Render In Depth Pass不起效問題及解決

已經成功渲染到了SceneDepth。這樣我們再疊加一層半透明上去,頭發Alpha亂序完美解決:

ue4模型為啥這麼亮_UE4關于Render In Depth Pass不起效問題及解決

總結:

這個問題應該是引擎bug,并且一直到我所使用的UE4.24版本并沒有解決

歡迎大家來我的首頁坐客:

哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili​space.bilibili.com

歡迎大家加入UE4遊戲開發愛好者交流群:1101298523