上图主要描述了OpenGL渲染的基本流程,我们在以后处理任何图形渲染,都是依据它. 基于OpenGL 封装的框架都是也都是遵循这个图的规则.
属性:是指每一个顶点都要做改变的数据元素。顶点位置本身就是一个属性。属性多用于传输颜色数据,顶点数据,位移,纹理坐标,光照法线等。
Uniform:是一种对整个批次属性都取统一值的单一值。它是不变的。通过设置uniform变量就紧接着发送一个图元批次命令,Uniform变量实际上可以无数使用,设置一个应用 整个表面的单个颜色值,也可以设置一个时间值。每次渲染某种类型的顶点动画时修改它。
纹理:纹理数据,表现在图形以及很多图形文件格式都是以无符号字节(每个颜色通道8位)形式对颜色分量进行存储的。
Vertex Shader(顶点着色器) :主要是处理从客户机输入的数据、应用变换、进行其他的类型的数学运算来计算关照效果、位移、颜色值等。
Fragment Shader(片元着色器):主要输出我们将屏幕上看到的最终颜色值,进行颜色相关的处理。
图元组合相关的处理是不开放的,可以先忽略。
所以OpenGL的渲染流程大致为:
1.我们以数组的形式传递3个3D坐标作为图形渲染管线的输入,用来表示一个三角形,这个数组叫做顶点数据(Vertex Data);顶点数据是一系列顶点的集合。
2.顶点着色器(Vertex Shader),它把一个单独的顶点作为输入。顶点着色器主要的目的是把3D坐标转为另一种3D坐标,同时顶点着色器允许我们对顶点属性进行一些基本处理。
3.图元装配(Primitive Assembly)阶段将顶点着色器输出的所有顶点作为输入(如果是GL_POINTS,那么就是一个顶点),并所有的点装配成指定图元的形状。
4.几何着色器把图元形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状。
5.光栅化阶段(Rasterization Stage),这里它会把图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。在片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率 。
6.片段着色器的主要目的是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方。通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。
7.Alpha测试和混合(Blending)阶段,检测片段的对应的深度(和模板(Stencil))值,用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)。所以,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。
借鉴文章: