Unity 3D-- 摄像机Clear Flags和Culling Mask属性

本文深入探讨Unity中摄像机的Depth、ClearFlags与CullingMask属性,通过实例讲解如何利用这些属性实现多摄像机渲染,包括场景背景与指定物体的独立渲染,以及UI与场景分离的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简述两个属性

1.1 Clear Flags 清除标记

       每个相机在渲染时会存储颜色和深度信息。屏幕的未绘制部分是空的,默认情况下会显示天空盒。当你使用多个相机时,每一个都将自己的颜色和深度信息存储在缓冲区中,还将积累大量的每个相机的渲染数据。当场景中的任何特定相机进行渲染时,你可以设定清除标记以清除缓冲区信息的不同集合。可以通过下面四个选项之一来完成:

1.Skybox 天空盒

     这是默认设置。在屏幕上空的部分将显示当前相机的天空盒。如果当前相机没有设置天空盒,它会默认使用渲染设置(在Edit->Render Settings里)中选择的天空盒。然后它将退回使用背景颜色。另外天空盒组件可以添加到相机上。如果你想创建一个新的天空盒,您可以使用本指南

2.Solid Color 纯色

     屏幕上的任何空的部分将显示当前相机的背景颜色。

3.Depth Only 仅深度

     如果你想绘制一个玩家的枪而不让它在环境内部得到裁剪,你要设置一个深度为0的相机来绘制环境,还要另一个深度为1的相机单独绘制武器。该武器相机的清除标记应设置为仅深度。这将保持环境的图形显示在屏幕上,但会丢弃所有关于每个对象在三维空间中的位置的信息。当枪被绘制出来,不透明的部分将完全覆盖任何已绘制的事物,而不管枪到墙之间如何接近。(这部分看起来很费劲)

4.Don't Clear 不清除

该模式不清除任何颜色或深度缓存。其结果是,每帧绘制在下一帧之上,造成涂片效果。这不是用于游戏的典型方式,最好是与自定义着色器一起使用。

1.2 Culling Mask 剔除遮罩

剔除遮罩使用层有选择地渲染一组对象。有关使用层的信息可以在这里找到。

通常好的做法,是把用户界面放到不同的层,然后用一个独立相机单独渲染UI层。

为了使UI显示在其他相机视角的顶部,你还需要设置清除标记为Depth only,并确保UI相机的深度比其他相机高。

 

2.下面将通过几步演示来展示摄像机该两个属性

一:

         首先在Unity场景中创建两个摄像机,分别命名为camera1和camera2;

         再在场景中创建一个cube和Sphere作为摄像机的拍摄物体;并让两摄像机都能够拍摄到两个物体。

         接着设置camera1的Depth为0,camera2的Depth为1;

         你会发现Game窗口将只显示camera2拍摄到的画面;

         可见摄像机Depth属性设置相机绘图顺序,具有较大值的相机将被绘制在具有较小值的相机的上面,换言之,一个深度为1的相机将绘制在一个深度为0的相机之上。

二:

Clear Falgs默认Skybox;

         将camera2的Clear Falgs设置为Depth Only;


此时你可以看到Game窗口将显示camera1和camera2同时拍摄到的画面


      由此可见,要想将多个相机拍摄的画面渲染到同一个画面是很简单的事情,只需要将它们的Clear Falgs设置为Depth Only;但是有一个条件是,它们的Depth都需要比Clear Falgs为Skybox或Solid Color的摄像机的Depth高,这样才可以将多个相机单独拍摄的画面叠加于同一个画面上。

三:

         现在的问题是,两个摄像机拍摄的物体是一样的,我该如何让camera1只拍摄场景背景,而camera2只拍摄制定的物体;

         在场景中创建一个plane,并设置材质,充满camera1画面,当做场景背景。

接下来,我们要为物体设置层关系。Unity的Layer的概念可以类比PS里面的图层。

      首先,添加一个层(Layer),如下图所示,并命名为object;

      其次,给物体设置层;如图将sphere物体的层设为object层;同样cube的层也设置为object层。


最后你将设置两个摄像机的culling mask 属性,以使摄像机渲染指定层物体。

         摄像机的cullingmask默认为Everything,表明渲染所有层的物体。

Camera1:将culling mask里面的object层勾去掉,culling mask将显示为Mixed… ;你将发现Camera1的窗口将只显示背景图片,物体没有被渲染。


Camera2:在culling mask选项里面先勾选Nothing,再勾选object层,表明该摄像机只渲染属于object的东西,将不会拍摄到别的图层。

最后,在Game窗口看到两个摄像机叠加的画面;


四:

         至此,我们明白了摄像机的Depth、Clear Falgs和Culling Mask的强大作用。

         同样的,如果是制作游戏,你可以创建一个界面摄像机,单独渲染界面,而别的摄像机将渲染场景。你只需要添加UI图层,将所有的界面物体的Layer设置为UI,UI摄像机的Culling Mask也只勾选UI层。



上面的Game窗口视图,为三个摄像机拍摄的画面叠加而成。


由于本博文上传的图片丢失,故将文档上传,下载地址:http://download.youkuaiyun.com/detail/tanmengwen/5255294
转载:http://blog.youkuaiyun.com/tanmengwen/article/details/8798231

 

<think>我们正在回答用户关于Unity摄像机组件的各个属性及其作用的问题。根据引用[2]引用[3]的内容,我们可以详细解释Unity摄像机的各个属性。 注意:引用[1]主要讲摄像机控制系统,引用[2][3]详细介绍了摄像机属性。我们将主要参考引用[2][3]。 同时,我们也要注意引用格式,在适当的地方添加引用标记。 下面开始组织回答: 1. 首先介绍摄像机组件的重要性(简要) 2. 然后逐一介绍摄像机的主要属性及其作用,包括: - Clear Flags - Background - Culling Mask - Projection(包括Field of View/Size, Clipping Planes) - Viewport Rect - Depth - 其他(如Rendering Path, Target Texture等,但用户没有明确要求,可以根据引用内容适当补充) 3. 结合经典案例(如小地图)说明属性的实际应用。 注意:引用[3]中提到了摄像机包含五个组件,但我们的重点是Camera组件,所以主要解释Camera组件的属性。 由于引用[2][3]内容较多,我们将整合它们的信息。</think>### Unity摄像机组件的属性详解 #### 1. **Clear Flags(清除标记)**[^2][^3] - **作用**:决定屏幕未绘制区域的显示方式 - **选项详解**: - **Skybox**(天空盒):默认设置,使用天空盒填充空白区域 - **Solid Color**(纯色):用背景色填充空白区域 - **Depth only**(仅深度):仅清除深度缓存(用于多摄像机分层渲染) - **Don't Clear**(不清除):保留上一帧画面(适合特殊着色器效果) - **应用场景**:多摄像机系统需设置为 *Depth only* 避免画面重叠 #### 2. **Background(背景色)**[^2] - **作用**:当Clear Flags设为 *Solid Color* 时的填充颜色 - **RGB值设置**:通过颜色选择器自定义 - **典型值**:默认黑色 `(0,0,0,0)` #### 3. **Culling Mask(剔除遮罩)**[^2][^3] - **作用**:选择性渲染特定层级的对象 - **配置方法**: ```csharp // 只渲染UI层 camera.cullingMask = 1 << LayerMask.NameToLayer("UI"); ``` - **二进制原理**:32位掩码对应32个层级(默认渲染所有层) #### 4. **Projection(投影模式)**[^3] | 模式 | 数学原理 | 适用场景 | |------|----------|----------| | **Perspective**(透视) | 遵循透视投影矩阵 $$P = \begin{bmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2fn}{f-n} \\ 0 & 0 & -1 & 0 \end{bmatrix}$$ | 3D游戏场景 | | **Orthographic**(正交) | 正交投影矩阵 $$O = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & -\frac{2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1 \end{bmatrix}$$ | 2D UI/小地图 | #### 5. **Field of View/Size(视野/尺寸)**[^3] - **透视模式**:`Field of View`(FOV) - 范围:1°-179°(默认60°) - 计算公式:$$ \text{FOV} = 2 \arctan\left(\frac{h}{2d}\right) $$(h为传感器高度,d为焦距) - **正交模式**:`Size` - 定义:摄像机视口高度的一半(单位:Unity单位) - 小地图典型值:3-5 #### 6. **Clipping Planes(裁剪平面)**[^3] - **Near**(近裁剪面):最近可见距离(默认0.3) - **Far**(远裁剪面):最远可见距离(默认1000) - **优化建议**:根据场景调整减小渲染负担(如室内场景设Far=50) #### 7. **Viewport Rect(视口矩形)**[^3] - **作用**:控制画面在屏幕上的显示区域 - **参数**: - X/Y:左下角起始位置(0-1标准化坐标) - W/H:宽度/高度(0-1) - **小地图应用**: ```csharp camera.rect = new Rect(0.7f, 0.7f, 0.3f, 0.3f); // 右上角30%区域 ``` #### 8. **Depth(深度值)**[^3] - **作用**:决定摄像机渲染顺序(值大的覆盖值小的) - **规则**: - 同深度摄像机按添加顺序渲染 - 典型设置:UI摄像机Depth > 主摄像机Depth #### 9. **Rendering Path(渲染路径)**[^2] | 路径类型 | 特点 | 适用硬件 | |----------|------|----------| | Forward | 逐光源计算(简单场景) | 移动设备 | | Deferred | G-Buffer延迟渲染(复杂光照) | 高端PC | | Legacy | 兼容旧版 | 已弃用 | #### 10. **Target Texture(目标纹理)**[^2] - **作用**:将摄像机画面输出到RenderTexture - **应用**: ```csharp // 创建渲染纹理 RenderTexture rt = new RenderTexture(512, 512, 24); camera.targetTexture = rt; ``` - **用途**:监控画面、画中画、后期处理 ### 经典配置案例:小地图系统 1. 创建正交摄像机(Size=5) 2. 设置高位俯视角 3. 配置视口矩形: ```csharp mapCamera.rect = new Rect(0.7f, 0.7f, 0.3f, 0.3f); ``` 4. 调整深度值高于主摄像机 5. 使用Culling Mask过滤非地图物体 6. 添加圆形遮罩Shader实现雷达效果[^3] > **调试技巧**:在Scene视图开启Gizmos可实时查看摄像机视锥体覆盖范围[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值