可创建渲染纹理来使每个像素包含一个高精度深度 (Depth) 值。这主要用于某些效果需要使用场景深度的情况(例如,软粒子、屏幕空间环境光遮挡和半透明全都需要场景深度)。图像效果也经常使用深度纹理。
深度纹理中的像素值介于 0 和 1 之间,具有非线性分布。精度通常为 32 或 16 位,具体取决于所使用的配置和平台。从深度纹理读取时,将返回 0 到 1范围内的高精度值。如果您需要获取与摄像机之间的距离或其他 0 到 1 之间的线性值,请使用 helper 宏手动进行计算(见下文)。
大多数现代硬件和图形 API 都支持深度纹理。下面列出了特殊要求:
大多数情况下,深度纹理用于渲染距离摄像机的深度。在此情况下,UnityCG.cginc include 文件包含的一些宏可以处理上述复杂问题:
__注意:__在 DX11/12、PS4、XboxOne 和 Metal 中,Z 缓冲区范围是 1 到 0,并定义了 UNITY_REVERSED_Z。在其他平台上,范围是 0 到 1。
例如,以下着色器将渲染其游戏对象的深度:
Shader "Render Depth" {
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 depth : TEXCOORD0;
};
v2f vert (appdata_base v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
UNITY_TRANSFER_DEPTH(o.depth);
return o;
}
half4 frag(v2f i) : SV_Target {
UNITY_OUTPUT_DEPTH(i.depth);
}
ENDCG
}
}
}