我有一个来自 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")
,仅渲染透明层。
在一次渲染中渲染不透明几何体,然后在第二次渲染中渲染透明几何体是很常见的。这可确保渲染透明对象后面的任何不透明对象。
如果这些都没有意义,您可能需要阅读 bit masks .
位掩码往往会大量使用:
- 左移 (
<<
) 选择一点 - 按位或 (
|
) 启用掩码的某些位 - 按位 AND (
&
) 禁用掩码的某些位 - 按位 NOT (
~
) 对掩码取反
关于c# - Unity/C# 相机剔除 mask 表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565626/