Unity/C# 相机剔除遮罩表示法

Unity/C# Camera Culling Mask Notation

我有一个来自 github 项目的着色器管理脚本,我试图逐行了解它的作用。有一次它拿起相机并执行此操作:

 m_transparentCamera.cullingMask = ~(1 << LayerMask.NameToLayer("Transparent")); 

然后渲染相机。稍后在文本中它改变了相机的目标纹理,然后这样做:

 m_transparentCamera.cullingMask = 1 << LayerMask.NameToLayer("Transparent");

然后使用不同的着色器再次渲染。

这里的符号是什么意思?我知道 ~ 和 << 是按位运算符,但它实际上对这里的剔除掩码做了什么?

为什么要这样做?

为什么先反转图层蒙版的位,然后再反转?

Github 信誉:https://github.com/candycat1992/OIT_Lab

相机的剔除遮罩告诉它要渲染哪些层。

第一个蒙版 ~(1 << LayerMask.NameToLayer("Transparent")) 渲染所有内容 除了 透明层。

第二个蒙版 1 << LayerMask.NameToLayer("Transparent") 仅渲染透明层。

在一次渲染中渲染不透明几何体,然后在第二次渲染透明几何体是很常见的。这可确保您渲染透明对象后面的任何不透明对象。

如果其中 none 有意义,您可能需要继续阅读 bit masks

位掩码往往大量使用:

  • 左移(<<)挑一点
  • 按位或 (|) 以启用掩码的某些位
  • 按位与 (&) 禁用掩码的某些位
  • 按位非 (~) 否定掩码