Camera

属性:

Clear Flag:确定屏幕的哪些部分将被清除。

Skybox:天空盒,擦除上一帧的颜色和深度并先用Skybox渲染在最底层,Depth大的Camera,将会清除Depth小的Camera绘制的内容。

Solid Color:固定颜色,擦除上一帧的颜色和深度并先用固定颜色渲染在最底层,Depth大的Camera,将会清除Depth小的Camera绘制的内容。

Depth only:只擦除上一帧的深度,当前帧渲染的图像都会显示在上一帧图像的前面,主要用于多个相机显示。不会清除Depth小的Camera绘制的内容,两个相机绘制的内容将会叠加在一起。并且Depth大的Camera绘制的内容在Depth小的Camera上面。

 

background:当所有的元素绘制完成后,在没有天空盒的情况下,剩余屏幕的应用绘制背景。

culling mask:只渲染选中Layer层

Depth:范围在[-100,100]之间。Depth更大的Camera,将绘制在Depth较小的Camera上面。

 

Projection

Orthographic:正交相机,选择正交相机时,可以设置Camera.orthographicSize,这是垂直视窗大小的一半,水平的视窗大小根据宽高比而变化。

Perspective:透视相机,选择透视相机时,可以设置Camera.fieldOfView,这是垂直的视野范围,水平的FOV根据视窗的宽高比而变化。

Depth only

当我们需要在UI层上显示3D模型时,主相机渲染场景,Clear Flag选择Skybox,Culling Mask不渲染UI层,新建一个相机,Clear Flag选择Depth only,Culling Mask只渲染UI层和显示3D模型的层。

新建的Camera的Depth值,比主相机大,渲染在场景上面。

 

观察空间(摄像机空间)

窗口的+z轴垂直屏幕向内,+x轴水平往右,+y轴垂直往上。Unity在模型空间和世界空间中选用的左手坐标系,而在观察空间中使用的是右手坐标系,这是符合OpenGL的系统的。摄像机的正前方指向的是-z轴方向。

 

屏幕空间

左下角为(0, 0),右上角为(1, 1),在x,y坐标轴是归一化的比例。

Unity用户手册-Camera_Unity用户手册

 

RenderTexture

当相机渲染到一个RenderTexture,就不会渲染到屏幕,需要新建一个相机,才能把当前的场景渲染到屏幕上。

 

Camera.layerCullDistances

相机跟每一层的剔除距离。比如,在视野中有很多npc,可以把npc设置到npc层,并在代码中为npc层设置较小的layerCullDistances剔除距离,这样就可以只渲染npc层剔除距离内的npc,减少性能开销。

 

Culling Mask

可以剔除不需要渲染的层,减少性能开销

 

Occlusion Culling(遮挡剔除)

遮挡的物体,需要勾选为静态。预先计算静态物体,可以减少渲染开销,但是CPU开销很大,对于稠密遮挡物体的渲染优化。

要将遮挡剔除应用于移动对象,需要创建Occlusion Area,然后修改其大小以适应移动对象所在的空间。

 

性能优化

  • 视椎体越小越好,注意远裁减面的距离,顶点数量最多80k-100k之间
  • 注意摄像机的FOV(Field of View),影响可视物体的数量
  • 慎用RenderTexture
  • 在手机上慎用Occlusion Culling
  • 利用好Culling Mask
  • 由于粒子系统在相机视野外,也会继续运行,除非距离相机非常远。这时,自定义裁剪,判断粒子有没有在相机视野中,如果不在相机视野中,停止粒子系统,减少性能开销。
  • 利用好camera.layerCullDistances