OpenGLES demo - 8. Pipe Line管线

原创文章,转载请注明链接 http://blog.csdn.net/hoytgm/article/details/37362777

开发者传入了一系列的点的位置,显卡是怎么把这些顶点拼成三角形,并最终渲染成屏幕上面的一个一个不同颜色的像素呢?这就是我们今天要讲的Pipe Line。这篇博文按我自己的理解,简单讲一下图形学渲染的管线吧,也就是Pipe Line。Pipe Line是每个做图形学程序员必须掌握的一个知识点,但是我这里可能不会讲的太详细,一是个人水平有限,我们还是把重点放在其他章的具体代码中吧,二是太详细的话对入门的同学们理解起来有点困难。我们的主要目的还是尽可能的多谢代码给大家展示,所以这个理论点的就快速略过~


OpenGLES、OpenGL和Direct3D,都是一个状态机。用户一系列的Disable和Enable都是在改变这个状态机的状态。在开发者发出draw的命令后,显卡就按照开发者设定好的这些状态来处理每一步的数据。

OpenGLES demo - 8. Pipe Line管线_第1张图片
这就是一个pipe line的流程。我们大概讲一下每一步都做些什么。

顶点:这个就是开发者自己设定的一堆顶点数据,在我们之前的示例中,float vertices[]就是这个顶点。这些顶点是通过glVertexAttribPointer传给OpenGLES的,同时也指定了格式。

坐标变换:在OpenGLES和OpenGL中,这里有一个名词叫做mvp,也就是model view projection的缩写,翻译过来就是模型、视点和投影变换矩阵。每个模型都是在自己的模型空间,我们需要把各个模型变换到统一的一个世界坐标中,这个就叫做世界变换,对应model。所有的物体到了世界坐标中,我们还需要把它们转换到观察者的坐标系中,也就是以观察者的眼睛作为原点的一个坐标系,这就叫做视点变换,对应view。然后我们讲视点坐标系中的物体进行投影变换,也就是把它们放入一个截锥体(Frustum)中,当我们归一化一个截锥体之后,就形成了近大远小的效果,很符合我们的观察结果,这个过程就是投影变换,对应projection。下面三张图分别就是model,view和projection的作用。在Direct3D9中,如果我们使用固定管线功能,那么就会要求用户设置三个坐标,WORLD, VIEW和PROJECT。但是在新版本的OpenGLES和OpenGL还有Direct3D的可编程管线中,我们的变换工作都是在Vertex Shader中完成,所以大家都把这三个变换合并成了一个4x4的矩阵,也就是mvp。

顶点集合:当所有的点通过了坐标变换之后,它们仍然还是点。顶点集合的工作就是按照用户之前设定的状态,比如是TRIANGLES, TRIANGLE_STRIP还是TRIANGLE_FAN等等信息,来将一个一个顶点组合成三角形。其实也就是把三个点归为一组,如果用公用点,再配置一下共用信息。

裁剪与剔除:当我们有了一个一个的三角形之后,我们还需要把那些没有在刚才提到的截锥体中的三角形去掉,如果有些三角形的一部分在截锥体里面,而另一部分在外面的话,我们就需要做裁剪工作,截掉在截锥体外面的那部分三角形。同时我们还需要剔除掉一些不需要的面,这个在我的第6章讲过。

光栅化:光栅化英文为Raster。这一步工作的主要作用是将一个一个的三角形进行像素化,直观一点,就是把三角形映射到屏幕上,在三角形里面的像素保留,不在三角形里面的像素就去掉。经过这一步之后,所有的信息就是像素了。

像素着色:这一步是在Fragment Shader中完成了,主要是对每一个像素填充颜色,贴图采样过程也在这一步完成。贴图功能我们会在后面几章使用。

Alpha测试:这一步就是对Alpha值进行测试,这个需要用户之前配置好状态。我们可能后面会讲吧。

Alpha混色:这个是在上一章讲过的,就是对每个像素进行混色操作。

深度测试:这个也是我们讲过的,如果深度测试不通过,像素就会在这一步被丢弃掉。

屏幕显示:其实在这一步之前,还有很多操作,只是被我略掉了,嘿嘿,比如Dither。。。最后的渲染结果就送到了屏幕上去显示了。


其实讲到这里,Pipe Line就基本上被浏览了一遍。讲的很简单吧。。。。。。

你可能感兴趣的:(OpenGLES)