Unity / C#相机剔除蒙版符号

时间:2018-11-30 22:14:08

标签: c# unity3d rendering shader vertex-shader

我有一个来自github项目的着色器管理脚本,我试图逐行了解它的功能。一方面,它会拿起相机并执行以下操作:

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

然后渲染摄影机。在文本的稍后部分,它将更改相机的目标纹理,然后执行以下操作:

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

然后使用其他着色器再次渲染。

这里的符号是什么意思?我知道〜和<<是按位运算符,但是这里对剔除蒙版实际上是做什么的?

为什么这样做呢?

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

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

1 个答案:

答案 0 :(得分:0)

相机的消隐遮罩告诉它要渲染的图层。

第一个蒙版newtype Render s a = Render { runRender :: MaybeT (ST s) a } deriving instance Functor (Render s) deriving instance Applicative (Render s) deriving instance Monad (Render s) instance MonadThrow (Render s) where throwM _ = Render $ MaybeT $ pure Nothing instance PrimMonad (Render s) where type PrimState (Render s) = s primitive f = Render $ lift $ primitive f 除了的所有内容呈现为透明层。

第二个遮罩~(1 << LayerMask.NameToLayer("Transparent"))仅渲染透明层。

一遍渲染不透明的几何图形,然后在第二遍渲染透明的几何图形是很常见的。这样可以确保渲染在透明对象后面的所有不透明对象。

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

位屏蔽往往会大量使用:

  • 左移(1 << LayerMask.NameToLayer("Transparent"))来选择一点
  • 按位或(<<)以启用掩码的某些位
  • 按位与(|)以禁用掩码的某些位
  • 按位非(&)否定掩码