查阅过很多资料,在OpenGL的整个渲染流程中很多资料上描述的过程大致相同却又略去了很多细节,可以说是每一份资料的描述都不尽相同,或许每个作者所阐述的重点都不太相同,不存在孰对孰错
例如:《OpenGL ES 3.0编程指南》中对可编程管线的流程介绍如下:
- VBO/VAO(顶点缓冲区对象或顶点数组对象)
- VertexShader(顶点着色器)
- rasterization(光栅化)
- FragmentShader(片段着色器)
- Per-Fragment Operations(逐片段操作)
- pixelOwnershipTest(像素归属测试)
- ScissorTest(剪裁测试)
- StencilTest and DepthTest(模板和深度测试)
- Blending(混合)
- dithering(抖动)
- Frame Buffer (帧缓冲区)
又例如:《实时计算机图形学》一书中,将图形绘制管线分为三个主要阶段:应用程序阶段、几何阶段、光栅阶段
- 应用程序阶段:
- 主要和CPU、内存进行交互,在此阶段有碰撞检测、场景图建立、空间八叉树更新、视锥剪裁等算法都在此阶段执行
- 几何体数据(顶点坐标、法向量、纹理坐标、纹理等)这些信息会通过数据总线传送到图形硬件数据总线规范了一个大的集成应用系统中同构系统、异构系统等方面进行数据共享和交换实现方法。 系统间数据交换标准
- 几何阶段:
- 顶点坐标变换、光照、剪裁、投影、屏幕映射 均在GPU进行运算(顶点着色器就在此阶段执行)
- 该阶段的末端会得到经过变换和投影之后的顶点坐标、颜色、纹理坐标,这些数据将作为光栅化阶段的输入进一步处理
- 光栅阶段:
- 光栅化:决定哪些像素被集合图元覆盖的过程(其实就是将图元拆分成多个片段的过程,图元是由几个点组成的点、线、面)
- 例如:面形状的图元最少3个点(A、B、C三个点)即可组成,那么屏幕是由众多个像素点组成的,那ABC三个点围成的三角形中有多少个像素点呢?那么其实光栅化就是用来分解图元得到这些像素点的过程,当然这其中还有一个重要的过程就是插值,插值出那个图形区域的像素(纹理坐标v_texCoord、颜色等信息)。注意,此时的像素并不是屏幕上的像素,是不带有颜色的。接下来的片段着色器完成上色的工作。
- 注意:光栅化不是着色的阶段!片段着色器才是给每个像素绘制颜色的阶段,我在很多博客上都看到过错误的讲解,都有提到光栅化是上色的过程
- 着色器上色
- 光栅化:决定哪些像素被集合图元覆盖的过程(其实就是将图元拆分成多个片段的过程,图元是由几个点组成的点、线、面)
- 应用程序阶段:
以上,都是关于流程的简要过程,下面会详细的描述整个渲染流程