![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5COhFmYxQGNlZzY3ADOjdTMiZDMkVzN3gDNjFzYyUGZ38CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
半透明的物體一般不會寫Depth,就會導緻模型的内部和背面也被畫出來,模型就會看起來像一個透視圖。解決這個的方法是在第一個Pass中隻寫入Depth,不渲染任何像素,然後在第二個Pass中把RenderState設為DepthLEqual,這樣就可以用DepthTest過濾掉我們不希望渲染出來的内部和背部了。
我在UE4.24中嘗試用這個思路解決頭發的半透明渲染亂序的問題,但是發現諸多問題。
第一個Pass中隻寫入Depth,最開始我用的方法是關閉模型選項Render In Main Pass,僅寫入CustomDepth
問題1:mobile RenderInMainPass和CustomDepth沖突
表現:模型勾選Custom Depth則RenderInMainPass失效(無論是否啟用模型都會渲染)
官方解決:
The Unreal Engine Issues and Bug Trackerissues.unrealengine.com
我參照官方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 depthanswers.unrealengine.com
Render to Scene Depth Buffer Onlyanswers.unrealengine.com
經實測發現即使勾上Render In Depth,也不會渲染深度~
解決方案:
對于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:
這裡有點奇怪的是這麼一整後頭發變成黑色了,猜測一下原因應該是因為寫入了頭發深度,由于深度測試這裡本該渲染頭發,而我們又關閉了頭發的MainPass渲染,是以就沒有任何顔色寫入,就是黑色了。
打開Buffer可視化看一下SceneDepth:
已經成功渲染到了SceneDepth。這樣我們再疊加一層半透明上去,頭發Alpha亂序完美解決:
總結:
這個問題應該是引擎bug,并且一直到我所使用的UE4.24版本并沒有解決
歡迎大家來我的首頁坐客:
哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibilispace.bilibili.com
歡迎大家加入UE4遊戲開發愛好者交流群:1101298523