转载:http://www.songho.ca/opengl/gl_pipeline.html
Opengl作为图形硬件的接口.最主要的目的是将二维或三维事物渲染到帧缓存,这些事物被描述成顶点数据或是像素数据.Opengl对这些数据执行几个处理步骤,将其转化为像素,以在帧缓冲形成最终所需的图像.
![]() ![]() |
几何顶点数据
模型的顶点集、线集、多边形集
图像数据
模型的顶点集、线集、多边形集
显示列表
一组被编译的命令供以后执行使用.被编译的数据种类:顶点数据和像素数据.
显示列表是服务段的一部分状态,驻留在服务端.
客户端只需要向服务端发送一次命令和数据.
运算器
每个顶点法线坐标,使用GL_MODELVIEW矩阵进行转化.由对象坐标系转到视图坐标系.
图元组装
模型矩阵转化后,投影矩阵对图元进行二次转化,然后使用裁剪平面进行裁剪.由视图坐标系转到裁剪坐标系.利用W进行透视除法和 利用viewport将三维场景映射到窗口坐标系. 最后进行剔除测试.
图像操作
客户端像素数据被解压后,数据进行缩放、偏置、映射和夹持,这些操作都是图像操作.操作完后,数据要么进行纹理映射,要么直接栅格化转为片段.
纹理映射
纹理图像被存储到纹理内存,应用到几何对象.
光栅化
几何数据和像素数据转化为片段的过程.片段是一个矩形数组,组成是颜色,线宽,点大小,深度,抗拒计算.每一个片段对应于帧缓冲中的一个像素.
顶点操作
最后一个阶段是将片段转化为像素放入帧缓冲.第一步是有纹理内存生成纹理像素,并应用于每一个片段.然后计算雾,再然后,通过各种测试,Scissor Test ⇒ Alpha Test ⇒ Stencil Test ⇒ Depth Test.最后,进行混合,逻辑运算,位掩码,将实际像素存储在帧缓存中.
反馈
Opengl返回当前状态信息,通过命令的形式glGet*() and glIsEnabled() .更多的你可读取像素数据glReadPixels(),glCopyPixels() 等等
附加: glReadPixels() 从帧缓冲中读取像素块
void glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels )
GLint x, GLint y 指定读取第一个像素的窗口坐标,这个坐标是矩形像素块的坐下标.
GLsizei width, GLsizei height 指定矩形的大小,1的高度和宽度对应一个像素
GLenum format 指定像素的数据格式.接收以下标识:
GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE, GL_LUMINANCE_ALPHA.
GLenum type 指定像素的数据类型.接收以下识:
GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, or GL_FLOAT.
GLvoid *pixels 像素数据
注:在将像素数据放入客户机内存之前,有几个参数控制像素数据的处理。这些参数由三个命令设置:glPixelStore、glPixelTransfer和glPixelMap
glCopyPixels() 复制像素从帧缓冲
void glCopyPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type )
GLint x, GLint y 指定要复制的窗口区域的左下角窗口坐标
GLsizei width, GLsizei height 指定要复制的矩形区域尺寸
GLenum type 指定要复制的类型 颜色 深度 模板.接收的参数: GL_COLOR, GL_DEPTH, and GL_STENCIL
这个函数的行为类似于在调用glReadPixels()之后再调用glDrawPixels()