转载自 Unity3D白皮书(四) Unity3D在渲染方面都帮我们做了什么?
1 顶点属性
包括顶点位置、顶点色、法线、uv等。
这些数据从模型文件(例如FBX)中读取出来,组织成一个数据结构——Mesh
但最终渲染的时候还是从Mesh中将这些数据(可能会被更改)取出来传给GPU 。
2 Vertex shader & Fragment shader 着色器
对Unity3D开发者来说是透明的。Unity3D开发者使用ShaderLab编写Unity3D shader,
这些shader会(根据平台)被编译成Vertex shader & Fragment shader传给GPU。
3 Material 材质
笼统上来讲,就是配置表。
假设我们要直接调用OpenGL(或DirectX),就需要在代码中为Shader设置一些属性(或者说变量)。
Unity3D使用Material这个“配置表”就能够动态地设置这些属性(其实还包含载入纹理的操作)。
4 Renderer 渲染器
再一次封装. Unity3D渲染(在CPU阶段)的基本单位
其实还要算上Transform和针对于MeshRenderer的MeshFilter(求问:为什么要分开?)。
之所以加这一次封装,应该也考虑了 不同Mesh和Material之间的组合 。在送进GPU之前的各种操作都是以Renderer为单位的。 意思是: 一个Renderer一个DrawCall.
5 Culling 剔除
注:区别于渲染管线的裁剪。
-
剔除: 是根据摄像机视域内物体之间互相的遮挡关系判断的.
Occlusion Culling is a feature that disables rendering of objects when they are not currently seen by the camera
because they are obscured (occluded) by other objects. -
而裁剪: 是在渲染过程中. 根据几何物体的与裁剪面之间的关系来进行的.
6 Sorting 排序
- 以Shader中的Queue和Renderer中的sortingLayerID+sortingOrder为基准(Queue的优先级更大)。
这一块需要好好理一理. 究竟Unity渲染时是如何排序的.
7 Batching 合并批次
注意:
Because it works by transforming all GameObject vertices into world space on the CPU, it is only an advantage if that work is smaller than doing a draw call.
Batching 是在CPU中进行的. 只有当 Batchinig比DrawCall花费得少才算是有优势.
这就反映了一个问题:Batching并不总是好的。