Opengl 渲染管线

原文地址:http://www.songho.ca/opengl/gl_pipeline.html

 

Opengl管线有一系列的有序的处理阶段。两个种图形信息被管线中被处理——基于顶点的数据和基于像素的数据,在写入帧缓存的时候结合在一起。注意opengl可以把处理过的数据送回到你的应用程序里(如灰颜色的线所示)

Opengl 渲染管线_第1张图片


Display List

显示列表是一组已经为后续执行而储存(编译)好的opengl的命令。所有的数据,几何(顶点)和像素数据,都可以被存储到显示列表里。它可能会提高性能,因为命令和数据已经缓存进显示列表内了。当opengl的程序在网络上运行的时候,你可以通过使用显示列表减少数据在网络上的传输。因为显示列表是服务器状态下的一部分,并且驻留在服务器上,客户机每次只需要发送一次命令和数据。(See more details in Display List.) 


Vertex Operation

每一个顶点和法线坐标都在这一步通过GL_MODELVIEW 矩阵转换(从物体(object)坐标系到观察(eye)坐标系)。同时,如果启用了灯光,每个顶点的光照是用已经转换过的顶点和法线数据计算的。光照计算更新顶点的颜色。(See more details in Transformation


Primitive Assembly(图元装配)

在顶点操作之后,图元(点,线和多边形)会被投影矩阵(projection matrix )再次转换,然后通过视景体剪切平面剪切,从观察坐标系到裁剪坐标系。之后,投影除法除以w,视口变换把3d的场景映射到窗口空间坐标系中,最后一步是剔除,如果剔除被启用了的话。

Clip Culling是两个步骤,前后依次完成的,第一个是指图元如果有一部分在视景体之外,则将图元分成更小的图元(只渲染视野内的图元)。Culling,如果面剔除启用的话,一些背面啊之类的就不渲染了。


Pixel Transfer Operation

客户端内存中的像素被读取之后,数据被缩放(scaling),偏移(bias),映射(mapping)和clamping(这个真不会翻译,夹紧?)。这些操作被称为像素转换操作。这些转换过的数据要么被存储在了纹理内存里,要么直接光栅化到片元。


Texture Memory

纹理图像加载进纹理内存,以应用到几何物体上。


Rasterization

光栅化是几何和像素数据到片元的转化。片元是一个矩形阵列包括颜色,深度,线宽,点大小和反锯齿计算 (GL_POINT_SMOOTH, GL_LINE_SMOOTH, GL_POLYGON_SMOOTH)。如果着色模式是 GL_FILL,那么在这一阶段多边形内部的像素会被填充。每个片元都和帧缓存中的一个像素相关。


Fragment Operation

最后一步,将片元转换成帧缓存中的像素。这一阶段的第一步是纹素(texel)生成,一个纹理元素从纹理内存中生成,然后应用到每个片元上。然后应用雾效计算,只后依次有这些片元测试——Scissor TestAlpha TestStencil TestDepth Test. 


FeedBack

Opengl可以通过glGet*() glIsEnabled()命令返回大部分的目前的状态。更进一步,你可以使用glReadPixels()从帧缓存里读取一个长方形的区域的像素数据,并且使用glRenderMode(GL_FEEDBACK)得到全部的以转换的顶点信息。glCopyPixels() 不把像素信息返回到特定的系统内存中,但是把它们拷贝到另一个帧缓存中,比如说,从front缓存到back缓存。

 

你可能感兴趣的:(opengl函数笔记,opengl)