1.什么是深度纹理?
深度纹理实际就是一张渲染纹理,只不过它里面存储的像素值不是颜色值,而是一个高精度的深度值。由于被存储在一张纹理中,深度纹理的深度值范围是[0,1],而且通常是非线性分布的,那么,这些深度值是从哪里得到的呢?总体来说,这些深度值来自于顶点变换后得到的归一化的设备坐标(Normalized Device Coordinates,NDC)。一个模型要想要最终被绘制到屏幕上,需要把它的顶点从模型空间变换到齐次裁剪坐标系下,这是通过在顶点着色器中乘以MVP变换矩阵得到的。在变换的最后一步,我们需要使用一个投影矩阵来变换顶点,当我们使用的是透视投影类型的摄像机时,这个投影矩阵就是非线性的。
2.在Unity中如何生成一张深度纹理?
在Unity中,当用前向渲染路径时,由于无法直接获取深度缓存,深度和法线纹理是通过一个单独的Pass渲染而得的。要想让物体能够出现在深度和法线纹理中,就必须在Shader中设置正确的RenderType标签。Unity背后的具体实现是,它会使用着色器替换技术选择那些渲染类型(即SubShader的RenderType标签)为Opaque的物体,判断它们使用的渲染队列是否小于2500(内置的Background,Geometry和AlphaTest渲染队列均在此渲染范围内),如果满足条件,就把它渲染到深度和法线纹理中。
在Unity中,我们可以选择让一个摄像机生成一张深度纹理或是一张深度+法线纹理。当选择前者,Unity会按着色器替换技术,选取需要的不透明物体,并使用它投射阴影时使用的Pass来得到深度