您的位置:首页 > 移动开发 > Unity3D

Unity3D Camera设置结合OpenGL详细解读

2017-03-15 00:02 489 查看
Unity里面的Camera是把渲染画面,最终呈现在屏幕上的最后一步操作。所有的渲染操作最终都要通过Camera来呈现。

如果用OpenGL来实现,Camera做了以下几个事情。

通过正交或是透视,剪裁平面,得到一个4x4的矩阵数据。这个矩阵就是,model-view-projection中的projection。所有物体的旋转R,平移T,缩放S,形成的矩阵数据,最终都要和camera的矩阵数据相乘。
设置Viewport,也就是调用 glViewport 限定屏幕的渲染区域。
针对各种类型绘制缓冲区数据的操作,也就是调用 glClear。
通用的shader类型的选择,就是Rendering path。
自身绘制层级和layer的剪裁并非需要OpenGL来实现。



下面解释一下具体的属性意思。主要根据官方文档和自己使用OpenGL的理解。

Clear Flags:
每帧绘制完后,都需要清空各种缓冲区,最主要的是color和depth,一个负责画面最终呈现的颜色,一个负责景深。重要的是,在当前Camera范围内color和depth会有被覆盖的可能性。在范围外的color和depth有被其它Camera使用的可能性。这里的清除很多时候是为了处理,在当前Camera范围外的区域。

Skybox,     可以理解为Camera范围外的区域,使用SkyBox来填充。

Solid color,可以理解为Camera范围外的区域,使用一个纯色来填充。

Depth only,可以理解为Camera范围外的区域,只清空depth,而不清除color。这就保留了其它Camera范围绘制的画面,但丢失了所有景深信息。这就是为什么,当一个Camera选择Depth only的时候,其它Camera的渲染画面可以保留。没有了景深,多个Camera之间的渲染层级就依赖Camera的Depth来设置。
Don’t clear, 就是不清除color和depth,每次绘制都会叠加在一起。

Background:
就是用来填充,当前Camera范围内没有被绘制的区域。

Culling Mask:
没被选中的Layer会被当前Camera给剔除,不会渲染。过滤非选中层的方法有很多,可能都不会调用渲染函数,没必要使用OpenGL的剪裁功能。

Projection:

正交和透视,以及剪裁平面,就是生成一个矩阵数据。

Viewport Rect:
直接对应了,OpenGL的 glViewport 调用。

Depth:
当有多个Camera的时候,每个Camera有自己的绘制空间区域和屏幕视口。所包含的物体会通过Camera的范围渲染出来。多个Camera的层级,决定了所包含物体的渲染顺序。这个数字从小到大,越来越靠近屏幕。

Rendering Path:
通用的几个shader选择,主要处理光照的。

Target Texture:
可以把Camera渲染的画面,绘制到一个纹理上,而不是设备的显示缓冲区里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: