【问题标题】:Unity/C# Camera Culling Mask NotationUnity/C# Camera Culling Mask Notation
【发布时间】:2018-11-30 22:14:08
【问题描述】:

我有一个来自 github 项目的着色器管理脚本,我正在尝试逐行了解它的作用。在某一时刻,它会拿起相机并这样做:

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

然后它渲染相机。稍后在文本中它会更改相机的目标纹理,然后执行以下操作:

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

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

这里的符号是什么意思?我知道 ~ 和

为什么会这样?

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

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

【问题讨论】:

    标签: c# unity3d rendering shader vertex-shader


    【解决方案1】:

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

    第一个遮罩,~(1 &lt;&lt; LayerMask.NameToLayer("Transparent")),渲染所有除了透明层。

    第二个遮罩1 &lt;&lt; LayerMask.NameToLayer("Transparent"),只渲染透明层。

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

    如果这些都没有意义,您可能需要阅读bit masks

    位掩码往往会大量使用:

    • 左移 (&lt;&lt;) 选择位
    • 按位或 (|) 启用掩码的某些位
    • 按位与 (&amp;) 禁用掩码的某些位
    • 按位 NOT (~) 否定掩码

    【讨论】:

    • 谢谢你。为什么透明层索引左移 1?为什么不将其保留为 ~(LayerMask.NameToLayer) 和 (LayerMask.NameToLayer)?
    • @user430481 假设NameToLayer返回3,二进制是0011,但这与1 &lt;&lt; 3不同,二进制是1000。层索引告诉你设置哪个位,然后使用左移操作设置那个位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多