相机的深度纹理

在 Unity 中,相机 (Camera) 可生成深度或深度 + 法线纹理。这是一个简约的几何缓冲区纹理,它可用于后处理效果或者执行自定义光照模式(例如光照前通道)。相机实际上使用着色器替换功能编译深度纹理,因此当您需要不同的几何缓冲区设置时,完全可以自己编译深度纹理。

在脚本使用 Camera.depthTextureMode 变量可打开相机的深度纹理。

有两种可能的深度纹理模式:

DepthTextureMode.Depth 纹理

编译一个屏幕大小的深度纹理

DepthTextureMode.DepthNormals 纹理

编译一个屏幕大小的 32 位(8 位/通道)纹理,其中将视图空间法线编入 R&G 通道,将深度编入 B&A 通道。使用立体 (Stereographic) 投影对法线进行编码,深度为 16 位数值,并放进两个 8 位通道中。

UnityCG.cginc 引用文件中含有一个帮助函数 DecodeDepthNormal,可用于从已编码的像素值解码深度和法线。得到的深度值在 0..1 区间。

例如,关于如何使用深度和法线纹理,请参考着色器替换 (Shader Replacement) 示例工程中的 EdgeDetection 图像效果或 SSAO 图像效果

提示与技巧

编写复杂的着色器或图像效果 (Image Effect) 时,请记住不同平台之间的渲染差异。尤其是在启用了抗锯齿 (Anti-Aliasing) 的 Direct3D 上,在图像效果 (Image Effect) 中使用深度纹理通常需要进行特殊处理。

在某些情况下,深度纹理可能直接来自本地 Z 缓冲区。如果在深度纹理中看到了假象,请确保使用该纹理的着色器不会写入 Z 缓冲区(使用ZWrite Off)。

深入了解

深度纹理可直接来源于实际深度缓冲区,或在单独通道中渲染,这取决于使用的渲染路径和硬件。深度纹理在单独通道中渲染是通过着色器替换来完成的。因此,着色器中有正确的“渲染类型 (RenderType)”标记很重要。

Page last updated: 2013-06-25