网上看到了一些好文章,接下来全都转自 http://blog.csdn.net/u012501459/article/details/12945139 系列的,
这对于刚入门的我来说,是很好的资料,计划周日前消化完,为图形学打点基础。
OpenGL介绍
OpenGL是一种图形硬件的软件接口。它被设计成一种可以运行在多种不同硬件平台上与硬件无关的接口。
OpenGl程序也可以跨过网络工作(客户-服务器的形式),即使客户机和服务器是不同的机器类型。OpenGL中的客户机是OpenGL程序真正执行的机器,而服务器是实现渲染的机器。
OpenGL在OpenGL核心的命令前使用了前缀gl,在OpenGL工具类中的命令前使用了前缀glu。相似地,OpenGl常量都是以GL_开始的并且全部都是大写字母。OpenGL也使用后缀来指定函数的函数数目和类型。
状态机
OpenGL是一个状态机。属性和模式将保持作用效果直到它们被改变为止。大多数状态变量能使用glEnable()函数和glDisable()函数来启用和禁用。你也可以使用glIsEnabled()函数来检查一个状态现在是否被启用。你能使用glPushAttrib()函数和glPopAttrib()函数来将很多状态变量保存在一个存放属性变量的栈中或从这个栈中恢复出来。GL_ALL_ATTRIB_BITS参数能被用来保存或恢复所有的状态。栈的数目在标准OpenGL中至少有16个(使用glinfo函数检查栈最多能容纳的元素个数)。
glBegin()与glEnd()
OpenGL中有10种图元类型:GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP, 和 GL_POLYGON.
注意并不是所有的OpenGL命令都可以放置在glBegin()和glEnd()之间的。只有一部分命令可以放置在这两个函数之间,如glVertex*(),glColor*(),glNormal*(),glTexCoord*(),glMaterial*(),glCallList()等。
glFlush()与glFinish()
和计算机中的IO缓冲区比较类似,OpenGL命令并不是立即执行的。所有的命令首先被存储在缓冲区中,包括网络中的缓冲区和图形加速器自身,直到缓冲区满了才开始执行。例如,如果一个应用程序需要通过网络来执行,那么一次发送一系列的命令显然比一次只发生一个命令更加高效。
glFlush()清空这个缓冲区中的所有命令并且强迫这个命令立即执行而不需要等待缓冲区塞满。因此glFlush保证了所有OpenGL命令在调用glFlush()之后在有限的时间内会被全部执行。并且glFlush函数不会等待之间的命令执行完且有可能立即返回到你的程序中。因此,你可以很自由地发送更多的命令即使之间的命令没有被执行完。
glFinish()像glFlush函数一样刷新缓冲区并强迫命令开始执行。但是glFinish函数块会阻塞其他的OpenGL命令直到glFinish函数块中的所有命令被执行完。因此,glFinish()函数直到所有的OpenGL命令都被执行完了才会返回到你的程序中。它可能被用来同步任务或者测量某个OpenGL命令的准确的执行时间。