Unity-攝像機的深度紋理
攝像機可生成深度、深度+法線或運動矢量紋理。這是一種極簡化的 G 緩沖紋理,可用于后期處理效果或?qū)崿F(xiàn)自定義光照模型(例如光照預(yù)通道)。還可以使用著色器替換功能來自行構(gòu)建類似紋理。
可使用腳本中的?Camera.depthTextureMode?變量來啟用攝像機的深度紋理模式。
有三種可能的深度紋理模式:
__DepthTextureMode.Depth__:深度紋理。
__DepthTextureMode.DepthNormals__:打包到一個紋理中的深度和視圖空間法線。*
__DepthTextureMode.MotionVectors__:當(dāng)前幀的每個屏幕紋理像素的每像素屏幕空間運動。打包到 RG16 紋理中。
這些是標(biāo)志,因此可以指定上述紋理的任何組合。
DepthTextureMode.Depth 紋理
這將構(gòu)建一個屏幕大小的深度紋理。
渲染深度紋理時使用的著色器通道與用于陰影投射物渲染的著色器通道相同(ShadowCaster
?通道類型)。因此,通過擴展,如果著色器不支持陰影投射(即在著色器或任何后備著色器中沒有陰影投射物通道),則使用該著色器的對象將不會顯示在深度紋理中。
讓著色器回退到另一個具有陰影投射通道的著色器,或者
如果您在使用表面著色器,那么添加?
addshadow
?指令也能讓它們生成陰影通道。
請注意,僅“不透明”對象(這些對象的材質(zhì)和著色器設(shè)置為使用小于等于 2500 的渲染隊列)會渲染到深度紋理中。
DepthTextureMode.DepthNormals 紋理
這將構(gòu)建屏幕大小的 32 位(8 位/通道)紋理,其中視圖空間法線編碼到 R&G 通道中,而深度編碼到 B&A 通道中。法線使用立體投影進行編碼,深度是打包到兩個 8 位通道中的 16 位值。
UnityCG.cginc
?include 文件具有一個 helper 函數(shù)?DecodeDepthNormal
,可從編碼的像素值中解碼深度和法線。返回的深度在 0 到 1 范圍內(nèi)。
有關(guān)如何使用深度和法線紋理的示例,請參閱著色器替換示例項目中的 EdgeDetection 圖像效果或屏幕空間環(huán)境光遮擋圖像效果。
DepthTextureMode.MotionVectors 紋理
這將構(gòu)建屏幕大小的 RG16(16 位浮點/通道)紋理,其中屏幕空間像素運動編碼到 R&G 通道中。像素運動編碼到屏幕 UV 空間中。
從該紋理運動采樣時,將返回 –1 到 1 范圍內(nèi)的編碼像素。這將是從最后一幀到當(dāng)前幀的 UV 偏移。
提示和技巧
攝像機檢視面板會指示攝像機何時渲染深度或深度+法線紋理。
從攝像機請求深度紋理的方式 (Camera.depthTextureMode) 可能意味著在禁用需要深度紋理的效果后,攝像機可能仍會繼續(xù)渲染深度紋理。若攝像機上存在多個效果,其中每個效果都需要深度紋理,則無法在禁用單個效果的情況下自動禁用深度紋理渲染。
在實現(xiàn)復(fù)雜的著色器或圖像效果時,切記平臺之間的渲染差異。尤其是,在圖像效果中使用深度紋理通常需要對 Direct3D 和抗鋸齒進行特殊處理。
在某些情況下,深度紋理可能直接來自本機 Z 緩沖區(qū)。如果在深度紋理中看到了瑕疵,請確保使用該紋理的著色器未寫入 Z 緩沖區(qū)(使用?ZWrite Off)。
著色器變量
深度紋理可用于在著色器中作為全局著色器屬性進行采樣。通過聲明名為?_CameraDepthTexture
?的采樣器,您將能夠為攝像機采樣主深度紋理。
_CameraDepthTexture
?始終引用攝像機的主深度 紋理。相比之下,您可以使用?_LastCameraDepthTexture
?來引用任何攝像機渲染的最后一個深度紋理。例如,如果您使用輔助攝像機渲染腳本中的半分辨率深度紋理并希望將其提供給后期處理著色器,這種做法可能很有用。
運動矢量紋理(啟用時)在著色器中可用作全局著色器屬性。通過聲明名為“_CameraMotionVectorsTexture”的采樣器,您可以為當(dāng)前執(zhí)行渲染的攝像機采樣紋理。
背景
深度紋理可以直接來自實際深度緩沖區(qū), 也可以在單獨通道中渲染,具體取決于使用的渲染 路徑和硬件。通常,在使用延遲 著色或舊版延遲光照渲染路徑時,會自動采用深度紋理,因為它們始終都是 G 緩沖區(qū)渲染的產(chǎn)物。
當(dāng) DepthNormals 紋理在單獨通道中渲染時,此過程通過著色器替換完成。因此,務(wù)必在您的著色器中設(shè)置正確的“RenderType”標(biāo)簽。
啟用時,MotionVectors 紋理始終來自額外的渲染通道。Unity 會將移動的游戲?qū)ο箐秩镜酱司彌_區(qū)中,并構(gòu)建從最后一幀到當(dāng)前幀的運動。