Opengl渲染流程
无论什么渲染流程都是从CPU到GPU的渲染过程
渲染流程中的三个概念阶段
注意这里仅仅是概念性阶段,每个流水线都包含了子流水线阶段
该渲染流程取自《Real-Time Rendering, Third Edition》。
CPU
一,应用阶段
渲染流水线的起点是CPU,即应用阶段。应用阶段可分为下面三个阶段
(1)将数据加载到现存中
(2)设置渲染状态
(3)调用Draw Call
1,将数据加载到现存中
即从硬盘(Hard Disk Drive, HDD)中读取FBX/Obj等需要渲染物体的
(顶点位置,网格,纹理,法线方向,顶点颜色,纹理坐标等信息)加载到
系统内存(Random Access Memory,RAM)中,然后这些数据又被加载到
显卡上的储存空间——显存(Video Ramdom Access Memory,VRAM)中。
而在 Unity中提供了设置好的Meshrender
Meshrender:将模型文件中的信息传到GPU中进行计算
其中包含skin mesh render/mesh render/ mesh filter
skin mesh render :带蒙皮的骨骼
mesh render :主要将定点信息传递到GPU(不带骨骼)
mesh filter:表示将那个模型信息传递给Gpu
到GPU显存之后我们就需要给他设置渲染状态,
2,设置渲染状态
设置渲染状态即怎么去渲染传给我的需要渲染的信息(顶点位置,网格
,纹理,法线方向,顶点颜色,纹理坐标等信息),列如:通过那个顶点
着色器/片元着色器,光源属性,材质等。
设置好之后CPU就需要一个渲染命令告诉GPU按照我设置的数据去进行
渲染,而这个命令就是Draw Call
3,调用Draw Call
Draw Call其实就是一个命令(这个命令仅会指向一个渲染图元,)
CPU将Draw Call传递给GPU,GPU接受到Draw Call就会根据渲染状态(
着色器,纹理,材质等)和所有输入的顶点数据进行计算,最终输出成
屏幕上的像素。而这个计算过程,就是GPU流水线。
GPU
几何阶段和光栅化阶段可以细分成如下更小的流水线。
棱形表示可编程,矩形表示可设置,圆角矩形表示固定函数着色器
一,几何阶段
1,顶点/片元着色器
SubShader
{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 vert(float4 v:POINTION):SV_POINTION
{
return mul(UNITY_MATRIX_MVP,v);
}
fixed4 frag():SV_POINTON{
return fixed(0.0,1.0,0.0,1.0);
}
ENDCG
}
}
顶点着色器负责处理获取处理的网格,位置,纹理然后进行处理,处理后交给片元着色器进行处理。
顶点着色器处理接受CPU的数据,片元着色器将顶点着色器处理后的数据转化成GPU需要渲染的数据。//片元着色器属于光栅化阶段
二,光栅化阶段
1,逐片元操作
这个流程会进行很多测试工作决定片元的可见性,如果一个片元经过了这些测试,那么就需要把这个片元的颜色值和已经储存在颜色缓冲区的颜色进行混合。
逐片元操作是高度可配置的
模板测试
深度测试
混合
《Unity Shdaer 入门精要》