返回介绍

相机的深度纹理

发布于 2021-06-20 00:15:06 字数 1541 浏览 889 评论 0 收藏 0

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

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

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

  • DepthTextureMode.Depth: 深度纹理
  • DepthTextureMode.DepthNormals: 将深度与视图空间法线放到一个纹理中。

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)”标记很重要。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文