OpenGL应用编程接口文档.doc
OpenGL1 OpenGL 特点1建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。2变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。3颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。4光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。5纹理映射(Texture Mapping)。利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。6位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果。7双缓存动画(Double Buffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。从而实现了消隐算法。2 OpenGL 工作机制· 如何在OpenGL中表示3D物体· OpenGL 的渲染流水线· OpenGL中函数的命名规则 2.1 OpenGL中3D物体的表示 在3D空间中,场景是物体或模型的集合。在3D图形渲染中,所有的物体都是由三角形构成的。这是因为一个三角形可以表示一个平面,而3D物体就是由一个或多个平面构成的。比如下图表示了一个非常复杂的3D地形,它们也不过是由许许多多三角形表示的。渲染后的地形面貌复杂的地形也是由三角形构成的 因此,在OpenGL中,我们只要指定一个或多个三角形,就可以表示任意3D物体。那么如何指定三角形呢?OpenGL提供三种指定三角形的方法:即单个三角形、三角条形和三角扇形。 指定单个三角形。这是最简单,最直接的方法。即调用特定的OpenGL函数,传入三个顶点坐标,指定一个三角形。如下图:传入三个顶点(V1,V2,V3),指定一个三角形 三角条形。这种方式适合于同时绘制多个三角形,且这些三角形之间至少存在一条公共边。一个三角条形是在单个三角形的基础上,再指定一个或多个顶点。这些顶点按照次序同上一顶点一起构成一个新的三角形。下图演示了这种推进过程。指定三个顶点,确定第一个三角形指定第四个顶点,和上一三角形共享一边指定第5个顶点,继续推进 三角扇形。三角扇形中,所有顶点按照一个中心点成扇形排列。如下图,是一个以V1为中心点的三角扇形。 既然使用三角形就可以表示任何图形,为什么还要使用三角条形和三角扇形呢?这是因为在OpenGL渲染流水线中,对于每个顶点都要进行变换运算。而对于一些连接在一起的三角形组来说,使用三角条形或三角扇形就减少了顶点的数目,这意味着减少了对顶点的运算,因此提高了渲染速度。例如,上图中第三个三角扇形,该扇形描述了4个三角形。如果把这四个三角形都一一作为单个三角形传给OpenGL的话,我们需要3*4=12个顶点,而使用了三角扇形之后,我们只使用了6个顶点。这节约了一半的运算量!2.2 OpenGL 的渲染流水线 当我们把要绘制的三角形传给OpenGL之后,OpenGL还要做许多工作以完成3D空间到屏幕的投影。这一系列的过程被称为OpenGL的渲染流水线。一般地,OpenGL的渲染流程如下:2.2.1 视图变换 当一个场景确定之后,如果我们想移动某个物体,或者要实现场景内的漫游,就必须进行模型视图的变换。模型视图变换可以根据需要,移动或旋转一个或多个物体。例如,如果我们想在3D空间中沿着Z轴向前走的话,只需要把所有物体向-Z方向移动n个单位即可。如果我们要向左看,就应该把所有物体沿着Y轴渲染向右旋转N个角度。下图演示了这个过程。2.2.2 背面隐藏 在一些封闭的3D物体中,朝着物体内部的面总是不可见的。对于这些永远不可见的平面,我们可以使用背面隐藏忽略对它的绘制以提高渲染速度。为了实现背面隐藏,我们在绘制三角形的时候必须注意三角形的绕法。一般的,OpenGL默认为逆时针缠绕的面是正面。如下图所示的三角形中,如果把顶点按照V1->V3->V2的顺序传给OpenGL,那么OpenGL就会认为这个三角形朝着屏幕的面是正面。 使用背面隐藏,就要求我们在把图形传给OpenGL的时候要始终遵守正面使用逆时针绕法的规定。要开启背面隐藏的功能,只需调用函数: glEnable(GL_CULL_FACE); 当然,我们也可以改变OpenGL的设置,决定是对物体的正面还是背面进行隐藏。调用如下函数: glCullFace(GL_FRONT); 来隐藏正面,也可调用 glCullFace(GL_BACK); 来隐藏背面。2.2.3 光照渲染 如果你开启了光照渲染,并且为每个顶点指定了它的法线,在此过程中,OpenGL将根据顶点的法线和光源的位置及性质重新计算顶点的颜色。使用光照效果可以大大提高画面的真实性。2.2.4 剪裁 剪裁就是把那些不在视见空间,或者一半在可视空间中的物体剔除或剪裁,以保证不该出现在屏幕上的图形就不出现。2.2.5 投影 要把一个3D空间中的物体显示在屏幕上,就要进行投影。投影又有两种方式:平行投影和透视投影。在平行投影中,远处的物体和近处的物体是一样大的,这种投影主要运用在计算机辅助设计(CAD)上,由于这种投影没有立体感,所以一般情况下使用透视投影。在透视投影中,远处的物体会变得较小,因此在透视投影中,可视空间是一个平头截体(或台体)。下图表明了投影变换的原理。2.2.6 视见空间变换 当3D空间中的图形经过投影成为2D图形之后,我们还要把图形缩放到窗口或屏幕上。这个过程被称为视见空间变换。对于一般的游戏来说,视见空间应该是整个屏幕或窗体。但是视见空间也可以是它的子集。2.2.7 光栅化 当2D图形的所有变换都完成之后,就要把它们栅格化以显示在屏幕上,或保存为BMP图片。栅格化其实是把变换得到的2D矢量图转化为位图的过程。2.2.8 绘制 在这一步中,将由Windows GDI把光栅化的图形显示在屏幕上。2.3 OpenGL的命名规则 在OpenGL1.1库中,包含了大约300多个API函数。为了方便程序员记忆和使用,这些函数都按照一定的规则进行命名。例如,函数glVertex用于传入顶点数据,而glVertex又有glVertex2i, glVertex3f, glVertex2f, glVertex2d,glVertex3d等变种。它们各自有什么意义呢? 在函数glVertex3i中,"gl"表示当前函数属于OpenGL库。当然,此前缀如果是"glu",则表示是GLU库(OpenGL辅助库)。2.4 OpenGL与特定的平台OpenGL被设计为只有输出的,所以它只提供渲染功能。核心API没有窗口系统、音频、打印、键盘/鼠标或其它输入设备的概念。虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允许跨平台开发。然而,有些整合于原生窗口系统的东西需要允许和宿主系统交互。这通过下列附加API实现:* GLX - X11(包括透明的网络)* WGL - Microsoft Windows * AGL - Apple MacOS另外,GLUT库能够以可移植的方式提供基本的窗口功能。2.5 Window NT系统中的OpenGL使用1NT系统Windows/System32/opengl32.dll存在2在头文件内加上: #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> 3在集成环境中 Project | Settings | Link | Object/library module | "opengl32.lib glu32.lib glaux.lib" | OK4小例子(旋转的正方形)建立win32的普通工程,添入源代码如下:#include "stdafx.h"#include <stdio.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glaux.h>static GLfloat spin = 0.0;static GLfloat cx,cy;void CALLBACK renderScene() glClear(GL_COLOR_BUFFER_BIT); / 清除缓存 glPushMatrix(); / 当前矩阵压栈 glTranslated(cx,cy,0); / 移动视点 glRotatef(spin, 0.0, 0.0, 1.0); / 旋转视点 glColor3f(1.0, 0.0, 0.0); / 设置颜色 glRectf(-25.0, -25.0, 25.0, 25.0); / 绘制矩形 glPopMatrix(); / 还原当前矩阵 glFlush(); / 强制命令执行 auxSwapBuffers(); / 交换缓存,输出显示void CALLBACK changeSize(GLsizei w, GLsizei h) if (h = 0) h = 1; if (w = 0) w = 1; glViewport(0, 0, w, h); / 设置视图尺寸 cx = w/2; cy = h/2; glLoadIdentity(); if (w <= h) glOrtho(0.0, 250.0, 0.0, 250.0*h/w, 1.0, -1.0); / 设置投影矩阵 cx = 125.0; cy = 125.0*h/w; else glOrtho(0.0, 250.0*w/h, 0.0, 250.0, 1.0, -1.0); / 设置投影矩阵 cx = 125.0*w/h; cy = 125.0; void CALLBACK spinDisplay() spin += 2.0; if (spin > 360.0) spin -= 360.0; renderScene(); / 渲染输出void CALLBACK leftBtnClick(AUX_EVENTREC *event) auxIdleFunc(spinDisplay); / 左键动画void CALLBACK rightBtnClick(AUX_EVENTREC *event) auxIdleFunc(NULL); / 右键停止动画int _tmain(int argc, _TCHAR* argv) auxInitDisplayMode(AUX_SINGLE|AUX_DOUBLE); / 初始化显示模式 auxInitPosition(100,100,250,250); / 初始化显示位置 auxInitWindow(_T("My first OpenGL program"); / 初始输出化窗口 cx = 125; cy = 125; glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); / 明暗处理设置 auxReshapeFunc(changeSize); / 设置尺寸变化处理函数 auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEDOWN, leftBtnClick); / 设置鼠标左键处理函数 auxMouseFunc(AUX_RIGHTBUTTON, AUX_MOUSEDOWN, rightBtnClick); / 设置鼠标右键处理函数 auxMainLoop(renderScene); / 进入主循环 printf("Press anykey to return!"); getchar();return 0; OpenGL ES1 OpenGL 特点和桌面Windows的3D应用一样,移动设备也需要API的支持。在Windows的发展进程中,有两种互相竞争的API存在,那就是DirectX和OpenGL。而移动设备自从推出以来一直采用的是OpenGL API的派生产物,也就是OpenGL ES。OpenGL ES 1.0基本上是OpenGL 1.3子集,OpenGL ES 1.1基本上是OpenGL 1.5的子集,同时加入了一些扩展。这使得该API更加灵活,比如现在一些用不到的功能可以暂时删除,当内嵌硬件发展到一定水平后,相应的功能可以从新添加回来。目前的OpenGL ES包含两方面基本内容,Common Profile: 这个profile在移动设备如电话或PDA中完成; Common-Lite Profile: 这个限制较多,规定了运行3D图形程序所需最少的功能。这个主要针对安全性要求高的设备,它们的可靠性成了最需要考虑的东西。OpenGL ES具体特性如下:Geometry Processing - Vertex Arrays - Points, Lines, Triangles - Matrix Stack - Viewport, DepthRange - Vertex Lighting - ShadeModelRasterization - Multisampling (optional) - Points & anti-aliased points - Lines & anti-aliased lines - Polygons - Face Culling - PolygonOffset - fill modeTexture Mapping - 2D Textures - Wrap repeat, edge_clamp - Compressed Texture - TexSubImage, CopyTexImage - Multitexture - RGBA pixel and packed pixel formats, L, LA - All FiltersFragment Processing - Fog - Scissor Test - Alpha Test - Stencil Test (optional) - Depth Test (optional) - Blending - Logic Op - DitherFramebuffer Operations/Miscellaneous - Clear - ReadPixels / Alpha Test / Dither - Flush/Finish - Hint - Get-static state (constants)2 OpenGL ES与OpenGL的区别因为内嵌设备的限制,OpenGL ES不能包括很多OpenGL的多余操作,如不能在OpenGL ES使用一个表明几何形式的临时模式。因此,如下代码在OpenGL ES是无效的: glBegin (GL_TRIANGLES); glVertex3f (0,1,0); glVertex3f (-1,0,0); glVertex3f (1,0,0);glEnd();OpenGL ES从vertex数组中渲染所有的几何模型。因此如果要在OpenGL ES中渲染一个三角形,需要如下代码:const GLbyte KVertices =0,1,0,-1,0,0,1,0,0; glEnableClientState (GL_VERTEX_ARRAY);glVertexPointer (3, GL_BYTE , 0, KVertices);glDrawArrays (GL_TRIANGLES, 0, 3);和大多数没有FPU(浮点运算处理器)的设备一样,OpenGL ES profile只定义了可以接收整型数值的函数。整型运算是将浮点数用整数表示的一种技巧。当我们使用整型数时,这个整数会被分成2个部分:一个用来存储真正的整数部分,而剩余的用来存储小数部分。OpenGL ES工作在16:16的32位字节数上。它表明有16位是整数,而剩余的16位是小数。OpenGL ES还引进了GLfixed类型用来表示整型数。OpenGL ES中不存在哪些有所有的相同作用的,但有不同的缩写(如glVertex3fsidv)的函数。但是有些如glColor4fx还是存在的;OpenGL ES只支持RGBA颜色模式(你不需要选择)OpenGL ES不绘制线框或点(只绘制实心填充);无需询问OpenGL ES 1.0中的动态属性(如当前颜色);OpenGL ES去除了double类型和所有double精度相关的命令,byte,ubyte,short,ushort也不支持,common profile支持float、int和fixed,common-lite profile仅支持int和fixed;OpenGL ES Profile分为特征和扩展,扩展分为核心扩展和一般扩展,一般扩展分为必须实现的扩展和可选的扩展。凡是扩展都必须用语法分开,以便移植;核心扩展也是必须实现的,但是方法名同GL,不需要添加扩展标记;一般扩展的方法名需要添加扩展标记;OpenGL ES1.0的核心扩展有OES_byte_coordinates、 OES_fixed_point、 OES_single_precision三个,必须实现的扩展有OES_read_format、 OES_compressed_paletted_texture,可选实现的扩展有OES_query_matrix;OpenGL ES1.1的核心扩展有OES_byte_coordinates、 OES_fixed_point、 OES_single_precision、 OES_matrix_get四个,必须实现的扩展有OES_read_format、 OES_compressed_paletted_texture、 OES_point_size_array、 OES_point_sprite,可选实现的扩展有OES_matrix_palette OES_draw_texture;(OES_query_matrix已经作为Profile的元素了)3 OpenGL ES 1.1的API3.1 图元3.1.7 GL_API void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);描述:设置用于计算深度值的比例和单位参数:factor:指定用于创建每个多边形深度变量的比例因子,初始值为0;units:用于乘以具体实现的值,初始值为0;3.1.7 GL_API void GL_APIENTRY glPolygonOffsetx (GLfixed factor, GLfixed units);描述:设置用于计算深度值的比例和单位参数:factor:指定用于创建每个多边形深度变量的比例因子,初始值为0;units:用于乘以可以具体实现的最小值,初始值为0;3.2顶点数组3.1.7 GL_API void GL_APIENTRY glEnableClientState (GLenum array);描述:使能客户端具有指定的功能参数:array: 可以选择 GL_COLOR_ARRAY, GL_MATRIX_INDEX_ARRAY_OES, GL_NORMAL_ARRAY, GL_POINT_SIZE_ARRAY_ARRAY_OES, GL_TEXTURE_COORD_ARRAY, GL_VERTEX_ARRAY, and GL_WEIGHT_ARRAY_OES中的一个;3.1.7 GL_API void GL_APIENTRY glDisableClientState (GLenum array);描述:禁止客户端指定的功能参数:array: 同glEnableClientState各顶点数组设置3.1.1 GL_API void GL_APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);描述:指定一系列顶点,用于glDrawArrays 或 glDrawElements;参数:size:顶点的坐标数,必须是2,3 或 4中的一个,初始值为4;type:坐标数据类型,仅支持GL_BYTE,GL_SHORT 和 GL_FIXED,对于common profile还支持GL_FLOAT,初始值为GL_FLOAT;stride:数组内数据间的步长,单位为byte,初始值为0,0表示按照数据类型的大小;pointer:顶点数组的首指针,初始值为0;3.1.2 GL_API void GL_APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer);描述:指定法线数组参数:type:法线数据类型,仅支持GL_BYTE,GL_SHORT 和 GL_FIXED,对于common profile还支持GL_FLOAT,初始值为GL_FLOAT;stride:数组内数据间的步长,单位为byte,初始值为0,0表示按照数据类型的大小;pointer:法线数组的首指针,初始值为0;3.1.3 GL_API void GL_APIENTRY glColorPointer (GLenum type, GLsizei stride, const GLvoid *pointer);描述:指定颜色数组参数:type:法线数据类型,仅支持GL_BYTE,GL_SHORT 和 GL_FIXED,对于common profile还支持GL_FLOAT,初始值为GL_FLOAT;stride:数组内数据间的步长,单位为byte,初始值为0,0表示按照数据类型的大小;pointer:法线数组的首指针,初始值为0;3.1.4 GL_API void GL_APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);描述:指定纹理坐标数组参数:size:顶点的坐标数,必须是2,3 或 4中的一个,初始值为4;type:坐标数据类型,仅支持GL_BYTE,GL_SHORT 和 GL_FIXED,对于common profile还支持GL_FLOAT,初始值为GL_FLOAT;stride:数组内数据间的步长,单位为byte,初始值为0,0表示按照数据类型的大小;pointer:顶点数组的首指针,初始值为0;选择活动的纹理数组3.1.7 GL_API void GL_APIENTRY glClientActiveTexture (GLenum texture);描述:选择活动纹理,用于glTexCoordPointer修改属性参数:texture:纹理,必须是 GL_TEXTUREi 的一个,即0到GL_MAX_TEXTURE_UNITS;3.1.7 GL_API void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);描述:绘制顶点数组参数:mode:支持GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, and GL_TRIANGLES模式;first:数组中的起始点count:绘制的点数3.1.7 GL_API void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);描述:绘制顶点数组(索引方式)参数:mode:支持GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, and GL_TRIANGLES模式;count:待渲染的顶点个数type:GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORTindices:顶点索引3.3 对象缓存创建缓存3.1.7 GL_API void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer);描述:将一个命名缓存绑定到目标上参数:target:目标;buffer:对象缓存名称;3.1.7 GL_API void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint *buffers);描述: 删除命名对象缓存对象参数:n:指定删除的对象缓存的个数;buffers:对象缓存名称数组;3.1.7 GL_API void GL_APIENTRY glGenBuffers(GLsizei n, GLuint *buffers);描述:产生对象缓存名称参数:n:指定产生多少个对象缓存;buffers:存储返回的对象缓存名称;缓存修改3.1.7 GL_API void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);描述:创建和初始化对象缓存的数据参数:target:指定对象缓存目标,必须是GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER;size:指定数据的大小;data:指定客户端的数据源;usage:指定数据的应用模式,可以是GL_STATIC_DRAW and GL_DYNAMIC_DRAW;3.1.7 GL_API void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);描述:修改对象缓存中部分或所有的数据参数:target:指定对象缓存目标,必须是GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER;offset:指定要修改的数据偏移;size:指定要修改的数据大小;data:指定修改的数据;3.4 坐标转换矩阵操作3.1.7 GL_API void GL_APIENTRY glMatrixMode (GLenum mode);描述: 指定当前操作的矩阵,包括GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE 和 GL_MATRIX_PALETTE_OES参数:mode:GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE 和 GL_MATRIX_PALETTE_OES;3.1.7 GL_API void GL_APIENTRY glPopMatrix (void);描述:从当前堆栈中弹出矩阵3.1.7 GL_API void GL_APIENTRY glPushMatrix (void);描述:将当前矩阵压入当前堆栈,每个模式的矩阵均对应一个堆栈,GL_MODELVIEW的栈深至少16,其它的栈深至少2ModalView 变换函数3.1.7 GL_API void GL_APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);描述:沿着x,y,z方向分别平移(x,y,z),矩阵具有累积效应参数:x:x方向的平移y:y方向的平移z:z方向的平移3.1.7 GL_API void GL_APIENTRY glTranslatex (GLfixed x, GLfixed y, GLfixed z);描述:沿着x,y,z方向分别平移(x,y,z),本矩阵具有累积效应参数:x:x方向的平移y:y方向的平移z:z方向的平移3.1.7 GLAPI void APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);描述:绕着一个从原点到(x,y,z)点的方向矢量旋转angle角度,本矩阵具有累积效应参数:angle:旋转角度;x:世界坐标系中指定点的x坐标;y:世界坐标系中指定点的y坐标;z:世界坐标系中指定点的z坐标;3.1.7 GLAPI void APIENTRY glRotatex (GLfixed angle, GLfixed x, GLfixed y, GLfixed z);描述:绕着一个从原点到(x,y,z)点的方向矢量旋转angle角度,本矩阵具有累积效应参数:angle:旋转角度;x:世界坐标系中指定点的x坐标;y:世界坐标系中指定点的y坐标;z:世界坐标系中指定点的z坐标;3.1.7 GL_API void GL_APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z);描述:沿着X,Y,Z 轴分别按照比例系数进行缩放,本矩阵具有累积效应参数:x:X 轴的缩放比例;y:Y 轴的缩放比例;z:Z 轴的缩放比例;3.1.7 GL_API void GL_APIENTRY glScalex (GLfixed x, GLfixed y, GLfixed z);描述:沿着X,Y,Z 轴分别按照比例系数进行缩放,本矩阵具有累积效应参数:x:X 轴的缩放比例;y:Y 轴的缩放比例;z:Z 轴的缩放比例;GL_PROJECTION 变换函数3.1.7 GL_API void GL_APIENTRY glOrthof (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);描述:指定裁剪体的形状和大小,正交投影变换(平行六面体),具有累积效应参数:left:二维窗口最左端right:二维窗口最右端bottom:二维窗口最底端top:二维窗口最上端zNear:最大的Z值(zNear取正值)zFar:最小的Z值(zFar取负值)3.1.7 GL_API void GL_APIENTRY glOrthox (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);描述:指定裁剪体的形状和大小,正交投影变换(平行六面体),具有累积效应参数:left:二维窗口最左端right:二维窗口最右端bottom:二维窗口最底端top:二维窗口最上端zNear:最大的Z值(zNear取正值)zFar:最小的Z值(zFar取负值)3.1.7 GL_API void GL_APIENTRY glFrustumf (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);描述:指定裁剪体的形状和大小,透视投影变换,具有累积效应参数:left:二维窗口最左端right:二维窗口最右端bottom:二维窗口最底端top:二维窗口最上端zNear:最大的Z值(zNear取正值)zFar:最小的Z值(zFar取负值)3.1.7 GL_API void GL_APIENTRY glFrustumx (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);描述:指定裁剪体的形状和大小,透视投影变换,具有累积效应参数:left:二维窗口最左端right:二维窗口最右端bottom:二维窗口最底端top:二维窗口最上端zNear:最大的Z值(取正值,实际为负)zFar:最小的Z值(取正值,实际为负)变换当前矩阵3.1.7 GL_API void GL_APIENTRY glMultMatrixf (const GLfloat *m);描述:当前矩阵相乘参数:m:指向16个连续的值(即