軟件:Unity?2022.3.51f1c1、vscode、Meta XR All in One SDK V72
硬件:Meta Quest3
僅針對urp管線
博主搞這個主要是想做現實里的人的變身功能,最后效果如下
可以看到雖然身體是半透明的,但是裙子依舊被完全遮擋了
原理是參考unity的官方urp示例,使用RendererFeature更換被遮擋物體的材質
Unity - Manual: Example of creating a custom rendering effect via the Render Objects Renderer Feature in URP
實現步驟:
一、使用BuildingBlocks設置透視環境
注意:透視有個坑是camera不能開postprocessing(后處理),開后處理會導致環境全黑
二、配置一個具有全身追蹤的玩家物體,可參考這篇
【Quest開發】全身跟蹤(一)_quest3如何識別跟蹤腳部-CSDN博客??????
我為了綁定準確直接使用meta默認的全身追蹤示例?
三、材質設置
身體材質:身體材質的shader需要是透明但寫入深度(DepthWrite)的,這里我直接復制了一份meta提供的oculusHand改了參數給到了Mesh里的材質
ps.不用默認透明lit shader的原因是這個shader只參與深度測試但是不寫入深度(也就是它能被別的東西遮,但是不能遮別的東西)
衣服材質:我直接用的默認lit shader材質。要求是在Transparent隊列里,即使衣服本身不透明(原因在配置RendererFeature里解釋)
被遮擋時替換的材質:為了讓被遮擋的衣服不可見,也就是達成遮擋的效果,應創建一個透明材質(我這里又復制了一個oculusHand調成了全透明,lit的透明材質應該也行)
四、修改物體層級
新建一個Layer:Clothes,給自己的衣服改成這個層級
五、配置RendererFeature
1、找到自己正在使用的渲染管線使用的renderer(渲染器)
2、點擊Renderer Data后選中最下方的add Renderer Feature
選擇Render Objects
3、配置如下
這個渲染器的意思就是,在所有物體渲染完后,再對Clothes這個層級的透明隊列里的物體再次進行渲染處理,當深度測試發現該層級有物體頂點?片元?處于別的物體后面時(也就是自身深度值大于當前像素點存儲的深度緩沖區值時)就會把被遮擋的那個片元替換為ClothesTransparent材質
這樣就完成啦,編輯器里應該能看見效果了。
現在來解釋為什么衣服需要在Transparent隊列里
因為渲染時,opaque(不透明)隊列和Transparent(透明)隊列是分開渲染的,opaque隊列比Transparent隊列先渲染。而我們添加的RendererFeature是針對Transparent隊列的,那么如果衣服位于opaque隊列的話,顯然沒法檢測到
我相信會有人想那給rendererFeature改成針對opaque隊列,衣服就可以在opaque里了唄。不行哈,遮不住一點,會變成下面這樣。我還沒有想通為什么,我貧瘠的渲染知識理解到這已經是極限了,希望大佬評論區解答吧。
2025.4.28
注意,當衣服使用lit材質的transparent時,會發現衣服自身重疊部分渲染奇怪,這也是由于這個shader不寫入深度的原因,有這種困擾的朋友們可以自己建個shadergraph把深度寫入和深度測試都打開