Unity3d 图形学之OpenGL渲染流程(一)
游戏开发中经常需要平衡GPU和CPU的性能消耗
比如游戏加载时的 Loading 界面,往往伴随着资源请求(网络请求数据和本地请求资源),这些请求很消耗CPU的资源,如果Loading也放在CPU做的话会抢占CPU资源,就使得当前界面会变的非常卡顿,所以我们要在CPU忙的时候,通过GPU来分担一下工作。
Loading 做法:利用CPU 做若干图交替 ;利用GPU旋转
OpenGl 渲染流程:Cpu和Gpu:
Cpu:
Fbx加载到内存中去,然后通过Mesh render渲染出来(通过Fbx加载顶点等信息传给Mesh'render)
Gpu:
渲染管线(管道):顶点着色器——>光栅化——>片段着色器——>alpha测试——>模版测试——>深度测试——>Blend——>Gbuffer——>BrontBuffer——>framebuffer——>显示器
顶点着色器:
1.计算顶点的颜色;2. 将物体坐标系转换到相机坐标系;
光栅化:
将顶点转换成像素,一 一对应
比如Unity渲染一个Quad物体,如下Quad有四个顶点
假设Quad像素为100*100
片段着色器:
1.此时顶点已经是像素点(像素:一般有RGBA 4通道组成 RGBA 8888表示每个通道占8bit ,32位刚好用float )
比如 屏幕 1080*1920 横有 1080个像素,竖有1920个像素,float[1080*1920]
Quad有4个顶点到了 片段着色器 就变成了 100*100(即顶点着色器运行4次,片段着色器运行10000次)
顶点着色器 与片段着色器 运算次数不是一个量级的,所以能把运算放在顶点着色器里就尽量放在里面。
片段着色器主要做些什么呢?
1.纹理采样 即给Quad赋予贴图或材质球,把纹理像素付给原来的像素,把原来的像素覆盖掉了。
———————— >
2. 像素跟灯光进行计算。
alpha测试:挑选合格的alpha像素显示。(RGBA)
模版测试: 像素还可以携带 模板信息 达到条件的模板值会显示出来
深度测试:符合条件的(一般是像素距离相机的距离)像素 就通过,不然就丢弃
以上三个测试 决定像素能否被显示出来,挑选合格的像素
Blend:将当前 要 渲染的像素 和 已经渲染出来的像素混合运算
GBuffer :一个像素 存的(RGBA 模板值 深度值 )等信息,只要是审核通过了以后
Gbuffer做的中转把这些信息传给FrontBuffer
(Buffer其实是缓存区)Float[720*1280*4]数组存的信息比较多。
Front Buffer:由Gbuffer往Front Buffer写完以后,Front Buffer推向显示器显示过程中,Front Buffer
此时此刻就变成了FrameBuffer,同时
由Gbuffer往Front Buffer写完以后,FrameBuffer会交换到后面去变成Front Buffer
Float[720*1280]缓存区
FrameBuffer:
Float[720*1280]缓存区
其实 Front Buffer和FrameBuffer在交替显示,一帧帧的看着好像在动一样,所以两个是相对的。
相关知识借鉴:http://video.mobiletrain.org/course/index/courseId/535?pinzhuanbdtg=biaoti