OpengGl学习03 渲染管线
Posted 小田田_XOW
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpengGl学习03 渲染管线相关的知识,希望对你有一定的参考价值。
渲染管线(rendering pipeline):它是一系列数据处理过程,并且将应用程序的数据转换到最终渲染的图像。流程如下:
OpenGL首先接收用户提供的几何数据(顶点和几何图元),并且将他们输入到一些列着色器阶段中进行处理,包括:顶点着色、细分着色(它本身包含两个着色器),以及最后的几何着色,然后它将被送入光栅化单元(rasterizer)。光栅化单元负责对所有剪切区域(clipping region)内的图元生成片元数据,然后对每个生成的片元都执行一个片元着色器。
(1)准备向OpenGL传输数据: OpenGL需要将所有的数据都保存到缓存对象(buffer object)中,他相当于OpenGL服务端维护的一块内存区域。我们可以使用多种方式来创建这样的数据缓存,最常见的就是glBufferData()命令。
(2)将数据传输到OpenGL:当将缓存初始化完毕之后,我们可以通过OpenGL的一个绘制命令来请求渲染几何图元。如glDrawArray()就是一个常用的绘制命令。OpenGL的绘制通常是将顶点数据传输到OpenGL服务端,我们可以将一个顶点是为一个需要统一处理的数据包。这个包的数据可以是我们需要的任何数据(也就是说,我们自己负责定义构成顶点的所有数据)。其他的数据可能用来定义一个像素的最终颜色。
(3)顶点着色:对于绘制命令传输的每个顶点,OpenGL都会调用一个顶点着色器来处理顶点相关的数据。根据其他光栅化之前的着色器的活跃与否,顶点着色器可能会非常简单,例如,只是将数据复制并传递到下一个着色阶段,这叫做传递着色器(pass-through-shader);它也可能非常复杂,例如,执行大量的计算来得到顶点在屏幕上的位置(一般情况下,我们会用到变换矩阵(transformation matrix)的概念),或者通过光照的计算来判断定点的颜色,或者其他一些技法的实现。通常来说,一个复杂的应用程序可能包含多个顶点着色器,但是在同一时刻只能有一个顶点着色器起作用。
(4)细分着色:顶点着色器处理每个顶点的关联数据之后,如果同时激活了细分着色器(tessellation shader),那么它将进一步处理这些数据。细分着色器会使用Patch来描述一个物体的形状,并且使用相对简单的Patch几何体连接来完成细分工作,其结果是几何图元的数量增加,并且模型的外观会变得更为平顺。细分着色器阶段会用到两个着色器来分别管理Patch数据并生成最终的形状。
(5)几何着色:允许在光栅化之前对每个几何图元做更进一步的处理,例如创建新的图元。这个着色器阶段也是可以选的。
(6)图元装配:前面所有的着色阶段所处理的都是顶点数据,此外,这些顶点之间如何构成几何图元的所有信息也会被传递到OpenGL当中。图元装配阶段将这些顶点与相关的几何图元之间组织起来,准备下一步的剪切和光栅化工作。
(7)剪切:顶点可能会落在视口(viewport)之外——也就是我们可以进行绘制的窗口区域——此时与顶点相关的图元会做出改动,以保证相关的像素不会在视口外绘制。这一过程叫做剪切(clipping),它是由OpenGL自动完成的。
(8)光栅化:剪切之后,会将更新后的图元传递到光栅化单元,生成对应的片元。我们可以将一个片元视为一个“候选的像素”,也就是可以放置在帧缓存中的像素,但是它也可能被最终剔除,不再更新对应的像素位置。之后的两个阶段会执行片元的处理,即片元着色和逐片元的操作。
(9)片元着色:使用着色器来计算片元的最终颜色和它的深度值。片元着色器非常强大,我们可以使用纹理映射的方式,对顶点处理阶段所计算的颜色进行补充。如果我们觉得不应该继续绘制某个片元,我们还可以终止这个片元的处理,这个叫做片元的丢弃(discard)。顶点着色器与片元着色器的区别:顶点着色器(包括细分和几何着色)决定了一个图元应该位于屏幕的什么位置,而片元着色使用这些信息来决定某个片元的颜色应该是什么。
(10)逐片元的操作:在这个阶段,我们会使用深度测试(depth test 通常也称作z-buffering)和模板测试(stencil test)的方式来决定一个片元是否可见。如果一个片元通过了素有的测试,那么它就可以直接绘制到帧缓存中了,它对应的像素的颜色值(可能包括深度值)会被更新,如果开启了融合(blending)模式,那么片元的颜色会与该像素当前的颜色相叠加,形成一个新的颜色值并写入帧缓存中。
以上是关于OpengGl学习03 渲染管线的主要内容,如果未能解决你的问题,请参考以下文章