OPengl的官方文档如下:https://www.opengl.org/sdk/docs/man4/
void glGetIntegerv( GLenum pname, GLint * data);
返回Pname所指的OPengl中的状态变量,放置在data指针的空间。
- 第一个参数,表示你要得到什么状态的值
- 第二个参数即输出这个值
说明: If glGetBooleanv is called, a floating-point (or integer) value is converted to GL_FALSE if and only if it is 0.0 (or 0). Otherwise, it is converted to GL_TRUE. If glGetIntegerv is called, boolean values are returned as GL_TRUE or GL_FALSE, and most floating-point values are rounded to the nearest integer value. Floating-point colors and normals, however, are returned with a linear mapping that maps 1.0 to the most positive representable integer value and -1.0 to the most negative representable integer value. If glGetFloatv or glGetDoublev is called, boolean values are returned as GL_TRUE or GL_FALSE, and integer values are converted to floating-point values.
pname可以有很多符号:
GL_VIEWPORT: 返回视口左上角以及尺度。(x, y, width , Height), 这个视口是GL做渲染的视口信息, 可以其信息如同:glViewport。 也可以使用glGetIntegeri_v, 返回特定的请求值。
void glClear( GLbitfield mask);
用之前函数中的glClearColor, glClearDepth, and glClearStencil.参数,清除各种缓冲。
参数:GL_COLOR_BUFFER_BIT, 重写颜色缓冲位标志;
参数:GL_DEPTH_BUFFER_BIT, 重写深度信息缓标志(Z轴)
void glFinish( void);
所有之前的Opengl命令被执行完毕后,才返回。这些命令包括:设置GL状态,连接状态,帧缓存内容等。
void glFlush( void);
在有限的时间内,强制执行之前所有的GL的命令。因为GL的所有命令或者通过网络传输,后者借助于缓存命令的加速器。所有的GL命令如果依赖于之前命令的执行结果,则需要在调用之前使用glFlush。
注意,glFlush直接返回,不等待之前的GL命令是否执行完毕。
void glEnable( GLenum cap); void glEnablei( GLenum cap, GLuint index);
void glDisable( GLenum cap); void glDisablei( GLenum cap, GLuint index);
开启或者关闭OGL服务端的功能(设置)。
参数:cap 是一个符号量,与服务端的某个功能设置相对应。
参数:index是一个服务端功能设置的索引量。
说明:可以使用 glIsEnabled or glGet两个函数来查询OGL当前功能设置的值。
GL_BLEND : {}颜色混合}功能,通过颜色缓存的值,计算颜色块的值。
GL_DEPTH_TEST:深度测试功能,如果开启,则对深度缓存进行计算更新,如果关闭,即使当前的深度缓存设定新的值,则也不更新。
GL_LINE_SMOOTH:
GL_BLEND 混合是将源色和目标色以某种方式混合生成特效的技术
说明理解:Blend 混合常用来绘制透明或半透明的物体。在混合中起关键作用的α(透明度)值实际上是将源色和目标色按给定比率进行 混合,以达到不同程度的透明。α值为0则完全透明,α值为1则完全不透明。混合操作只能在RGBA模式下进行,颜色索引模式下无法指定α值。物体的绘制顺 序会影响到OpenGL的混合处理。glEnable( GL_BLEND ); // 启用混合 glDisable( GL_BLEND ); // 禁用关闭混合
glBlendFunc( GLenum sfactor , GLenum dfactor ); // 混合函数 sfactor 源混合因子 dfactor 目标混合因子。
glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ); // 是最常使用的混合模式。
二维空间的颜色混合效果:
混合 3D 物体时,基本原理和混合2D物体一样,但需要将深度检测关闭或设置为只读。因为深度检测会剔除被遮挡的部分物体。
![]()
void glClearDepth( GLdouble depth);
void glClearDepthf( GLfloat depth);
设置一个指定值,清除深度缓存中的所有数据。默认的初始值是1.0。 设置的值在[0, 1]区间。
glPushAttrib(GL_ALL_ATTRIB_BITS);
glOrtho(left, right, bottom, top, near, far)
glOrtho是创建一个正交平行的视景体。 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况。left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他。
void glBegin(GLenummode)
void glEnd(void)
参数说明:
mode:创建图元的类型。可以是以下数值
GL_POINTS:把每一个顶点作为一个点进行处理,顶点n即定义了点n,共绘制N个点
GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段
GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段
GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,总共绘制n条线段
GL_TRIANGLES:把每个顶点作为一个独立的三角形,顶点3n-2、3n-1和3n定义了第n个三角形,总共绘制N/3个三角形
GL_TRIANGLE_STRIP:绘制一组相连的三角形,对于奇数n,顶点n、n+1和n+2定义了第n个三角形;对于偶数n,顶点n+1、n和n+2定义了第n个三角形,总共绘制N-2个三角形
GL_TRIANGLE_FAN:绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点1、n+1和n+2定义了第n个三角形,总共绘制N-2个三角形
GL_QUADS:绘制由四个顶点组成的一组单独的四边形。顶点4n-3、4n-2、4n-1和4n定义了第n个四边形。总共绘制N/4个四边形
GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n-1、2n、2n+2和2n+1定义了第n个四边形,总共绘制N/2-1个四边形
GL_POLYGON:绘制一个凸多边形。顶点1到n定义了这个多边形。
函数说明: glBegin和glEnd函数限定了一组或多组图元的定点定义。
glViewport(GLint x,GLint y,GLsizei width,GLsizei height)
参数说明:
X,Y————以像素为单位,指定了视口的左下角(在第一象限内,以(0,0)为原点的)位置。
width,height————表示这个视口矩形的宽度和高度,根据窗口的实时变化重绘窗口。函数说明:(参数的坐标是以GL中的世界坐标系来标定的:(右手坐标系),默认在Z=0平面的,且左下角为坐标原点。(必然示这样的定义参数定义内容)一旦OGL的渲染环境与一个窗口视图相关联,则默认观察视口有初始值。 省时,初始视口为(0,0,cx,cy),其中cx、cy分别为窗口的宽和高。应该使视口区的长宽比与取景体积(glOrtho或者透视图定义的的长宽比相等,否则会使显示的图象变形,另外在程序中应该及时接收窗口变化的事件,正确调整视见区。此函数影响从标准设备坐标转化为Win窗口坐标specifies the affine transformation of xx and yy from normalized device coordinates to window coordinates. Let (xnd,ynd)xndynd be normalized device coordinates. Then the window coordinates (xw,yw)xwyw are computed as follows:
xw=(xnd+1)(width2)+xxw=xnd+1width2+xyw=(ynd+1)(height2)+y
void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,
GLdouble centerx,GLdouble centery,GLdouble centerz,
GLdouble upx,GLdouble upy,GLdouble upz);
第一组eyex, eyey,eyez 相机在世界坐标的位置
第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
你把相机想象成为你自己的脑袋:第一组数据就是脑袋的位置第二组数据就是眼睛看的物体的位置第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)
通常,视点转换操作在模型转换操作之前发出(例如视点转换矩阵N,模型转换矩阵M,顶点v,结果应该为NMv,这样才能保证M先和v相乘,即模型转换先应 用在顶点上),以便模型转换先对物体发生作用。场景中物体的顶点经过模型转换之后移动到所希望的位置,然后再对场景进行视点定位等操作。模型转换和视点转 换共同构成模型视景矩阵。即 glMatrixMode(GL_MODELVIEW);
glMatrixMode(GL_MODELVIEW);
模型视图矩阵,完成两个效果,(1)将模型坐标系MC, Model Coordinate 映射到世界坐标系WC, World Coordinate,(2)将所有的世界坐标系WC中的模型映射到观察坐标系(视图坐标系)View Coordinate。
绘制场景的时候,所有的世界坐标系WC中的操作都属于模型矩阵;所有的后续裁剪等都属于视图矩阵。
所以OGL就将这两个过程合二为一,模型视图模式,完成物体到视图处理。
glTranslatef() ——模型变换函数 移动
void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
这个函数表示模型是怎样移动的。
举个例子:glTranslatef(-1.0,0.0,-2.0);//表示物体沿x负方向移动1.0,沿z轴负方向移动2.0。所以就好像能看见侧面一样
glPerspective() ——投影变换函数 透视投影
void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);
第一个参数表示在y方向上的视角度数。个人理解:比如45,表示眼睛和模型中心这个条线与y轴的夹角。
第二个参数表示纵横比。x/y。比如2表示x、y本来都是1个长度,现在x可以当两个长度用,这样,模型就好像被x方向压缩了一样。(为了防止图形被变形,需要设置为1)
后两个参数glFrustum()中后两个相近。要求都是正数。
glRotatef()——模型变换函数 旋转
void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
angle表示旋转的角度(注意单位不是弧度),(x,y,z)表示转轴。举个例子:
glRotatef(45.0, 0.0, 0.0, 1.0);//表示模型沿着(0,0,1)这个轴旋转45°。
glScalef() ——模型变换函数 缩放
void glScalef(GLfloat x, GLfloat y, GLfloat z);
模型变换的目的是设置模型的位置和方向,例如可以对模型进行旋转、移动和缩放,或者联合这几种操作。
这个函数表示模型在各轴上是如果进行缩放的。举个例子:
glScalef (1.0, 2.0, 1.0);//表示y坐标值扩大两倍,这样原本方的物体就变成长的了。
glShadeModel(GL_FLAT);
控制opengl中绘制指定两点间其他点颜色的过渡模式。参数一般为GL_SMOOTH(默认),GL_FLAT。opengl默认是将制定的两点颜色进行插值,绘制之间的其他点。
如果两点颜色不同,GL_SMOOTH会出现过渡效果,GL_FLAT 则只是以指定的某一点的单一色绘制其他所有点。
GL_SMOOTH 与 GL_FLAT的区别
![]()
glMatrixMode() 设置当前矩阵模式
GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
GL_PROJECTION,对投影矩阵应用随后的矩阵操作.GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.与glLoadIdentity()一同使用glLoadIdentity(): 将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作(1)如果参数是GL_PROJECTION就是要对投影相关进行操作,也就是把物体投影到一个平面上。接下来的语句可以是跟透视相关的函数,比如glFrustum()或gluPerspective();
在操作投影矩阵以前,需要调用函数:
glMatrixode(GL_PROJECTION); //将当前矩阵指定为投影矩阵
然后把矩阵设为单位矩阵:
glLoadIdentity();
然后调用glFrustum()或gluPerspective(),它们生成的矩阵会与当前的矩阵相乘,生成透视的效果;(2)如果参数是GL_MODELVIEW这个是对模型视景的操作,接下来的语句描绘一个以模型基础以及视图变换。以及像gluLookAt()这样的函数;(3)若是GL_TEXTURE,就是对纹理相关进行操作这几种矩阵模式可以反复切换。如:要使用透视(3D).那么先要设置透视投影
glMatrixMode(GL_PROJECTION); //切换到投影矩阵.
//...设置透视投影的命令
//设置完成后开始画图,需要切换到 模型视图矩阵 才能正确画图.
glMatrixMode(GL_MODELVIEW);
// 画一个物体A (这个时候,看起来是3D的效果,因为前面设置的透视矩阵,默认示透视投影即3D效果)
// 如这时候需画一个 2D效果的物体A,那么又需要透视投影,改后修改为正交投影。
glMatrixMode(GL_PROJECTION); //切换到投影矩阵..
// ..设置正交投影(2D效果)
//..设置完成,切换回模型视图矩阵.....
glMatrixMode(GL_MODELVIEW);
// 再画一个物体A (这个时候,看起来是2D的,因为在投影矩阵中设置了正交矩阵类型)
// 如从头到尾都是只画3D视图, 或者是只画2D视图, 只需初始化时设置一次(在MODELVIEW之前设置).
// 如果有交替,那么就需要glMatrixMode() 切换
因这样设置很烦人,所以又有glPushMatrix() 保存当前矩阵信息。
end:
www.icmzn.com