图形学学习笔记 - OpenGL渲染流程
我们知道通过GPU【显卡】来渲染3D场景,其实是有严格的过程的,每个阶段都有自己的工作要做,然后给下一阶段提供所需的数据
早起的GPU是固定渲染管线,也就是说,把模型加载,它就显示出来了。
但是后来发展为可编程渲染管线,什么意思?
就是说,GPU把某几个阶段开放,用户可以自己控制这个阶段的渲染工作,比方我想模型自发光,那么我就在光柵阶段,做滤镜处理!
OpenGL渲染流程:
CPU:将Fbx、Obj等模型格式 加载至 MeshRenderer。
Fbx、Obj等:模型文件 包含了UV、Vertex位置、法线、切线等渲染所需要的信息
MeshRenderer:将这些信息传递到GPU。
skin mesh renderer:带蒙皮的骨骼
mesh renderer:将UV、顶点等信息传递给GPU
mesh filter:表示将哪个模型信息传递给GPU
GPU:
渲染管线PipeLine:(有下划线的就是在Shader中的可编程部分)
顶点着色器 Vertex Shader
·计算顶点的颜色
Shader调节顶点的颜色:
_TestColor ( "TestColor", Color) = (1, 0, 0, 1)
Color (0,1,0,1)
Color[_TestColor ]
Shader 1.0 灯光计算公式:
Ambient * Lighting Window's Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission
Ambient:环境光
Diffuse:漫反射光
Specular:镜面反射
Emission:自发光
Lighting On:灯光的总开关
SeparateSpecular On:高光开关
·将物体坐标系转换到相机坐标系 - 顶点变换
·灯光的作用 (shader 1.0)
光柵化 Rasterization
·将 顶点 转换成 像素
·将 各个像素之间插值运算成片段 四个点变成一个面
片段着色器 Fragment Shader
·已经是像素点 处理像素点
像素:RGBA 4通道组成,还可以携带 模板 信息(模版值)
屏幕:720*1280 横720个像素 竖1280个像素
·纹理采样 从 纹理 像素 赋值给 像素 (图案)
·计算 像素跟灯光
(以下三个测试都通过才能决定像素点的显示)
总结:片段着色器会利用贴图、灯光等信息,为在屏幕上的面片进行着色处理。
Alpha通道测试 Alpha Test
·挑选合格(alpha)的像素显示
模板测试 Stencil Test
·达到条件的模板值
深度测试 Depth Test
·符合条件的像素就通过,不然就丢弃
混合 Blending
将当前要渲染的像素和已经渲染出来的像素混合运算
(Buffer相当于缓冲区的意思)
GBuffer
Float[ 720 * 1280 * 4]
中转区:合格通过测试的点 会把 RGBA值 模板值 深度值 等存入GBuffer。
FrontBuffer
Float[ 720 * 1280]
从GBuffer传入像素点信息,存入FrontBuffer,然后传入FrameBuffer。
FrameBuffer
Float[ 720 * 1280]
显示器
【关于顶点着色器 Vertex Shader 和片段着色器 Fragment Shader】
Vertex Shader:位置、法线、UV
Fragment Shader:贴图、光照、阴影
比如4个顶点的正方形,同时片段着色器为100*100
顶点着色器会运行4次 片段着色器会运行10000次
所以,顶点着色器 和 片段着色器 运算次数 不是一个量级。。。
所以,运算部分 优先放在顶点着色器,其次放在片段着色器
【关于GBuffer、FrontBuffer、FrameBuffer】
GBuffer选出来的像素,FrontBuffer只写入GBuffer的RGBA,推到显示器显示,之后退到后台变为FrameBuffer;
FrameBuffer同样也会只写入GBuffer的RGBA,推到显示器显示,之后退到后台变为FrontBuffer。如此交替显示,一帧一帧渲染显示,有了动画。
整个过程大致分为三个阶段:
应用程序阶段:和CPU、内存打交道,把场景中的对象的几何体数据(顶点坐标、法向量、纹理坐标、纹理)传给下一阶段。
1.碰撞检测;
2.场景图简历;
3.空间八叉树更新;
4.视锥裁剪等算法;
几何阶段 Vertex:变换和投影之后的(三角面)传给下一阶段。
1.顶点坐标变换;
2.关照;
3.投影(Perspective,Orth);
4.CVV裁剪
5.屏幕映射
6.图元装配(背面剔除、遮挡剔除、右手法则等)
光柵阶段 Pixel:像素所有权测试 Pixel Ownership Test -> 裁剪测试 Scissor Test -> Alpha通道测试 Alpha Test -> 模板测试 Stencil Test -> 深度测试 Depth Test -> 混合 Blending -> 抖动 Dithering -> 逻辑操作 Logic Op