Opengl渲染流程

  • 渲染流程中的三个概念阶段
  • CPU
  • 一,应用阶段
  • 1,将数据加载到现存中
  • 2,设置渲染状态
  • 3,调用Draw Call
  • GPU
  • 一,几何阶段
  • 1,顶点/片元着色器
  • 二,光栅化阶段
  • 1,逐片元操作
  • 模板测试
  • 深度测试
  • 混合



无论什么渲染流程都是从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 入门精要》