glViewport()函数
在OpenGL初始化完成之后,我们应该进行一些视图设置。首先是设定视见区域,即告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位。当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口。我们调用glViewPort函数来决定视见区域:
procedure glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei);
其中,参数X,Y指定了视见区域的左下角在窗口中的位置,一般情况下为(0,0),Width和Height指定了视见区域的宽度和高度。注意OpenGL使用的窗口坐标和WindowsGDI使用的窗口坐标是不一样的。图3.1-1表示了在WindowsGDI中的窗口坐标,而图3.1-2则是OpenGL所定义的窗口坐标。
例如,要设置如图3.1-3中的视见区域,我们应该调用函数:
glViewPort(100,100,Width,Height);
glMatrixMode()
指定哪一个矩阵是当前矩阵
C语言描述void glMatrixMode(GLenum mode)
参数mode指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值:GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE.
说明
glMatrixMode设置当前矩阵模式:
GL_MODEVIEW,对模型视景矩阵堆栈应用随后的矩阵操作。
GL_PROJECTION,对投影矩阵应用随后的矩阵操作。
GLTEXTURE,对纹理矩阵堆栈应用随后的矩阵操作。
glLoadIdentity()
该函数的功能是重置当前指定的矩阵为单位矩阵。在glLoadIdentity()之后我们为场景设置了透视图。glMatrixMode(GL_MODELVIEW)设置当前矩阵为模型视图矩阵,模弄视图矩阵储存了有关物体的信。
gluOrtho2D()
gluOrtho2D(-5.0,5.0,-5.0,5.0);
参数分别代表(左下角x坐标,右上角x坐标,左下角y坐标,右上角y坐标)——坐标全相对于窗口左下角--原点),near和far默认为-1和1,此函 数决定一个平行六面体,即View Volume! View Volume越大,里面的物体显得越小!如,一个点的坐标是(0,0,0)就是在平行六面体的中间,也就是在viewport的中间;又如一个点的坐标是(-5.0,-5.0,0),是在平行六面体的左下角,也就是在vieport的左下角。
注:viewport是指视窗的大小,就好像我们的眼睛!viweport可以用下面函数指定:glViewport(左下角x坐标, 左下角y坐标, wigth, height); ,默认是(0,0,窗口的宽度,窗口的高度)可以用gluOrtho函数来指定near和far,gluOrtho(Xmin,Xmax,Ymin,Ymax,near,far);
glTranslatef()
glTranslatef的作用就是移动坐标原点。对应的3个参数对应着3个坐标轴。如果你调用一次glTranslatef(1.0f,0.0f,0.0f)然后画一个小球,接着再调用次glTranslatef(0.0f,1.0f,0.0f)再画一个小球。此时,两个小球中,一个在另外一个正右方。所以,如果要使两个小球分别处于x、y轴,则需要在第二次画之前调用glLoadIdentity()函数,使坐标原点归位。另外,此处的坐标系为右手坐标系。
glPushMatrix() glPopMatrix()
相当于栈里的入栈和出栈。
许多人不明白的可能是入的是什么,出的又是什么。我也是自己反复做了下测试才懂的.例如你当前的坐标系原点在你电脑屏幕的左上方。现在你调用glPushMatrix,然后再调用一堆平移、旋转代码等等,然后再画图。那些平移和旋转都是基于坐上角为原点进行变化的。而且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了。那如果想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个“状态”了,这个状态就是你调用glPushMatrix之前的那个状态。就如很多opengl的书上所讲:调用glPushMatrix其实就是把当前状态做一个副本放入堆栈之中。
glRasterPos2i()
glRasterPos2i(200, 200); 改变光栅位置
光栅(Raster):由像素构成的一个矩形网格。要在光栅上显示的数据保存于帧缓存内。
glBitmap()
当设置了光栅位置后,就可以调用glBitmap()函数来显示位图数据了。这个函数形式为:
void glBitmap( GLsizei width,GLsizei height,GLfloat xbo,GLfloat ybo,GLfloat xbi,GLfloat ybi,const GLubyte *bitmap);
显示由bitmap指定的位图,bitmap是一个指向位图的指针。位图的原点放在 最近定义的当前光栅位置上。若当前光栅位置是无效的,则不显示此位图或其一部分,而且当前光栅位置仍然无效。参数width和height一象素为单位说 明位图的宽行高。宽度不一定是8的倍数。参数xbo和ybo定义位图的原点(正值时,原点向上移动;负值时,原点向下移动)。参数xbi和ybi之处在位 图光栅化后光栅位置的增量。
glReadPixels()
读取象素数据,void glReadPixels(GLint x,GLint y,GLsizesi width,GLsizei height,
GLenum format,GLenum type,GLvoid *pixel);
函数参数(x,y)定义图像区域左下角点的坐标,width和height分别是图像的高度和宽度,*pixel是一个指针,
指向存储图像数据的数组。参数format指出所读象素数据元素的格式(索引值或R、G、B、A值,如
表11-1所示),而参数type指出每个元素的数据类型(见表11-2)。
名称 象素数据类型
GL_INDEX 单个颜色索引
GL_RGB 先是红色分量,再是绿色分量,然后是蓝色分量
GL_RED 单个红色分量
GL_GREEN 单个绿色分量
GL_BLUE 单个蓝色分量
GL_ALPHA 单个Alpha值
GL_LUMINANCE_ALPHA 先是亮度分量,然后是Alpha值
GL_STENCIL_INDEX 单个的模板索引
GL_DEPTH_COMPONENT 单个深度分量
表11-1 函数glReadPixels()及glDrawPixels()的象素格式
名称 数据类型
GL_UNSIGNED_BYTE 无符号的8位整数
GL_BYTE 8位整数
GL_BITMAP 无符号的8位整数数组中的单个数位
GL_UNSIGNED_SHORT 无符号的16位整数
GL_SHORT 16位整数
GL_UNSIGNED_INT 无符号的32位整数
GL_INT 32位整数
GL_FLOAT 单精度浮点数
表11-2 函数glReadPixels()及glDrawPixels()的象素数据类型
glDrawPixels() 写入象素数据void glDrawPixels(GLsizesi width,GLsizei height,GLenum format, GLenum type,GLvoid *pixel); 函数参数format和type与glReadPixels()有相同的意义,pixel指向的数组包含所要画的象素数据。 注意,调用这个函数前必须先设置当前光栅位置,若当前光栅位置无效,则给出该函数时不画任何图形, 并且当前光栅位置仍然保持无效。 glCopyPixels() 象素拷贝函数是: void glCopyPixels(GLint x,GLint y,GLsizesi width,GLsizei height, GLenum type); 这个函数使用起来有点类似于先调用glReadPixels()函数后再调用 glDrawPixels()一样,但它不需要 将数据写到内存中去,因它只将数据写到framebuffer里。函数功能就是拷贝framebuffer 中左下角点 在(x,y)尺寸为width、height的矩形区域象素数据。数据拷贝到一个新的位置,其左下角点在当前光栅 的位置,参数type可以是GL_COLOR、GL_STENCIL、GL_DEPTH。在拷贝过程中,参数type要按如下方式 转换成format:
1)若type为GL_DEPTH或GL_STENCIL,那么format应分别是GL_DEPTH_COMPONENT或GL_STENCIL_INDEX;
2)若type为GL_COLOR,format则用GL_RGB或GL_COLOR_INDEX,这要依赖于图形系统是处于RGBA方式还是处于颜色表方式。
glPixelZoom() 一般情况下,图像的一个象素写到屏幕上时也是一个象素,但是有时也需要将图像放大或缩小,OpenGL提供了这个函数: 图像缩放 void glPixelZoom(GLfloat zoomx,GLfloat zoomy); 设置象素写操作沿X和Y方向的放大或缩小因子。缺省情况下,zoomx、zoomy都是1.0。如果它们都是2.0, 则每个图像象素被画到4个屏幕象素上面。 注意:小数形式的缩放因子和负数因子都是可以的。 glutSwapBuffers() 交换缓冲显存 在双缓冲模式下,游戏运行时占用3个图象内存区域。 其中一个是“窗口内存”。其他两个是“缓冲显存1”和“缓冲显存2”。 用glBegin()进行渲染后用glutSwapBuffers,显卡负责把“缓冲显存1”的画面复制到“窗口内存”中。 然后再用glBegin()进行渲染,画面就先渲染到“缓冲显存2”上面了。这时候显卡还在忙着把“缓冲显存1” 上的内容拷贝到“窗口内存”中呢。 所以“渲染过程”和“显示过程”两不误!
glutPostRedisplay() 如果是单线程,仅仅用postredisplay而不返回是走不到display的。 应该把这个循环拆开,循环体放在idle里。 glFrustum() glFrustum(left,right,bottom,top,near,far); 参数用来确定视角边界的各个点。
glRotatef() 物体围绕指定向量旋转指定角度 glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z) angle毋庸置疑就是旋转的角度,而x,y,z三个参数则应该看成一个整体表示一个向量,表示物体围绕向量[x,y,z]旋转。