UnityShader入门精要学习笔记(二十一):深度和法线纹理

时间:2021-01-25 10:23:26

深度纹理实际上就是一张渲染纹理,只不过它里面存储的像素值不是颜色值,而是一个高精度的深度值。由于被存储在一张纹理中,纹理的深度值范围是[0,1],而且通常是非线性分布的。

UnityShader入门精要学习笔记(二十一):深度和法线纹理

UnityShader入门精要学习笔记(二十一):深度和法线纹理

深度纹理中像素值深度值对应了NDC中顶点坐标的z分量的值。由于NDC中z分量的范围在[-1,1],为了让这些值能够存储在一张图像中,做了下面的映射:

d = 0.5·zndc + 0.5

其中,d对应了深度纹理中像素值,zndc对应了NDC坐标中的z分量的值。

Unity中,当使用延迟渲染路径时,深度纹理所当然可以访问到,因为延迟渲染会把这些信息渲染到G-buffer中。
其它渲染模式,会使用着色器替换技术选择RenderType为Opaque的物体,判断其渲染队列是否小于等于2500(Background、Geometry、AlphaTest),如果满足条件就把它渲染到深度纹理和法线纹理中。

在Unity中,我们可以选择让一个摄像机生成一张深度纹理或是一张深度+法线纹理。

当选择前者,即只需要一张深度纹理,Unity会直接获取深度缓存或是按之前讲到的着色器替换技术,选取需要的不透明物体,并使用它投影时使用的Pass(LightMode被设置为ShadowCaster的Pass)来得到深度纹理。如果没有这样的Pass,那么这个物体就不会出现在深度纹理中。