DrawCall
由CPU收集美术的资源信息,传递给GPU,通知GPU进行一次渲染过程叫DrawCall
OpenGl 渲染流程
cpu :
FBX->Meshrender
FBX obj : 模型文件,包含UV、顶点位置、法线切线等渲染信息
MeshRender : 将信息传给GPU
Meshfilter : 将那个模型信息传给GPU
gpu:
顶点着色器->光栅化->片元着色器->alpha测试->模板测试->深度测试->Blend->显示信息
材质球:
Shader + Texture
顶点着色器:顶点信息处理
光栅化:将顶点转换为像素
片元着色器:
图片处理
纹理处理(Filter Mode):
Point:就近采样
Bilinear:线型采样
Trilinear:三线性采样
批处理:
相同的材质,合并起来进行一次渲染.
Dynamic batching: for small enough Meshes, this transforms their vertices on the CPU, groups many similar vertices together, and draws them all in one go.
Static batching: combines static (not moving) GameObjects into big Meshes, and renders them in a faster way.
NGUI
UIWidget存放UI中的顶点法线UV等信息
同一个图集的深度区间要放到同一个区间中
1.UIWiget在Onstart()中递归的寻找父物体CreatePanel()直到找到第一个UIPanel
2.将UIWiget自身加入UIPanel中存放全部UIWiget的集合中。
3.在UIPanel中lateUpdate逐帧渲染,调用UpdateSelf渲染每一个UIWiget
4.UIWiget调用FillAllDrawCalls,SortWidgets对所有子物体按深度、材质、id排序,这样通过对不同图集之间物体进行深度控制,让同一个图集的物体在一个深度区间。通过对材质前后文进行对比,直到与上一个材质不同的,再新建一个DrawCall。
Shader
SubShader
Each shader in Unity consists of a list of subshaders. When Unity has to display a mesh, it will find the shader to use, and pick the first subshader that runs on the user’s graphics card.
Pass
A subshader defines a list of rendering passes and optionally setup any state that is common to all passes.
When Unity chooses which subshader to render with, it renders an object once for each Pass defined
用例:
旗子飘动效果(顶点y坐标变换)
在顶点着色器中使用简谐波根据x偏移y坐标
v2f vert(a2v i) {
float timeOffset = _Time.y * _WaveOffsetSpeed;
i.vertex.y += _WaveH * sin(_WaveSpeed*i.vertex.x + timeOffset);
v2f o;
o.vertex = UnityObjectToClipPos(i.vertex);
o.uv = TRANSFORM_TEX(i.uv, _MainTex);
return o;
}
河流流动效果(纹理坐标的变换)
在片元着色器中对纹理坐标进行变换
fixed4 frag(v2f v) :SV_Target{
float2 mUV = v.uv;
mUV.y += _Time.y;
fixed4 col = tex2D(_MainTex,mUV);
return col;
}
LOD
LOD技术即Levels of Detail的简称,意为多细节层次。LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。