Unity-使用深度紋理
可創(chuàng)建渲染紋理來(lái)使每個(gè)像素包含一個(gè)高精度深度 (Depth)?值。這主要用于某些效果需要使用場(chǎng)景深度的情況(例如,軟粒子、屏幕空間環(huán)境光遮擋和半透明全都需要場(chǎng)景深度)。圖像效果也經(jīng)常使用深度紋理。
深度紋理中的像素值介于 0 和 1 之間,具有非線性分布。精度通常為 32 或 16 位,具體取決于所使用的配置和平臺(tái)。從深度紋理讀取時(shí),將返回 0 到 1范圍內(nèi)的高精度值。如果您需要獲取與攝像機(jī)之間的距離或其他 0 到 1 之間的線性值,請(qǐng)使用 helper 宏手動(dòng)進(jìn)行計(jì)算(見(jiàn)下文)。
大多數(shù)現(xiàn)代硬件和圖形 API 都支持深度紋理。下面列出了特殊要求:
Direct3D 11+ (Windows)、OpenGL 3+ (Mac/Linux)、OpenGL ES 3.0+ (Android/iOS)、Metal (iOS) 和游戲主機(jī)(如 PS4/Xbox One)全都支持深度紋理。
OpenGL ES 2.0 (iOS/Android) 要求存在?GL_OES_depth_texture?擴(kuò)展。
WebGL 要求存在?WEBGL_depth_texture?擴(kuò)展。
深度紋理著色器 helper 宏
大多數(shù)情況下,深度紋理用于渲染距離攝像機(jī)的深度。在此情況下,UnityCG.cginc include 文件包含的一些宏可以處理上述復(fù)雜問(wèn)題:
UNITY_TRANSFER_DEPTH(o):計(jì)算頂點(diǎn)的眼睛空間深度并將其在?o?中輸出(必須是 float2)。當(dāng)渲染到深度紋理時(shí),在頂點(diǎn)程序中使用此宏。在具有本機(jī)深度紋理的平臺(tái)上,此宏完全不執(zhí)行任何操作,因?yàn)?Z 緩沖區(qū)值是隱式渲染的。
UNITY_OUTPUT_DEPTH(i):從?i?返回眼睛空間深度(必須為 float2)。當(dāng)渲染到深度紋理時(shí),在片元程序中使用此宏。在具有本機(jī)深度紋理的平臺(tái)上,此宏始終返回零,因?yàn)?Z 緩沖區(qū)值是隱式渲染的。
COMPUTE_EYEDEPTH(i):計(jì)算頂點(diǎn)的眼睛空間深度并將其在?o?中輸出。當(dāng)__不__渲染到深度紋理時(shí),在頂點(diǎn)程序中使用此宏。
DECODE_EYEDEPTH(i)/LinearEyeDepth(i):通過(guò)深度紋理?i?給出高精度值時(shí),返回相應(yīng)的眼睛空間深度。
Linear01Depth(i):通過(guò)深度紋理?i?給出高精度值時(shí),返回相應(yīng)的線性深度,范圍在 0 到 1 之間。
__注意:__在 DX11/12、PS4、XboxOne 和 Metal 中,Z 緩沖區(qū)范圍是 1 到 0,并定義了 UNITY_REVERSED_Z。在其他平臺(tái)上,范圍是 0 到 1。
例如,以下著色器將渲染其游戲?qū)ο蟮纳疃龋?/p>