OpenGL(12)GL库API

来源:互联网 发布:面纱3.0做丝数据 编辑:程序博客网 时间:2024/05/16 06:16

/************************http://blog.csdn.net/sunboyiris*************************************/ /*一、定义扩展的有效性这个部分从扩展后缀概述开始, 然后提供关于怎样检查OpenGL 扩展可用性和一个例子程序的信息: 检查扩展可用性。㈠、扩展后缀概述OPENGL的扩展的函数的名字和记号都有一个以EXT或相关单词的首字母的后缀。例如glVertexPointerEXT()或者glColorTableSGI()。扩展的函数名本身(扩展字符串)则使用前缀,例如,SGI_color_table。下面是一个所有的前缀和后缀的详细列表:·EXT被用于那些已被不止一个开发商重复使用并得到认可的扩展。(尤以被至少两家OpenGL开发商所扶持的为典型)·SGI、 SGIS、 和SGIX被用于由Silicon Graphics公司所开发的不同类型的扩展。这些扩展可能有一部分在Silicon Graphics电脑上被限制。·WIN仅用于被微软公司所支持的扩展。㈡.如何核对OpenGL扩展的有效性所有可支持的扩展都在gl.h中有一个相应的定义,并且每个扩展在其返回的glGetString()函数中都有一个在扩展串中的标志。例如:如果顶点数组扩展(EXT_vertex_array)得到支持的话,在gl.h中它按照如下的方式定义:#define SGI_COMPILED_VERTEX_ARRAY 1GL_SGI_compiled_vertex_array在glGetString()函数返回的扩展串值中出现。在编译时,gl.h中的定义将被用来确定程序运行所要求的相应的扩展在库文件中是否存在。应用时需要做编译时的核对,比如确定GL_SGI_compiled_vertex_array已被定义;同样运行时也需要核对,比如确定GL_SGI_compiled_vertex_array在glGetString()函数返回的串值中存在。·编译时的核对核实编译环境,如程序编制时的.h文件和库文件已安装。它确保进入的要素如新的函数或者新的enums被支持。如果客户端不支持特定的扩展程序,你将无法使用它来编译或者连接一个程序。·运行时的核对核实运行环境,如库文件和服务器,它确保扩展得到OpenGL服务器和你所使用的运行时的库文件的支持。注意:有效性不只依赖于操作系统并且也有赖于你所使用的特定的硬件:即使OpenGL库文件支持GL_SGI_compiled_vertex_array,底层的硬件却未必如此。不要调用glGetString()函数除非一个描述的上下文被绑定。在类窗口式系统中,了解演示所在的机器的种类是很关键的,因为不同的窗口式系统的显示器性能不同。虽然在windows系统下这样的问题可能无足轻重,但不要因为便携性而忘记这么做。wglGetProcAddress()函数返回一个OpenGL扩展函数的地址以便与当前OpenGL描述的上下文所使用。例如:使用扩展命令glVertexPointerEXT(),一个应用程序就可以通过如下的步骤调用wglGetProcAddress()函数来获得要调用的函数的地址:1.  从头文件GL/gl.h中,为每个函数调用wglGetProcAddress()函数来获得函数指针类型的定义;typedef void (APIENRY *PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, glsizei stride, GLsizei count, const GLvoid *pointer); 2.  使用上一步骤中获得的定义来声明一个指针以存储调用wglGetProcAddress():函数的结果;PFNGLVERTEXPOINTEREXTPROC glVertexPointerEXT; glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC) wglGetProcAddress ("glVertexPointerEXT"); 3.  使用第2个步骤中声明出来的指针来执行命令:(*glVertexPointerEXT)(3, GL_FLOAT, 0, 0, data);*//* EXT_vertex_array */typedef void (APIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i);typedef void (APIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);typedef void (APIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);typedef void (APIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);typedef void (APIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);typedef void (APIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);typedef void (APIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);typedef void (APIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer);typedef void (APIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params);typedef void (APIENTRY * PFNGLARRAYELEMENTARRAYEXTPROC)(GLenum mode, GLsizei count, const GLvoid* pi);/* WIN_draw_range_elements */typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSWINPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);/* WIN_swap_hint */typedef void (APIENTRY * PFNGLADDSWAPHINTRECTWINPROC)  (GLint x, GLint y, GLsizei width, GLsizei height);/* EXT_paletted_texture */typedef void (APIENTRY * PFNGLCOLORTABLEEXTPROC)    (GLenum target, GLenum internalFormat, GLsizei width, GLenum format,     GLenum type, const GLvoid *data);typedef void (APIENTRY * PFNGLCOLORSUBTABLEEXTPROC)    (GLenum target, GLsizei start, GLsizei count, GLenum format,     GLenum type, const GLvoid *data);typedef void (APIENTRY * PFNGLGETCOLORTABLEEXTPROC)    (GLenum target, GLenum format, GLenum type, GLvoid *data);typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)    (GLenum target, GLenum pname, GLint *params);typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)    (GLenum target, GLenum pname, GLfloat *params);#ifdef __cplusplus}#endif#endif /* __GL_H__ */#endif /* __gl_h_ */





转自:http://bbs.jlu.edu.cn/cgi-bin/bbsanc?path=/groups/GROUP_2/Mechanics/D64F469E2/M.1088765005.A

发信人: MacWong (欧洲杯导致睡眠8足引发各种病症中..), 信区: Mechanics标  题: windboy的论文(工软)发信站: 吉林大学牡丹园站 (2004年07月02日18:43:30 星期五), 站内信件第三章 OPENGL在WINDOWS系统下的扩展这一部分介绍OPENGL扩展后引进的新特性和增强功能。一些扩展提供了完全崭新的功能,例如汇编好的顶点数组扩展可以允许你固定顶点数组以改善工作性能;另一些则增强了现有的功能,如纹理指针扩展允许在颜色索引模式下使用纹理映射。在这一章节中,首先学习定义一个存在的扩展(附有实例程序),其次具体讨论每个新的扩展。①定义扩展的有效性;②已汇编的顶点数组扩展;③对象空间的顶点筛选扩展;④调色板纹理扩展;⑤RGBA扩展;⑥纹理索引扩展;⑦材料索引扩展;⑧函数索引扩展;⑨数组格式索引扩展。一、定义扩展的有效性这个部分从扩展后缀概述开始, 然后提供关于怎样检查OpenGL 扩展可用性和一个例子程序的信息: 检查扩展可用性。㈠、扩展后缀概述OPENGL的扩展的函数的名字和记号都有一个以EXT或相关单词的首字母的后缀。例如glVertexPointerEXT()或者glColorTableSGI()。扩展的函数名本身(扩展字符串)则使用前缀,例如,SGI_color_table。下面是一个所有的前缀和后缀的详细列表:·EXT被用于那些已被不止一个开发商重复使用并得到认可的扩展。(尤以被至少两家OpenGL开发商所扶持的为典型)·SGI、 SGIS、 和SGIX被用于由Silicon Graphics公司所开发的不同类型的扩展。这些扩展可能有一部分在Silicon Graphics电脑上被限制。·WIN仅用于被微软公司所支持的扩展。㈡.如何核对OpenGL扩展的有效性所有可支持的扩展都在gl.h中有一个相应的定义,并且每个扩展在其返回的glGetString()函数中都有一个在扩展串中的标志。例如:如果顶点数组扩展(EXT_vertex_array)得到支持的话,在gl.h中它按照如下的方式定义:#define SGI_COMPILED_VERTEX_ARRAY 1GL_SGI_compiled_vertex_array在glGetString()函数返回的扩展串值中出现。在编译时,gl.h中的定义将被用来确定程序运行所要求的相应的扩展在库文件中是否存在。应用时需要做编译时的核对,比如确定GL_SGI_compiled_vertex_array已被定义;同样运行时也需要核对,比如确定GL_SGI_compiled_vertex_array在glGetString()函数返回的串值中存在。·编译时的核对核实编译环境,如程序编制时的.h文件和库文件已安装。它确保进入的要素如新的函数或者新的enums被支持。如果客户端不支持特定的扩展程序,你将无法使用它来编译或者连接一个程序。·运行时的核对核实运行环境,如库文件和服务器,它确保扩展得到OpenGL服务器和你所使用的运行时的库文件的支持。注意:有效性不只依赖于操作系统并且也有赖于你所使用的特定的硬件:即使OpenGL库文件支持GL_SGI_compiled_vertex_array,底层的硬件却未必如此。不要调用glGetString()函数除非一个描述的上下文被绑定。在类窗口式系统中,了解演示所在的机器的种类是很关键的,因为不同的窗口式系统的显示器性能不同。虽然在windows系统下这样的问题可能无足轻重,但不要因为便携性而忘记这么做。wglGetProcAddress()函数返回一个OpenGL扩展函数的地址以便与当前OpenGL描述的上下文所使用。例如:使用扩展命令glVertexPointerEXT(),一个应用程序就可以通过如下的步骤调用wglGetProcAddress()函数来获得要调用的函数的地址:1.  从头文件GL/gl.h中,为每个函数调用wglGetProcAddress()函数来获得函数指针类型的定义;typedef void (APIENRY *PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, glsizei stride, GLsizei count, const GLvoid *pointer); 2.  使用上一步骤中获得的定义来声明一个指针以存储调用wglGetProcAddress():函数的结果;PFNGLVERTEXPOINTEREXTPROC glVertexPointerEXT; glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC) wglGetProcAddress ("glVertexPointerEXT"); 3.  使用第2个步骤中声明出来的指针来执行命令:(*glVertexPointerEXT)(3, GL_FLOAT, 0, 0, data);㈢、程序实例:核对扩展的有效性在例子3-1中,函数QueryExtension()核对一个扩展的有效性。例3-1:核对有效性main(int argc, char* argv[]) {...    if (!QueryExtension("GL_EXT_paletted_texture")) {        fprintf(stderr, "paletted texture extension not supported.\n");         exit(1);    }...}static GLboolean QueryExtension(char *extName){    /*    ** Search for extName in the extensions string. Use of strstr()    ** is not sufficient because extension names can be prefixes of    ** other extension names. Could use strtok() but the constant    ** string returned by glGetString might be in read-only memory.    */    char *p;    char *end;    int extNameLen;       extNameLen = strlen(extName);            p = (char *)glGetString(GL_EXTENSIONS);    if (NULL == p) {        return GL_FALSE;    }    end = p + strlen(p);       while (p < end) {        int n = strcspn(p, " ");        if ((extNameLen == n) && (strncmp(extName, p, n) == 0)) {            return GL_TRUE;        }        p += (n + 1);    }    return GL_FALSE;}二、编译的顶点数组扩展SGI_compiled_vertex_array,编译的顶点数组扩展,有以下好处:·共享的顶点可以被一次转换并且可以在其后的函数(glDrawArrays(), glArrayElement(), 或者glDrawElements())调用中重复使用。·顶点数组数据可以更快地读入内存,在高速缓存过程中被软件渲染器重新排列,接着被传送至图形适配器上的局部存储器中,或者被传送至服务器内存用于间接绘制。·由于这些数据定义的非常严格以至于应用程序无法变更数据,同样应用程序也知道哪些数据可以改变而没有不合适的结果出现。换句话说,应用程序可以修改数组中未被锁定部分的数据同时保持锁定部分的数据不作改变。这一部分首先提供已汇编顶点数组扩展的概述来介绍这个扩展,然后具体探讨一些关于使用已汇编的顶点数组和列出新的函数。㈠、已汇编顶点数组扩展的概述OpenGL1.1顶点数组的功能性使得通过一个简单命令将顶点数据放入数组并使用数组中的数据块来指定复杂几何基点成为可能(详见“openGL1.1顶点数组”)。被编译的顶点数组扩展通过允许你锁定那些你认为部分需要多次被使用的数组,使得数组的使用更有效率。假设一个例子,当OpenGL绘制一个网格时会画出共顶点的三角形。因为OpenGL需要执行一定的计算,如对每个顶点的照明和变换,如果那些公共顶点可以被锁定直至所有包含这些顶点的表面被绘制出来的话就会好一些。关于这个有一个很好的实例程序,正如图3-1所示。 图3-1 已汇编的顶点数组图例这个圆柱体由上下顶面和底面和一些构成侧表面的三角形构成。因为每个三角形的夹角也正是其他几个三角形的夹角,因此每个顶点也都被使用多次,这时把顶点锁定以免光照或顶点特有的信息被重复计算就很有意义了。下面的伪代码就是一个例子:glInterleavedArrays().....)glLockArrays().....)glDrawElements (GL_TRIANGLE_STRIP).....)glDrawElements (GL_TRIANGLE_STRIP).....)glUnlockArrays()㈡、已汇编的顶点数组的使用已汇编的顶点数组扩展的使用只涉及到两个函数:·要锁定当前激活的顶点数组时,调用glLockArraysSGI()函数。当顶点数组被锁定后,OpenGL就可以编译——即变换和照明——与当前激活的数组相关联的数组数据或数据变换的结果了。·释放一个被锁定的数组,调用glUnLockArraysSGI()函数。在glLockArraysSGI()和glUnLockArraysSGI()这两个函数中,要保证由始端和计数器所指定的元素域中的数组数据没有任何改变。在glLockArraysSGI()函数和glUnlockArraysSGI()函数命令执行过程中,数组数据的更改可能以一种无序的方式影响到glDrawArrays()、glArrayElement()或 glDrawElements()命令的执行。在显示列表中不能包含glLockArraysSGI() 和 glUnlockArraysSGI()函数。如果 glDrawArrays()、glArrayElement()或glDrawElements()涉及到一个在由始端和计数器确定的元素域之外的数组,则结果不明。在已锁定和未锁定的数组间进行变换会发生执行冲突因为OpenGL需要重新使得顶点生效。㈢、新的函数void glLockArraysSGI (int first, sizei count) void glUnlockArraysSGI (void)三、对象空间顶点筛选扩展SGI_cull_vertex,对象空间顶点筛选扩展,提出了一种从对象空间中筛选顶点的办法。因为这种方法免去了许多诸如剪切和窗体变换等顶点操作,所以它能够比屏幕空间多边形筛选更有效率。这一章节首先介绍对象空间筛选是如何进行的,然后讲解一些关于如何使用对象空间顶点筛选的内容,最后列出新的函数。㈠、空间顶点筛选如何进行这个扩展是这样操作的:·OpenGL通过计算当前视线在顶点上的法向量的点积来确定每个顶点是在正面还是背面。·如果一个多边形所有的顶点被选中,则这个多边形就被筛选出来了。顶点筛选相对于表面筛选来讲是独立执行的。对象轮廓上的多边形可能既有前部的顶点也有后部的顶点。因为仅仅当多边形所有的顶点被筛选后这个多边形才恩能被选中,所以为了正确地选中轮廓上的多边形,除了顶点筛选以外你可能还得进行表面筛选。OpenGL可以在所有其他变换之前进行顶点筛选,因此只有少数的变换是必须的了——通常这将改善性能。由于对象的出射点已经被定义,所以早期的顶点筛选可以使得OpenGL免于进行窗体坐标的变换(注意:当在屏幕空间筛选时,OpenGL需要进行窗体坐标变换。)。对于网格计算和顶点计算来说这都是一个优点。顶点筛选不仅可以应用于多边形,同时也可以应用于其他元素如点和线。㈡、如何使用顶点筛选使用空间顶点筛选扩展需要两步:1.  用一个GL_CULL_VERTEX自变量调用glEnable()函数来激活顶点筛选。2.  指定筛选的视点。㈢、顶点筛选的基本应用当GL_CULL_VERTEX被激活时,OpenGL将根据顶点法线和视线方向的点积的符号把顶点分为前表面和后表面。·当点积<=0时,顶点被划分到后表面上。·当点积>0时,顶点被划分到前表面上。当被glCullFace()函数指定的表面方向被按照同样的方法确定以后,顶点就被选中了。当一个多边形所有的顶点被选中时,这个多边形就被选中了。顶点筛选时所使用的视线方向是由视点筛选出来的。视点的筛选是均一的(与光源类似)。当这些位置的w部分非空时,这个位置就是局部的并且每个顶点的视点都是通过视点减去顶点位置计算出来的。当w部分为空时,这个位置就不是局部的而是被用作所有顶点的视点。换句话说,当当前的变形是透视图时使用局部视线方向而当当前变形为正视图时使用非局部视线方向。 图3-2 顶点筛选㈣、指定选定的视点选定视点的指定与投影变换是紧密联系的。对于一个正确的结果来说,选定的视点 应当与对象空间的投影中心相对应。指定正确的位置需要一些技巧,不过通过以下的指导方针通常是可以达到目的的:·所有的模型和视图变换都在MODELVIEW栈内。·使用下面的值确定投影:①对于gFrustum(), gluPerspective()函数,有glCullParameter(GL_CULL_EYE_POSITION_SGI(0, 0, 0, 1));②当近处<远处时,对于glOrtho()函数有glCullParameter(GL_CULL_EYE_POSITION_SGI(0, 0, 1, 0));指定选定的视点需要调用glCullParameter*SGI()函数。·当pname是GL_CULL_VERTEX_EYE_POSITION_SGI时,指定的位置在视野内,并且通过当前的GL_MODELVIEW反转变换被改变。·当pname是GL_CULL_VERTEX_OBJECT_POSITION_SGI时,指定的位置在对象空间内且被直接使用。这个位置只有当屏幕固定或者GL_MODELVIEW变换可能是单一(不能倒转的)时使用。下面的一个简单例子首先指定一个观察点,然后激活顶点筛选:GLfloat viewPos[4] = {0.0, 0.0, 0.0, 1.0}glCullParameterfv(GL_CULL_EYE_POSITION_SGI, viewPose);glEnable(GL_CULL_VERTEX);㈤、新的函数void glCullParameterfvSGI (enum pname, float *params) 四、调色板纹理扩展EXT_paletted_texture,调色板纹理扩展,使你可以在过滤之前设定一个调色板来查询纹理,从效果上看相当于你提前制订了一个纹理色彩表格。为了支持调色板在OpenGL的使用,这个扩展定义了新的纹理格式和新的函数。这个扩展提供以下这些功能:·为压缩纹理图象提供简单的方法·为调色板提供纹理动画·从单一的纹理图象中获得不同的外观为了设定一个调色板纹理,你需要提供调色板色彩和一套压缩在调色板中的图形数据的索引。因为调色板纹理需要这两方面的信息,所以增加了定义一个纹理的工作量。这与你可以通过从纹理的逻辑分析分解掉多余的信息并将这些信息存入调色板进而使得全部的纹理数据工作量得以缩减的事实相互抵消了。 图3-3 调色板纹理环境与完全色彩纹理相比,调色板纹理有一些优势:·减少了所需要的总的数据量。定义一个调色板所需要的数据两比指定完全色彩纹理所需要的数据量少得多。思考一下,在一个256×256的像素格中,纹理的数据来源于256种完全不同的色彩。而完全色彩则意味着每个像素需要3字节的空间,对于纹理数据来讲就是193K字节空间。如果你把不同的色彩放在一个调色板里,每个像素只需要8位的空间,为调色板将192K字节缩减到64K又768比特。如果你在纹理中加入一个alfha通道,完全色彩表示将增加64K字节而调色板只增加256字节。这样的空间缩减对于纹理空间受到限制的系统是尤其重要的。同时由于所需要的内存减少,对于软件执行也是很有好处的。·便于重新使用数据。调色板纹理允许那些需要许多有相似但又有细微差异的色彩对象的图象方便地重新使用纹理数据。假想一个交通拥挤的公路驾驶仿真,路上所有的车都相似但是车身色彩都不同。如果使用完全色彩纹理的话,每个车身色彩配置都需要一个独立的纹理。如果使用调色板纹理的话,每辆车就可以使用同样的基本索引数据配合使用不同的调色板来改变最终的车身色彩。·调色板技巧。调色板纹理同样允许为调色板显示所开发出来的全部的调色板技巧的应用。你可以在简单的动画中、频闪、发光以及其他的调色板循环效果中使用它们。在一个使用有限数据量的场景中,所有这些技巧都可以增强视觉饱和度。调色板纹理扩展的使用要使用调色板纹理扩展,要使用下面的这些记号作为内部参数来调用glTexImage*()函数:COLOR_INDEX1_EXTCOLOR_INDEX2_EXTCOLOR_INDEX4_EXTCOLOR_INDEX8_EXTCOLOR_INDEX12_EXTCOLOR_INDEX16_EXT在调用glColorTableEXT()函数时,你同样必须定义调色板。五、BGRA扩展EXT_bgra,BGRA扩展,通过使用组件反转数据的RGBA格式提供了一种可选择的扩充了主存储器中的色彩格式。BGRA组件的次序与DirectDraw和GDI位图所构成的图象数据相匹配。在OpenGL中使用BGRA来源的图象时,使用这个扩展是最快捷简便的方法。使用这个扩展时,需要使用GL_BGRA_EXT的值作为格式参数来调用glDrawPixels()、 glGetTexImage()、 glReadPixels()和glTexImage*()函数。下面的代码段就是这个扩展使用的一个例子:/* *  draw a 32x32 pixel image at location 10, 10 using an BGRA source  *  image. "image" *should* point to a 32x32 BGRA UNSIGNED BYTE image */{    unsigned char *image;    glRasterPos2f(10, 10);    glDrawPixels(32, 32, GL_BGRA_EXT, GL_UNSIGNED_BYTE, image);}六、纹理索引扩展OpenGL 1.1提供三种纹理环境:GL_MODULATE、 GL_BLEND和GL_ REPLACE(参见“使用纹理环境的新方法”)。这些纹理环境允许一个程序使用纹理图中的值以改变(或代替)不需要用纹理着色的色彩。SGI_index_texture,纹理索引扩展支持另外两种纹理模式。同时它也允许你在颜色索引模式下使用纹理(在标准OpenGL下不可用)。这个扩展提供以下功能:·为纹理图象提供内部格式的索引·替换、添加和调整纹理环境。你可以通过一个颜色索引的内部格式来指定一个纹理调色板(与纹理对象相对应的色彩表格)。一个纹理调色板仅在满足下列条件时可以应用于纹理图象:·纹理调色板含有一个内部格式的颜色索引并且上下文由一个颜色索引渲染。·纹理调色板有一个内部格式的组件并且上下文由RGBA渲染的。当使用MIP映射时,所有的MIP映射等级必须用同样的内部格式确定。下面的例子代码就是说明该扩展如何使用的。在附录A中的“纹理索引扩展代码实例”部分有完整的例子。GLubyte texture[16] = {     0xff, 0xff, 0x00, 0x00,     0xff, 0xff, 0x00, 0x00,     0x00, 0x00, 0xff, 0xff,     0x00, 0x00, 0xff, 0xff,};glTexImage2d(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT,4, 4, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, texture);在这个例子中要注意,GL_COLOR_INDEX8_EXT是作为一个纹理内部格式使用的。另外,当纹理内部格式是颜色索引格式时,只有在“调色板纹理扩展”这一章节中被指定的使用颜色索引像素传送路径的纹理对象被加载。当扩展可用时,COLOR_INDEX,一种新的内部格式,将出现在下面三种已定义的纹理环境中:颜色索引扩展下的纹理函数基本的内部格式  替换    调整    贴画    混合    相加...                 未定义COLOR_INDEX Iv = It Iv = If * It    未定义  未定义  Iv = If + It...                 未定义七、材料索引扩展在《OpenGL编程指南》第六章“改变材质特性”的 “光照”部分讨论了首先如何调用函数glColorMaterial(),然后激活GL_COLOR_MATERIAL使得材料遵循当前的RGB色彩。SGI_index_material,材料索引扩展,允许当前索引加入为颜色索引渲染上下文的光照色彩所进行的计算。使用材料索引扩展比重新定义材料要快。在当前索引中配置一个或更多的颜色索引中的材料特性是可能的,因此它们可以遵循原先的数值。这个动作的激活和锁定是通过将GL_INDEX_MATERIAL选定为主参数后调用glEnable()或者glDisable()函数来实现的。控制选定的这些模式的命令是:void IndexMaterial (enum face, enum mode);face可以是FRONT、 BACK或者 FRONT_AND_BACK,标志着前部材料、后部材料或者前后两者兼有的部分是否都受到当前索引的影响。Mode一定是INDEX_OFFSET。这些对材料特性的变换是永久的:替换后的值只有通过送入一个新的索引或者当当前的材料索引扩展没有被激活来使得那个特定值被忽略时设定一个新的材料值才可以改变。当INDEX_MATERIAL被激活时,指定的参数总是遵循当前的索引。注意:当GL_INDEX_MATERIAL_SGI被激活时,所要生成的色彩首先将按照《OpenGL编程指南》的第六章“颜色索引模式下的照明”中“照明”部分的说明计算出来。当一个最终的颜色索引被计算出来后,系统将按照以下步骤操作:·索引被转换为一个定点的值放在一个二进制小数点未指明位数的右侧。·最近的一个定点的值被选中。·定点的值按照|index_shift|的位数进行轮换,当index_shift大于0时置于左边,反之则排在右边。·不管哪种情况下,轮换的位数总是0。·index_offset,带符号的整数偏移量被添加到索引中。·通过为这两个变量分别设定好的pname调用glMaterial()函数命令来确定 index_shift和index_offset。颜色索引的光照公式也同样被修正。受到光照的颜色索引可能会有较大的偏移,将光照和雾化效果一起使用时会比在色彩模式索引下得到更大的控制。八、索引函数扩展SGI_index_func,索引函数扩展,使你可以丢弃那些与标准值不吻合的代码段。《OpenGL编程指南》第十章中“alpha测试”部分的“帧缓冲器”内容中讨论了在RGBA模式下的alpha测试中,如何允许你接受或拒绝在其本身alpha值基础上的一段代码。索引函数扩展与此类似,不过它并不是拿一个标准值与代码段的alpha值进行比较,而是将代码段的索引部分与标准值相比对。在片操作时,这个索引校验发生在截取校验和alpha校对之间。索引函数扩展的使用要使用这个扩展,需要调用void IndexFuncSGI (GLenum func, GLclampf ref)这个函数为校对操作设定好了标准值和校对函数。标准值被严格限制在0和1之间。Func的可能的值在IndexFuncSGI参考页中有列表。要激活或锁定这个扩展时,把GL_INDEX_TEST作为主参数的值调用glEnable()或者glDisable()函数。要查明索引测试是否被激活时,使用glGetBooleanv()、 glGetIntegerv()、 glGetFloatv()或 GetDoublev()函数中的pname 参数调用glIsEnabled()函数就可以了。要找回关于这个扩展的信息,使用下面的自变量调用glGet*()函数:INDEX_TEST_FUNC INDEX_TEST_REF九、数组索引格式扩展OpenGL 1.1中的顶点数组在功能上允许你运行顶点数组、色彩数组、颜色索引数组等等,并且可以以个别、集合甚至引用一个交互数组的一部分来运行(参见“OpenGL 1.1顶点数组“)。SGI_index_array_formats,数组索引格式扩展提供了额外的指定颜色索引的数组交互格式而不是组件色彩。当当前的扩展处于激活状态时,下列标志将作为format参数被glnterleavedArrays()函数接受:GL_IUI_V2F GL_IUI_V3F GL_IUI_N3F_V2FGL_IUI_N3F_V3FGL_T2F_IUI_V2F GL_T2F_IUI_V3F GL_T2F_IUI_N3F_V2FGL_T2F_IUI_N3F_V3F--一张机,采桑陌上试春衣。风晴日暖慵无力。桃花枝上,啼莺言语,不肯放人归。 两张机,行人立马意迟迟。深心未忍轻分付。回头一笑,花间归去,只恐被花知。 三张机,吴蚕已老燕雏飞。东风宴罢长洲苑。轻绡催趁,馆娃宫女,要换舞时衣。 四张机,咿呀声里暗颦眉。回梭织朵垂莲子。盘花易绾,愁心难整,脉脉乱如丝。 五张机,横纹织就沈郎诗。中心一句无人会。不言愁恨,不言憔悴,只恁寄相思。 六张机,行行都是耍花儿。花间更有双蝴蝶。停梭一晌,闲窗影里,独自看多时。 ※ 来源:·吉林大学牡丹园站 bbs.jlu.edu.cn·[FROM: 219.217.7.*]

0 0
原创粉丝点击