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来得到深度纹理(即LightMode被设置为ShadowCaster的Pass)。如果Shader中不包含这样一个Pass,那么这个物体就不会出现在深度纹理中(当然,它也不能向其它物体投射阴影)。当选择生成一张深度+法线纹理,Unity底层使用了一个单独的Pass把整个场景渲染一遍来完成。这个Pass被包含在Unity内置的一个Unity Shader中,我们可以在内置的buildin_shaders-xxx/DefaultResources/Camera-

本文介绍了Unity3D中的深度纹理和法线纹理,包括它们的概念、生成方法以及如何在Shader中获取和使用这些信息。深度纹理存储的是非线性深度值,用于记录物体在视场中的位置;法线纹理则存储视角空间下的法线信息。在Unity中,可以通过设置摄像机的depthTextureMode生成深度纹理或深度+法线纹理,并通过特定的Shader宏和辅助函数进行采样和解码操作。

3836

被折叠的 条评论
为什么被折叠?



