转载请注明出处:https://blog.csdn.net/weixin_44013533/article/details/131071235
参考:
- 官网手册 Graphics
- 本人使用的unity版本是2021.3.25f
摄像机所看到的内容由它的Transform和 Camera component来定义。Transform position 定义了视点,其向前的 (Z) 轴定义视图方向。Camera 组件的设置还定义了视图中区域的大小和形状。
参考学习:
- 视锥体
可能原因是摄像机视点、视图方向或者视图区域与所观察的对象不一致导致,调整相机transform、fov等参数
Size(正交投影的大小,只在Orthographic投影模式下可用):
控制正交投影下视野的大小,数值越大,可见范围越广,物体越小。
FOV Axis(透视投影的视角轴,只在Perspective投影模式下可用):
决定透视投影的垂直视角或水平视角。
FOV(透视投影的视角,只在Perspective投影模式下可用):
控制透视投影的视角大小,即摄像机能够看到的范围。
视角的单位是度(°),数值越大,可见范围越广。
Physical Camera(物理相机)
启用 Physical Camera 属性后,Unity 将使用模拟真实摄像机属性的属性(Focal Length、Sensor Size 和 Lens Shift)计算 Field of View。详情参考:使用物理摄像机 (Physical Camera)
api中摄像机的视野变量Camera.fieldOfView指的是垂直视野,水平视野随视口宽高比的变化而改变。具体解释参见:Why only one FOV angle?
通过四个值指示将在屏幕上绘制此摄像机视图的位置。在视口坐标中测量(值为 0–1)。
(x,y)决定摄像机视图矩形左下顶点,(w,h)决定摄像机视图矩形宽度和高度
在Unity中,摄像机(Camera)的深度(Depth)是用于控制场景中不同摄像机渲染顺序和层级关系的属性。深度值越小,摄像机越靠前进行渲染,而深度值越大,摄像机越靠后进行渲染。
摄像机的深度值是一个浮点数,默认情况下为0。当场景中存在多个摄像机时,深度值决定了它们的渲染顺序。具有较小深度值的摄像机将先于具有较大深度值的摄像机进行渲染。这样可以确保在渲染过程中,先渲染背景或底层场景,再渲染前景或覆盖层场景。
摄像机的深度还可以用于控制渲染的层级关系。通过调整摄像机的深度值,可以将特定摄像机设置为在其他摄像机之前或之后进行渲染。这对于实现复杂的场景布局、分屏效果或渲染顺序的控制非常有用。
每个摄像机在渲染其视图时都会存储颜色和深度信息。屏幕中未绘制的部分为空,默认情况下将显示天空盒。使用多个摄像机时,每个摄像机都会在缓冲区中存储自己的颜色和深度信息,随着每个摄像机渲染而累积越来越多数据。场景中的任何特定摄像机渲染其视图时,您可以设置 Clear Flags 来清除不同的缓冲区信息集合。为此,请选择以下四个选项之一:
这是默认设置。屏幕的任何空白部分都将显示当前摄像机的天空盒。默认天空盒可在 Lighting 窗口(菜单:Window> Rendering > Lighting> Environment)中选择。
屏幕的任何空白部分都将显示当前摄像机的背景颜色(background属性)
我这里用深度值更大的camera观察weapon,但Don’t clear与Depth only表现结果还是令我比较迷惑,于是参考下面这篇博客"探寻 Unity Camera 属性之 Clear Flags",稍微理解了些:
- Depth Only
清除深度信息后会发生什么?渲染过的像素如果没有需要渲染的物体,则会保持原来的颜色值;否则会渲染新的物体颜色值,不论这个点之前是什么(因为深度值被 Clear),所有在这个像素上发生的 ZTest 默认规则下都会通过,ZWrite 也会按照设定的规则生效写入对应的深度值。
如下图所示:
之前说 Depth Only 是最常使用的设定值,官方文档中介绍的:
“This is handy when using multiple Cameras to draw different game elements.”
意义就在此,当我们需要使用多个 Camera 渲染不同的物体时,当在编辑器 Hierarchy 中为后面 Camera 的 Clear Flags 设定为该值时,该 Camera 渲染时由于不会清除之前 Camera 已渲染的图像(假定后面的 Camera 的 Depth 值大于前面的 Camera,后执行渲染),并且由于清除了深度值,所以不会因为后面摄像机渲染的物体的深度值大于之前物体的深度值而不太能通过 ZTest,所以图像会覆盖在已有图像上方。
如上图,红蓝黄三个物体由一个 Camera 渲染,绿色物体由第二个 Camera 渲染(第二个 Camera 的 Depth 值大于第一个且第二个的 Clear Flags 设置为了 Depth Only),可以看出第一个 Camera 渲染的图像保留在屏幕上,当改变绿色物体的 Z 坐标时,无论是否大于或小于红蓝黄物体的 Z 坐标都能覆盖在最上面。
- Don’t Clear
设定为这个值不会清除任何信息。
所以之前的颜色值会一直存在于屏幕上,直至新的颜色值替换掉缓存的颜色值。同理深度值也不会被清除,直至某个通过了 ZTest 并且 ZWrite 为 On 的像素将深度值更新。
大致流程: 逐像素 ZTest,通过则写入新的颜色值,并根据是否开启 ZWrite 来确定是否更新深度值,否则舍弃。
演示如下图:
对于使用 ZWrite Off 的 Shader 的物体,在 Don’t Clear 下(注意: 在设置为该值的同时关闭了 Camrea 的 HDR 和抗锯齿),由于深度值未写入,所以就算该物体当前帧的深度值比较小而渲染在了前方,但是当下一帧如果深度值变大之后,比其深度值小的物体渲染时就算没有清除之前的颜色缓存,但依旧能通过 ZTest,从而更新像素点的颜色值和深度值。这和开启 ZWrite 刚好相反。
如下图所示,紫色片物体是一个 Sprite,使用了 Sprite-Default.shader,该 Shader 默认关闭了 ZWrite,所以当它 Z 坐标变大(深度值变大)之后,比其深度值小的物体依旧能在前面显示出来。
上面提到的"通过了 ZTest 并且 ZWrite 为 On" 表示当前像素的深度值通过了深度测试,并且将其深度值写入深度缓冲中进行更新。这样的像素会影响后续像素的深度测试,以及确定渲染顺序和遮挡关系。
在Camera组件中,Target Texture属性用于指定摄像机的渲染目标纹理。它决定了摄像机所渲染的内容将被输出到哪个纹理上,而不是直接显示在屏幕上。
通过设置Target Texture属性,可以将摄像机的渲染结果用作纹理,实现镜子、小地图、实时监控等效果。
创建plane作为镜子模型
镜面效果除了用这种Render texture实现,还可以用反射探针、反射材质、立方体贴图(静态)、屏幕空间反射、实时光线追踪等。
参考:
- 摄像机目标纹理渲染(Target Texture)
- Unity HDRP中反射设置的几种方案
- Unity如何制作一面镜子–使用 Reflection Probe
参考:
- 教你3个步骤实现Unity小地图(知识点:RenderTexture、Mask、shader)
- 【学习笔记】Unity基础(七)【uGUI基础、利用render Texture实现小地图功能】
为此摄像机启用遮挡剔除 (Occlusion Culling)。遮挡剔除意味着隐藏在其他对象后面的对象不会被渲染,例如,如果对象在墙后面。
打开window>rendering>Occlusion Culling,可以看到Occlusion窗口的三个tab:Object、Bake和 Visualization
会提示选择Mesh Renderer或者遮挡区域:Select a Mesh Renderer or an Occlusion Area from the scene
设置 | 描述 |
---|---|
Smallest Occluder(最小遮挡物) | 此参数定义了在烘焙过程中被视为有效遮挡物的最小大小。较小的值会更精确地检测和生成遮挡物,但会增加烘焙的复杂性和时间。较大的值可能会导致一些较小的物体或细节被忽略。通常情况下,适当调整此参数可以平衡烘焙的速度和准确性。 |
Smallest Hole"(最小孔洞) | 此参数定义了在烘焙过程中被视为有效孔洞的最小大小。较小的值会更精确地检测和处理孔洞,但也会增加烘焙的复杂性和时间。较大的值可能会导致一些较小的孔洞被错误地填充。适当调整此参数可以控制烘焙结果中的孔洞大小和准确性。 |
Backface Threshold(背面阈值) | 此参数定义了哪些表面被视为背面并被排除在遮挡计算之外。较小的值会更严格地定义背面,可以更准确地排除遮挡计算中的不可见面。较大的值可能会导致一些可见表面被错误地排除。适当调整此参数可以平衡遮挡计算的准确性和性能。 |
Unity 使用 Umbra 库来执行遮挡剔除。详细参数用法,以及有关烘焙过程、故障排除、优化 Umbra等请参考:Unity官方手册:有关遮挡剔除的其他资源
Occlusion Culling 弹出窗口有两种模式:Edit和 Visualization。可以使用下拉菜单在两者之间切换。
设置 | 描述 |
---|---|
View Volumes | 启用此选项后,Scene 视图将包含蓝线,这些蓝线显示遮挡剔除数据中的单元格。单元格大小受 Smallest Occluder 设置的影响:值越小,产生的单元格越多且越小,从而使精度提高并且文件增大。 |
设置 | 描述 |
---|---|
Camera Volumes | 启用此选项后,您会看到黄线,这些黄线指示 Unity 为其生成遮挡剔除数据的场景区域。这取决于场景几何体以及在场景中使用 Occlusion Areas 选项定义的任何视图体积 (View Volumes)。当摄像机在黄线之外时,Unity 不会执行遮挡剔除。 您还可以看到灰线,这些灰线指示摄像机当前位置所对应的遮挡剔除数据中的单元格以及当前单元格中的细分。Smallest Hole 设置定义了单元格内细分的最小大小:值越小,每个单元格产生的细分越多且越小,从而使精度提高并且文件增大。 |
Visibility Lines | 启用此选项后,您会看到绿线,这些绿线指示当前选择的摄像机可以看到的内容。 |
Portals | 启用此选项后,您可以看到一些线代表遮挡数据中单元格之间的连接。当前可见的入口是当前所选摄像机可以看到的入口。 |
参考:
官方手册:Occlusion Culling 窗口
上面介绍过,选择renderer时会有occluder occludee两个选项
下面实验下这两个选项作用
经过实验,我发现,只要进行烘焙,决定对象剔除与否跟自己是否勾选occludee无关,只看有没有其他occluder遮挡摄像机射线。
我之前以为不勾选occludee就不参与剔除,也就是烘焙后只要在视锥体内,就一直可见,可测试发现也存在遮挡剔除。那存在occludee static选项作用是啥?
以后回过头再来看看吧。有大佬路过也请给我解解惑!
报错:No Renderers that are marked **static** were found in the scene. Please mark all renderers that will never move as static in the inspector.UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)
解决方法:对象添加遮挡静态。
在开始之前,请确定场景中所有要设定为静态遮挡物 (Static Occluder)(这些游戏对象不会移动,但会阻挡后面的游戏对象)和静态被遮挡物 (Static Occludee)
适合作为静态遮挡物的游戏对象包括中型到大型的实体游戏对象(例如墙壁或建筑物)。要被设定为静态遮挡物,游戏对象必须满足以下条件:
借助剔除遮罩,可使用层来选择性渲染对象组。
它们都是为了减少不必要的渲染工作,提高渲染性能。
拓展:
Unity中使用ComputeShader做视锥剔除(View Frustum Culling)
视锥体剔除(Frustum Culling)算法详解
因以下内容涉及渲染管线等知识,我暂时不研究,内容未作验证,请酌情参考
Use Graphics Settings(使用图形设置):这是默认的渲染路径,它会使用项目中的全局图形设置。该设置通常是在项目质量设置中配置的。使用此选项可以确保使用一致的图形设置进行渲染。
Forward(前向渲染):该渲染路径在每个物体上执行一次照明计算,适用于移动设备和较低性能的硬件。它适用于有限数量的光源,并且可以在运行时进行动态光照计算。
Deferred(延迟渲染):该渲染路径将照明计算延迟到后期处理阶段,适用于具有大量光源的场景。它可以提供更好的光照效果,但对于移动设备和较低性能的硬件可能不太适用。
Legacy Vertex Lit(传统顶点光照):这是Unity旧版本中的渲染路径,不再推荐使用。
Legacy Deferred (light prepass)(传统延迟渲染):这也是Unity旧版本中的渲染路径,不再推荐使用。
使用建议:一般情况下,使用默认的 “Use Graphics Settings” 渲染路径即可满足大多数项目需求。如果项目需要特定的渲染效果或对性能有特殊要求,可以根据具体需求选择合适的渲染路径。
Allow HDR(允许高动态范围):
该属性控制摄像机是否允许渲染高动态范围(HDR)图像。启用此选项可以在渲染过程中使用更大的颜色范围和更高的亮度级别,以实现更逼真的光照效果和色彩表现。
使用建议:如果项目需要较高的图像质量和光照效果,例如在视觉效果较为重要的游戏或应用中,建议启用 HDR。但请注意,启用 HDR 可能会对性能产生一定影响,因此在移动设备或较低性能的硬件上使用时需要谨慎。
Allow MSAA(允许多重采样抗锯齿):
该属性控制摄像机是否允许使用多重采样抗锯齿(MSAA)技术来减少图像的锯齿状边缘。
使用建议:如果项目需要改善图像的平滑度和边缘质量,建议启用 MSAA。但请注意,启用 MSAA 可能会对性能产生一定影响,特别是在移动设备或较低性能的硬件上使用时。
Allow Dynamic Resolution(允许动态分辨率):
该属性控制摄像机是否允许动态调整渲染目标的分辨率,以优化性能或适应不同的设备屏幕分辨率。
使用建议:启用动态分辨率可以帮助提高游戏在不同设备上的性能和适应性。如果你的项目需要在各种设备上运行,并希望在不牺牲图像质量的情况下获得最佳性能,建议启用动态分辨率。
Target Display(目标显示):
该属性指定摄像机将渲染到哪个显示器。如果项目有多个显示器或屏幕,并且需要将渲染内容针对特定显示器进行优化或分离,可以使用此属性。
使用建议:在大多数情况下,不需要手动设置目标显示属性,因为Unity会自动将渲染内容发送到主显示器。只有在特殊需求下,例如多显示器环境或VR应用中,才需要显式设置目标显示。
本节主要学习camera组件的相关属性,介绍了投影方式、depth、clear flag等基础概念,详细学习了target texture、occlusion culling等知识。
有关camera的其他高阶内容,诸如渲染管线、优化等内容暂不研究。
下节计划学习Cinemachine插件、镜头脚本相关,涉及第一第三人称视角切换、镜头跟随、镜头抖动等案例。