/************************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 1
GL_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 1
GL_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_EXT
COLOR_INDEX2_EXT
COLOR_INDEX4_EXT
COLOR_INDEX8_EXT
COLOR_INDEX12_EXT
COLOR_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_V2F
GL_IUI_N3F_V3F
GL_T2F_IUI_V2F
GL_T2F_IUI_V3F
GL_T2F_IUI_N3F_V2F
GL_T2F_IUI_N3F_V3F--
一张机,采桑陌上试春衣。风晴日暖慵无力。桃花枝上,啼莺言语,不肯放人归。
两张机,行人立马意迟迟。深心未忍轻分付。回头一笑,花间归去,只恐被花知。
三张机,吴蚕已老燕雏飞。东风宴罢长洲苑。轻绡催趁,馆娃宫女,要换舞时衣。
四张机,咿呀声里暗颦眉。回梭织朵垂莲子。盘花易绾,愁心难整,脉脉乱如丝。
五张机,横纹织就沈郎诗。中心一句无人会。不言愁恨,不言憔悴,只恁寄相思。
六张机,行行都是耍花儿。花间更有双蝴蝶。停梭一晌,闲窗影里,独自看多时。 ※ 来源:·吉林大学牡丹园站 bbs.jlu.edu.cn·[FROM: 219.217.7.*]

OpenGL(12)GL库API相关推荐

  1. OpenGL中gl,glu,glut的区别

    OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库, gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包含了最基本的3D函数,而glu似乎对gl的辅 ...

  2. OpenGL实用开源库 汇总

    https://blog.csdn.net/huawenguang/article/details/1393904 https://blog.csdn.net/hbtj_1216/article/de ...

  3. 【OpenGl】openGL 诸多库之间关系 及 环境配置

    [OpenGl]openGL 诸多库之间关系 及 环境配置 最近一直在学习OpenGL,但是看OpenGL编程指南不同版本之间使用一堆不同的库,概念名称全都混搅起来了,越看越糊涂,于是整理了一下Ope ...

  4. 12.通过HTTP API对InfluxDB数据库作操作

    12.通过HTTP API对InfluxDB数据库作操作 12.1.删除表 12.2.创建库 12.3.删除库 12.4.添加数据 12.5.以文件格式添加数据 12.通过HTTP API对Influ ...

  5. 大学公众号题库API

    大学公众号题库API 本平台优点: 多题库查题.独立后台.响应速度快.全网平台可查.功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台http://chati.j ...

  6. 【STM32H7教程】第70章 STM32H7的内部Flash基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第70章       STM32H7的内部Flash基础知识和 ...

  7. 【STM32H7教程】第29章 STM32H7的USART串口基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第29章       STM32H7的USART串口基础知识和 ...

  8. 【STM32H7教程】第87章 STM32H7的SDMMC总线基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第87章       STM32H7的SDMMC总线基础知识和 ...

  9. 【STM32H7教程】第91章 STM32H7的FDCAN总线基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第91章       STM32H7的FDCAN总线基础知识和 ...

最新文章

  1. qq聊天框java_jQuery实现简单QQ聊天框
  2. 联合登陆【支付宝、网易、QQ】
  3. [WebApp]定宽网页设计下,固定宽度布局开发WebApp并实现多终端下WebApp布局自适应...
  4. python中用lxml解析html
  5. spring security源码分析之web包分析
  6. 选型java程序_Java程序员自动化指南
  7. 09 | 自编码器:让模型拥有属于自己的表达和语言
  8. CUDA并行计算 | CUDA算法效率提升关键点概述
  9. linux下的常用时间函数总结
  10. 同步异步和阻塞非阻塞
  11. 解决OpenCV3+VS2015(VS2017)运行时出现debug error abort()has been called的问题
  12. MindManager 2020注册机下载
  13. c语言运行环境的熟悉实验报告,c语言实验报告
  14. PDPS软件:机器人抓手工具运动机构制作与仿真运行测试
  15. 【初探】java性能火焰图的生成
  16. 【GameMaker 极速入门】#1环境配置
  17. 华为5g鸿蒙系统手机多少钱,华为Mate30Pro或成今年机皇:鸿蒙系统+麒麟985+5G基带,价格感人...
  18. 微服务和分布式的区别什么?有什么特点?
  19. Cisco Packet Tracer汉化
  20. 21天设计Arm芯片|移知公开课

热门文章

  1. vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置
  2. 华为钱包扫码云闪付_支持华为钱包云闪付的有几个机型
  3. 易支付对接正规银联接口教程-云闪付收银台开通全部流程
  4. 安装tesseract时Status of chi_tra: sendrequest error什么意思
  5. node.js v14.9.0以及v12.18.3两版本 百度网盘下载链接
  6. P1162 填涂颜色问题(广度优先搜索BFS)
  7. 服务器提示临时文件已满,win10系统提示”由于临时文件夹已满而导致“磁盘空间不足”错误的解决办法_win10教程_uc电脑园...
  8. 服务器装win7自动关机,Win7系统常见的3种自动关机原因及解决方法
  9. next在java中是什么意思_java中next是什么意思
  10. 电脑水冷风扇转速太高怎么调?