????????在Unity中使用URP時,會有需求使用自定義的一些shader來實現(xiàn)特殊效果,這時如果我們直接使用新建材質(zhì)與無光照著色器(Unlit shader),可能會發(fā)生一個對于新手而言意料之外的問題——物體!消失了!
解決辦法:
????????打開你正在使用的的通用渲染器(Universal Renderer Data),找到渲染(Rendering)->深度引動模式(Depth Priming Mode),將其從默認(rèn)的“自動”修改為“已禁用”。
如果你的問題解決了并且想知道為什么的話,請接著往下閱讀。
????????什么是深度引動模式?深度引動技術(shù)是Unity2021.2中URP管線的新增功能。在Unity的文檔中是這樣解釋的:“The feature uses a depth prepass to determine which pixel shader invocations Unity can skip”,通過使用一種用于預(yù)處理深度信息的Pass來幫助Unity跳過對部分片元的渲染。而在使用Unity2021默認(rèn)的URP項目時,其自動生成的通用渲染器文件(Universal Renderer Data)會默認(rèn)開啟這一項技術(shù),而這也是問題的根源。
????????為什么深度引動模式會導(dǎo)致我們的物體消失?首先必須澄清的是,這并不是Unity的什么Bug,而是很典型的新手效應(yīng)事件,對不熟悉技術(shù)的使用導(dǎo)致了意料之外的錯誤。深度引動模式需要使用一種LightMode為DepthOnly的特殊Pass來生成場景中不透明物體的深度圖,而我們所創(chuàng)建的無光照著色器是不具有該類型Pass的(因為壓根就沒寫這東西),這就導(dǎo)致在開啟了該技術(shù)的渲染流程中,這些使用了“不具備DepthOnlyPass的shader”的物體無法生成深度信息從而被Unity過早剔除無法進(jìn)行后續(xù)的渲染,造成了物體的消失。
????????因此若想在URP項目中同時使用深度引動技術(shù)與自定義shader,則務(wù)必注意需要在自定義shader中向Unity聲明DepthOnlyPass用于執(zhí)行深度引導(dǎo)。幸運(yùn)的是Unity在Universal Render Pipeline內(nèi)置的Unlit shader中已經(jīng)實現(xiàn)了該P(yáng)ass,在自定義shader中使用以下語句即可直接使用。
UsePass "Universal Render Pipeline/Unlit/DepthOnly
對比使用前后:
???????左側(cè)未使用DepthOnlyPass,右側(cè)則添加了DepthOnlyPass,兩者均在前向渲染的情況下開啟了深度引動模式。可見在使用了DepthOnlyPass的情況下,Unity通過DepthPrepass記錄了我們Sphere的深度信息,從而保證了后續(xù)DrawOpaqueObjects的正確執(zhí)行。
Tips:
- 深度引動模式只工作在前向渲染的情況下,因此在通用渲染器中為你的項目選擇延遲渲染路徑的話就能繞過這個問題。
- 深度引動模式只針對不透明物體進(jìn)行優(yōu)化,因此如果你將物體的渲染隊列設(shè)置為“透明”,那么即使不添加DepthOnlyPass也能正常渲染,不過代價是什么呢?
- 更多參考資料可以查看官方文檔,以及Unity工程師NicoLeyman在論壇中的一些回答。
"The more you know, the more you know you don't know."文章來源:http://www.zghlxwxcb.cn/news/detail-456031.html
——Daniel Kahneman文章來源地址http://www.zghlxwxcb.cn/news/detail-456031.html
到了這里,關(guān)于《Unity的URP項目中使用自定義shader導(dǎo)致材質(zhì)消失的解決辦法》的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!