函数

对于opengl 扩展函数必须在初始化窗口结束后才能使用 wglGetProcAddress 获得

Opengl 没有重载函数,对于功能相同但参数类型和数量不同的函数加上后缀,最长可达4个,第一个字符指出有几个参数,第4个为v(如果有的话),指出函数接受一个地址做为参数

//opengl1.1版本扩展函数,用来切换纹理层,参数如下

#define GL_TEXTURE0_ARB                     0x84C0

#define GL_TEXTURE1_ARB                     0x84C1

#define GL_TEXTURE2_ARB                     0x84C2

#define GL_TEXTURE3_ARB                     0x84C3

1.void ( APIENTRY * glActiveTextureARB)( GLenum texture );

调用扩展提供的函数glActiveTextureARB()来指定当前操作的是哪一个纹理单元,在下一次调用glActiveTextureARB之前所有的函数适用于当前选定的纹理单元

glActiveTextureARB的Active不能理解为激活,使发生作用!!!应理解为选择(Select)某纹理单元(Texture Unit),即表示后续的

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, texture);

作用于此所选的纹理单元.而glEnable(GL_TEXTURE_2D)才是真正激活纹理单元的调用. 新函数 qlActiveTexture

glActiveTextureARB(GL_TEXTURE0_ARB);  // 选择TEXTURE0为设置目标

glEnable(GL_TEXTURE_2D);                    // 激活TEXTURE0单元

glBindTexture(GL_TEXTURE_2D, texture); // 为TEXTURE0单元绑定texture纹理图像

glActiveTextureARB(GL_TEXTURE1_ARB);  // 选择TEXTURE1为设置目标

glDisable(GL_TEXTURE_2D);                   // 关闭禁用TEXTURE1单元

glDrawArrays(GL_TRIANGLE_STRIP, 0, NUM_STRIP_VERTICE); // 由于TEXTURE1单元被关闭,执行此Pass渲染时只有TEXTURE0单元发生了作用。

如果,

glActiveTextureARB(GL_TEXTURE1_ARB);  // 选择TEXTURE1为设置目标

glEnable(GL_TEXTURE_2D);                     // 激活TEXTURE1单元

glBindTexture(GL_TEXTURE_2D, alphaTex); // 为TEXTURE1单元绑定alphaTex纹理图像

此时由于有2个纹理单元被激活,glDrawArrays调用将Blend两个纹理单元形成最终的画面.

2.void ( APIENTRY * glClientActiveTextureARB )( GLenum texture );

要设置纹理单元的纹理顶点数组,不能使用glActiveTextureARB,而应该使用glClientActiveTextureARB,如:

glClientActiveTextureARB(GL_TEXTURE0_ARB);

glTexCoordPointer(2, GL_FLOAT, 0, tp0);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);

关闭多重纹理:禁用所有非GL_TEXTURE0_ARB层纹理,最后激活GL_TEXTURE0_ARB纹理

glActiveTextureARB(GL_TEXTURE1_ARB);

glDisable(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE0_ARB);

glEnable(GL_TEXTURE_2D);

特别需要小心的是:既不能在glActiveTextureARB状态下使用glTexCoordPointer设置当前纹理单元的纹理坐标数组指针,更不能在glClientActiveTextureARB状态下设置当前纹理单元的非Client属性,即此时调用的glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, tex);均为无效操作.

glEnableClientState必须进入glClientActiveTextureARB状态后设置才对纹理单元有效,在外部所作设置修改不了纹理单元的设置.

对应的头文件 qgl.h : quake 中采用 q+opengl函数名 替代被使用的opengl函数

extern void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t );

/*opgl1.0版本扩展函数

为了方便指定包含多组纹理坐标的顶点数组,opengl提供了命令glClientActiveTexture。应用程序使用glTexCoordPointer()指定纹理坐标数组时,Opengl将这组纹理坐标分配给glClientActiveTexture指定的纹理单元

/*

extern void ( APIENTRY * qglActiveTextureARB )( GLenum texture );

extern void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture );

/*

*/

extern void ( APIENTRY * qglLockArraysEXT) (GLint, GLint);

extern void ( APIENTRY * qglUnlockArraysEXT) (void);

extern  void ( APIENTRY * qglAccum )(GLenum op, GLfloat value);

extern  void ( APIENTRY * qglAlphaFunc )(GLenum func, GLclampf ref);

extern  GLboolean ( APIENTRY * qglAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences);

extern  void ( APIENTRY * qglArrayElement )(GLint i);

extern  void ( APIENTRY * qglBegin )(GLenum mode);

/*

tells OpenGL to bind the named texture texture to a texture target

将纹理名字texture代表的纹理绑定到纹理目标上。

target: GL_TEXTURE_1D 或者 GL_TEXTURE_2D,代表纹理的维数

texture: 一个数字用来绑定并代表一个纹理目标。

使用它来切换纹理

*/

extern  void ( APIENTRY * qglBindTexture )(GLenum target, GLuint texture);

extern  void ( APIENTRY * qglBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);

/*

混合方程:

c = (src * sfactor) + (dst * dfactor)

参数 RGB混合因子

Alpha 混合因子

GL_ZERO

(0,0,0)

0

GL_ONE

(1,1,1)

1

GL_SRC_COLOR

(Rs,Gs,Bs)

As

GL_ONE_MINUS_SRC_COLOR

(1,1,1) - (Rs,Gs,Bs)

1 - As

GL_DST_COLOR

(Rd,Gd,Bd)

Ad

GL_ONE_MINUS_DST_COLOR

(1,1,1) - (Rd,Gd,Bd)

1-Ad

GL_SRC_ALPHA

(As,As,As)

As

GL_ONE_MINUS_SRC_ALPHA

(1,1,1) - (As,As,As)

1-As

GL_DST_ALPHA

(Ad,Ad,Ad)

Ad

GL_ONE_MINUS_DST_ALPHA

(1,1,1) - (Ad,Ad,Ad)

1-Ad

GL_SRC_ALPHA_SATURATE

(f,f,f)*

1

例如:半透明效果

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

设:

dst = (1.0f,0.0f,0.0f,0.0f)  red

src = (0.0f,0.0f,1.0f,0.3f)  blue

sfactor = 源Alpha值 = 0.3f

dfactor = 1 - 源Alpha值 = 1 - 0.3f

则最终混合后颜色:

c = (blue * 0.3f) + (red * 0.7f)

sfactor 是输入的片元颜色值混合参数。dfactor 是目前帧缓存中的像素颜色值混合参数

*/

extern  void ( APIENTRY * qglBlendFunc )(GLenum sfactor, GLenum dfactor);

extern  void ( APIENTRY * qglCallList )(GLuint list);

extern  void ( APIENTRY * qglCallLists )(GLsizei n, GLenum type, const GLvoid *lists);

/*

清空帧缓存。mask 可以设置为GL_COLOR_BUFFER_BIT 清空颜色缓存 GL_DEPTH_BUFFER_BIT 清空深度缓存 GL_STENCIL_BUFFER_BIT 清空模板缓存

例如: glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )

*/

extern  void ( APIENTRY * qglClear )(GLbitfield mask);

extern  void ( APIENTRY * qglClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);

/*

指定glClear 清空颜色缓存时使用的颜色,取值范围 0.0-1.0

例如: qglClearColor( 1, 0, 0.5, 1 )

*/

extern  void ( APIENTRY * qglClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);

/*glClearDepth 指定 glClear 函数清除深度缓存使用的深度值

当调用glClear(GL_DEPTH_BUFFER_BIT)时清空深度缓存写入深度值depth,如果不通过glClearDepth设置,默认写入最大的深度值

例如: glClearDepth( 1.0f )

*/

extern  void ( APIENTRY * qglClearDepth )(GLclampd depth);

extern  void ( APIENTRY * qglClearIndex )(GLfloat c);

extern  void ( APIENTRY * qglClearStencil )(GLint s);

extern  void ( APIENTRY * qglClipPlane )(GLenum plane, const GLdouble *equation);

extern  void ( APIENTRY * qglColor3b )(GLbyte red, GLbyte green, GLbyte blue);

extern  void ( APIENTRY * qglColor3bv )(const GLbyte *v);

extern  void ( APIENTRY * qglColor3d )(GLdouble red, GLdouble green, GLdouble blue);

extern  void ( APIENTRY * qglColor3dv )(const GLdouble *v);

extern  void ( APIENTRY * qglColor3f )(GLfloat red, GLfloat green, GLfloat blue);

extern  void ( APIENTRY * qglColor3fv )(const GLfloat *v);

extern  void ( APIENTRY * qglColor3i )(GLint red, GLint green, GLint blue);

extern  void ( APIENTRY * qglColor3iv )(const GLint *v);

extern  void ( APIENTRY * qglColor3s )(GLshort red, GLshort green, GLshort blue);

extern  void ( APIENTRY * qglColor3sv )(const GLshort *v);

extern  void ( APIENTRY * qglColor3ub )(GLubyte red, GLubyte green, GLubyte blue);

extern  void ( APIENTRY * qglColor3ubv )(const GLubyte *v);

extern  void ( APIENTRY * qglColor3ui )(GLuint red, GLuint green, GLuint blue);

extern  void ( APIENTRY * qglColor3uiv )(const GLuint *v);

extern  void ( APIENTRY * qglColor3us )(GLushort red, GLushort green, GLushort blue);

extern  void ( APIENTRY * qglColor3usv )(const GLushort *v);

extern  void ( APIENTRY * qglColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);

extern  void ( APIENTRY * qglColor4bv )(const GLbyte *v);

extern  void ( APIENTRY * qglColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);

extern  void ( APIENTRY * qglColor4dv )(const GLdouble *v);

extern  void ( APIENTRY * qglColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);

extern  void ( APIENTRY * qglColor4fv )(const GLfloat *v);

extern  void ( APIENTRY * qglColor4i )(GLint red, GLint green, GLint blue, GLint alpha);

extern  void ( APIENTRY * qglColor4iv )(const GLint *v);

extern  void ( APIENTRY * qglColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha);

extern  void ( APIENTRY * qglColor4sv )(const GLshort *v);

extern  void ( APIENTRY * qglColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);

extern  void ( APIENTRY * qglColor4ubv )(const GLubyte *v);

extern  void ( APIENTRY * qglColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha);

extern  void ( APIENTRY * qglColor4uiv )(const GLuint *v);

extern  void ( APIENTRY * qglColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha);

extern  void ( APIENTRY * qglColor4usv )(const GLushort *v);

extern  void ( APIENTRY * qglColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);

extern  void ( APIENTRY * qglColorMaterial )(GLenum face, GLenum mode);

/*提交颜色数组供OpenGL使用

size:  数据大小 . 如:4

type:  数据类型. 如:GL_UNSIGNED_BYTE ,颜色数据针对 GL_UNSIGNED_BYTE  做了优化。

stride: 如果数据是紧密连接指定其为0,否则为颜色数据之间的跨距

pointer: 数组的位置

例如:

qglColorPointer( 4,GL_UNSIGNED_BYTE,0,colors);

*/

extern  void ( APIENTRY * qglColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);

extern  void ( APIENTRY * qglCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);

extern  void ( APIENTRY * qglCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border);

extern  void ( APIENTRY * qglCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);

extern  void ( APIENTRY * qglCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);

extern  void ( APIENTRY * qglCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);

/*

OpenGl 面剔除特性根据填充图元面对的方向决定是否将其丢弃,使用前需要掉用 glEnable(GL_CULL_FACE)

mode 参数:

GL_FRONT  剔除正面

GL_BACK    剔除背面

*/

extern  void ( APIENTRY * qglCullFace )(GLenum mode);

extern  void ( APIENTRY * qglDeleteLists )(GLuint list, GLsizei range);

extern  void ( APIENTRY * qglDeleteTextures )(GLsizei n, const GLuint *textures);

/*

深度值比较,默认为 GL_LESS 如果片元窗口空间z值小于存储的在深度缓存中的值,片元将通过深度测试。

如果参数为GL_LEQUAL, 片元窗口空间z值小于或等于存储的在深度缓存中的值,片元将通过深度测试。

这在multipass中很有用。

例如: glDepthFunc( GL_LEQUAL )

*/

extern  void ( APIENTRY * qglDepthFunc )(GLenum func);

/*

调用glDepthMask(GL_FALSE);可将深度缓冲区设置为只读形式。

调用glDepthMask(GL_TRUE);可将深度缓冲区设置为可读可写形式

画透明物体时必须将深度缓冲区设置为只读形式.防止深度缓冲起作用,不画透明物体后面的物体

*/

extern  void ( APIENTRY * qglDepthMask )(GLboolean flag);

/*

深度缓冲区所存储的值范围在-1.0-1.0之间。这个函数允许把一个特定的线性深度值映射到一个标准范围的窗口z坐标。窗口z值的缺省范围是0到1,分别对应近和远裁剪平面

*/

extern  void ( APIENTRY * qglDepthRange )(GLclampd zNear, GLclampd zFar);

extern  void ( APIENTRY * qglDisable )(GLenum cap);

extern  void ( APIENTRY * qglDisableClientState )(GLenum array);

/*

只用1个函数的调用就可以替代几个函数调用:glNormal glColor glVertex 等等

mode: 指定要被渲染的图元

first: 指定从已启用数组什么位置开始

count: 表示有多少个数组元素被提取

*/

extern  void ( APIENTRY * qglDrawArrays )(GLenum mode, GLint first, GLsizei count);

/*

指定要写入的缓存,使用双缓存时,通常只绘制后缓存,并在绘制完成后交换缓存。

还可以指定要将立体图像(电子眼镜)渲染到那个缓存(GL*LEFT 和 GL*RIGHT),以及将图像渲染到辅助缓存(GL_AUXi)中

使用单缓存时,mode默认为 GL_FRONT,  使用双缓存时,mode 默认为GL_BACK

*/

extern  void ( APIENTRY * qglDrawBuffer )(GLenum mode);

/*

绘制单个Opengl图元,mode可以是任何合法的OpenGL图元类型:GL_POINTS  GL_LINES  GL_TRIANGLES

count: 要渲染的索引个数

type: 是数组indeces的数据类型

indices 是一个索引数组

例如: qglDrawElements( GL_TRIANGLES,numIndexes,GL_UNSIGNED_INT,indexes );

*/

extern  void ( APIENTRY * qglDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);

extern  void ( APIENTRY * qglDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);

extern  void ( APIENTRY * qglEdgeFlag )(GLboolean flag);

extern  void ( APIENTRY * qglEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer);

extern  void ( APIENTRY * qglEdgeFlagv )(const GLboolean *flag);

/*

设置Opengl特性的启用状态。

默认情况大多数OpenGL特性都被禁用,事实上只有两项特性默认被起用,抖动(GL_DITHER) 和多重采样(GL_MULTISMAPLE)

实际上游戏很多时候不需要抖动

GL_BLEND 混合

GL_DEPTH_TEST 深度测试

GL_LIGHTING 光照

GL_ALPHA_TEST 启用alpha测试

GL_CULL_FACE 启用面剔除

GL_TEXTURE_2D  启用2维纹理映射模式

例如: glEnable(GL_DEPTH_TEST) 启动深度测试

*/

extern  void ( APIENTRY * qglEnable )(GLenum cap);

/*

启用Opengl客户端状态:

array:

GL_VERTEX_ARRAY                 启用顶点数组

GL_NORMAL_ARRAY                启用法线数组

GL_TEXTURE_COORD_ARRAY  启用纹理坐标数组

GL_COLOR_ARRAY                   启用颜色数组

*/

extern  void ( APIENTRY * qglEnableClientState )(GLenum array);

extern  void ( APIENTRY * qglEnd )(void);

extern  void ( APIENTRY * qglEndList )(void);

extern  void ( APIENTRY * qglEvalCoord1d )(GLdouble u);

extern  void ( APIENTRY * qglEvalCoord1dv )(const GLdouble *u);

extern  void ( APIENTRY * qglEvalCoord1f )(GLfloat u);

extern  void ( APIENTRY * qglEvalCoord1fv )(const GLfloat *u);

extern  void ( APIENTRY * qglEvalCoord2d )(GLdouble u, GLdouble v);

extern  void ( APIENTRY * qglEvalCoord2dv )(const GLdouble *u);

extern  void ( APIENTRY * qglEvalCoord2f )(GLfloat u, GLfloat v);

extern  void ( APIENTRY * qglEvalCoord2fv )(const GLfloat *u);

extern  void ( APIENTRY * qglEvalMesh1 )(GLenum mode, GLint i1, GLint i2);

extern  void ( APIENTRY * qglEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);

extern  void ( APIENTRY * qglEvalPoint1 )(GLint i);

extern  void ( APIENTRY * qglEvalPoint2 )(GLint i, GLint j);

extern  void ( APIENTRY * qglFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer);

/*

The glFinish function does not return until the effects of all previously called OpenGL functions are complete. Such effects include all changes to the OpenGL state, all changes to the connection state, and all changes to the framebuffer contents.

阻塞直到Opengl 执行命令结束

*/

extern  void ( APIENTRY * qglFinish )(void);

/*

*/

extern  void ( APIENTRY * qglFlush )(void);

extern  void ( APIENTRY * qglFogf )(GLenum pname, GLfloat param);

extern  void ( APIENTRY * qglFogfv )(GLenum pname, const GLfloat *params);

extern  void ( APIENTRY * qglFogi )(GLenum pname, GLint param);

extern  void ( APIENTRY * qglFogiv )(GLenum pname, const GLint *params);

extern  void ( APIENTRY * qglFrontFace )(GLenum mode);

extern  void ( APIENTRY * qglFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);

extern  GLuint ( APIENTRY * qglGenLists )(GLsizei range);

extern  void ( APIENTRY * qglGenTextures )(GLsizei n, GLuint *textures);

extern  void ( APIENTRY * qglGetBooleanv )(GLenum pname, GLboolean *params);

extern  void ( APIENTRY * qglGetClipPlane )(GLenum plane, GLdouble *equation);

extern  void ( APIENTRY * qglGetDoublev )(GLenum pname, GLdouble *params);

/*

返回 Opengl 错误信息

GL_NO_ERROR

没有错误. 这个常量值为0

GL_INVALID_ENUM

向 Opengl 命令传递了无效的枚举值

GL_INVALID_VALUE

向 Opengl 传递的值不再允许的范围内

GL_INVALID_OPERATION

发出的Opengl 命令非法(就当前状态而言,此函数命令不合适)

GL_STACK_OVERFLOW

命令导致Opengl堆栈溢出

GL_STACK_UNDERFLOW

命令导致Opengl堆栈下溢

GL_OUT_OF_MEMORY

Opengl 无法分配足够的内存来处理命令

Opengl 错误是应用程序的bug,需要修改代码。在应用程序中,通常在初始化后面以及渲染动画中的每帧后调用glGetError().为了避免影响性能通常在非生产代码中调用它

如: assert(glGetError() == GL_NO_ERROR);

*/

extern  GLenum ( APIENTRY * qglGetError )(void);

extern  void ( APIENTRY * qglGetFloatv )(GLenum pname, GLfloat *params);

/*

查询特定的阀值

GL_MAX_TEXTURE_SIZE  查询支持的最大纹理大小

GL_MAX_TEXTURE_UNITS  查询支持的纹理单元个数 quake3 中重定义为 GL_MAX_ACTIVE_TEXTURES_ARB

GL_MAX_ELEMENTS_VRTICES  最大支持的顶点数

GL_MAX_ELEMENTS_INDICES   最大支持的索引数

GL_MAX_LIGHTS  查询支持的最大灯光数量

*/

extern  void ( APIENTRY * qglGetIntegerv )(GLenum pname, GLint *params);

extern  void ( APIENTRY * qglGetLightfv )(GLenum light, GLenum pname, GLfloat *params);

extern  void ( APIENTRY * qglGetLightiv )(GLenum light, GLenum pname, GLint *params);

extern  void ( APIENTRY * qglGetMapdv )(GLenum target, GLenum query, GLdouble *v);

extern  void ( APIENTRY * qglGetMapfv )(GLenum target, GLenum query, GLfloat *v);

extern  void ( APIENTRY * qglGetMapiv )(GLenum target, GLenum query, GLint *v);

extern  void ( APIENTRY * qglGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params);

extern  void ( APIENTRY * qglGetMaterialiv )(GLenum face, GLenum pname, GLint *params);

extern  void ( APIENTRY * qglGetPixelMapfv )(GLenum map, GLfloat *values);

extern  void ( APIENTRY * qglGetPixelMapuiv )(GLenum map, GLuint *values);

extern  void ( APIENTRY * qglGetPixelMapusv )(GLenum map, GLushort *values);

extern  void ( APIENTRY * qglGetPointerv )(GLenum pname, GLvoid* *params);

extern  void ( APIENTRY * qglGetPolygonStipple )(GLubyte *mask);

/*

查询信息

根据name的值返回不同的字符串值

GL_VENDOR: 返回OpenGL 实现的厂商

GL_VERSION:返回OpenGL 版本

GL_EXTENSISONS:返回OpenGL实现中可用的扩展

GL_RENDERER: 返回厂商特定的渲染器信息

必须具备渲染上下文时才能调用这个函数

*/

extern  const GLubyte * ( APIENTRY * qglGetString )(GLenum name);

extern  void ( APIENTRY * qglGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params);

extern  void ( APIENTRY * qglGetTexEnviv )(GLenum target, GLenum pname, GLint *params);

extern  void ( APIENTRY * qglGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params);

extern  void ( APIENTRY * qglGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params);

extern  void ( APIENTRY * qglGetTexGeniv )(GLenum coord, GLenum pname, GLint *params);

extern  void ( APIENTRY * qglGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);

extern  void ( APIENTRY * qglGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params);

extern  void ( APIENTRY * qglGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params);

extern  void ( APIENTRY * qglGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params);

extern  void ( APIENTRY * qglGetTexParameteriv )(GLenum target, GLenum pname, GLint *params);

extern  void ( APIENTRY * qglHint )(GLenum target, GLenum mode);

extern  void ( APIENTRY * qglIndexMask )(GLuint mask);

extern  void ( APIENTRY * qglIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer);

extern  void ( APIENTRY * qglIndexd )(GLdouble c);

extern  void ( APIENTRY * qglIndexdv )(const GLdouble *c);

extern  void ( APIENTRY * qglIndexf )(GLfloat c);

extern  void ( APIENTRY * qglIndexfv )(const GLfloat *c);

extern  void ( APIENTRY * qglIndexi )(GLint c);

extern  void ( APIENTRY * qglIndexiv )(const GLint *c);

extern  void ( APIENTRY * qglIndexs )(GLshort c);

extern  void ( APIENTRY * qglIndexsv )(const GLshort *c);

extern  void ( APIENTRY * qglIndexub )(GLubyte c);

extern  void ( APIENTRY * qglIndexubv )(const GLubyte *c);

extern  void ( APIENTRY * qglInitNames )(void);

extern  void ( APIENTRY * qglInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer);

extern  GLboolean ( APIENTRY * qglIsEnabled )(GLenum cap);

extern  GLboolean ( APIENTRY * qglIsList )(GLuint list);

extern  GLboolean ( APIENTRY * qglIsTexture )(GLuint texture);

extern  void ( APIENTRY * qglLightModelf )(GLenum pname, GLfloat param);

extern  void ( APIENTRY * qglLightModelfv )(GLenum pname, const GLfloat *params);

extern  void ( APIENTRY * qglLightModeli )(GLenum pname, GLint param);

extern  void ( APIENTRY * qglLightModeliv )(GLenum pname, const GLint *params);

extern  void ( APIENTRY * qglLightf )(GLenum light, GLenum pname, GLfloat param);

extern  void ( APIENTRY * qglLightfv )(GLenum light, GLenum pname, const GLfloat *params);

extern  void ( APIENTRY * qglLighti )(GLenum light, GLenum pname, GLint param);

extern  void ( APIENTRY * qglLightiv )(GLenum light, GLenum pname, const GLint *params);

extern  void ( APIENTRY * qglLineStipple )(GLint factor, GLushort pattern);

extern  void ( APIENTRY * qglLineWidth )(GLfloat width);

extern  void ( APIENTRY * qglListBase )(GLuint base);

/*

修改当前活动矩阵堆栈的栈顶,将栈顶矩阵替换为单位矩阵

*/

extern  void ( APIENTRY * qglLoadIdentity )(void);

/*

修改当前活动矩阵堆栈的栈顶,将栈顶矩阵替换为矩阵m

*/

extern  void ( APIENTRY * qglLoadMatrixd )(const GLdouble *m);

//同上

extern  void ( APIENTRY * qglLoadMatrixf )(const GLfloat *m);

extern  void ( APIENTRY * qglLoadName )(GLuint name);

extern  void ( APIENTRY * qglLogicOp )(GLenum opcode);

extern  void ( APIENTRY * qglMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);

extern  void ( APIENTRY * qglMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);

extern  void ( APIENTRY * qglMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);

extern  void ( APIENTRY * qglMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);

extern  void ( APIENTRY * qglMapGrid1d )(GLint un, GLdouble u1, GLdouble u2);

extern  void ( APIENTRY * qglMapGrid1f )(GLint un, GLfloat u1, GLfloat u2);

extern  void ( APIENTRY * qglMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);

extern  void ( APIENTRY * qglMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);

extern  void ( APIENTRY * qglMaterialf )(GLenum face, GLenum pname, GLfloat param);

extern  void ( APIENTRY * qglMaterialfv )(GLenum face, GLenum pname, const GLfloat *params);

extern  void ( APIENTRY * qglMateriali )(GLenum face, GLenum pname, GLint param);

extern  void ( APIENTRY * qglMaterialiv )(GLenum face, GLenum pname, const GLint *params);

/*

mode 可以为 GL_PROJECTION GL_MODELVIEW 或 GL_TEXTURE

选择活动矩阵堆栈:

GL_PROJECTION 选择投影矩阵堆栈

GL_MODELVIEW 选择模型视点矩阵堆栈

*/

extern  void ( APIENTRY * qglMatrixMode )(GLenum mode);

extern  void ( APIENTRY * qglMultMatrixd )(const GLdouble *m);

extern  void ( APIENTRY * qglMultMatrixf )(const GLfloat *m);

extern  void ( APIENTRY * qglNewList )(GLuint list, GLenum mode);

extern  void ( APIENTRY * qglNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz);

extern  void ( APIENTRY * qglNormal3bv )(const GLbyte *v);

extern  void ( APIENTRY * qglNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz);

extern  void ( APIENTRY * qglNormal3dv )(const GLdouble *v);

extern  void ( APIENTRY * qglNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz);

extern  void ( APIENTRY * qglNormal3fv )(const GLfloat *v);

extern  void ( APIENTRY * qglNormal3i )(GLint nx, GLint ny, GLint nz);

extern  void ( APIENTRY * qglNormal3iv )(const GLint *v);

extern  void ( APIENTRY * qglNormal3s )(GLshort nx, GLshort ny, GLshort nz);

extern  void ( APIENTRY * qglNormal3sv )(const GLshort *v);

extern  void ( APIENTRY * qglNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer);

extern  void ( APIENTRY * qglOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);

extern  void ( APIENTRY * qglPassThrough )(GLfloat token);

extern  void ( APIENTRY * qglPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values);

extern  void ( APIENTRY * qglPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values);

extern  void ( APIENTRY * qglPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values);

extern  void ( APIENTRY * qglPixelStoref )(GLenum pname, GLfloat param);

extern  void ( APIENTRY * qglPixelStorei )(GLenum pname, GLint param);

extern  void ( APIENTRY * qglPixelTransferf )(GLenum pname, GLfloat param);

extern  void ( APIENTRY * qglPixelTransferi )(GLenum pname, GLint param);

extern  void ( APIENTRY * qglPixelZoom )(GLfloat xfactor, GLfloat yfactor);

extern  void ( APIENTRY * qglPointSize )(GLfloat size);

/*

Opengl可以将填充图元渲染为线段或点。

mode 可以为 GL_POINT 绘制点 GL_LINE 绘制多边形线框 GL_FILL填充多边形

face 可以为 GL_FONT GL_BACK GL_FONT_AND_BACK 它指定用于正面图元,背面图元还是两者

glPloygonMode(GL_FONT_AND_BACK,GL_FILL)

*/

extern  void ( APIENTRY * qglPolygonMode )(GLenum face, GLenum mode);

extern  void ( APIENTRY * qglPolygonOffset )(GLfloat factor, GLfloat units);

extern  void ( APIENTRY * qglPolygonStipple )(const GLubyte *mask);

//glPopAttrib此函数未使用

extern  void ( APIENTRY * qglPopAttrib )(void);

//glPopClientAttrib 此函数未使用

extern  void ( APIENTRY * qglPopClientAttrib )(void);

extern  void ( APIENTRY * qglPopMatrix )(void);

extern  void ( APIENTRY * qglPopName )(void);

extern  void ( APIENTRY * qglPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities);

//此函数未使用

extern  void ( APIENTRY * qglPushAttrib )(GLbitfield mask);

//此函数未使用

extern  void ( APIENTRY * qglPushClientAttrib )(GLbitfield mask);

extern  void ( APIENTRY * qglPushMatrix )(void);

extern  void ( APIENTRY * qglPushName )(GLuint name);

extern  void ( APIENTRY * qglRasterPos2d )(GLdouble x, GLdouble y);

extern  void ( APIENTRY * qglRasterPos2dv )(const GLdouble *v);

extern  void ( APIENTRY * qglRasterPos2f )(GLfloat x, GLfloat y);

extern  void ( APIENTRY * qglRasterPos2fv )(const GLfloat *v);

extern  void ( APIENTRY * qglRasterPos2i )(GLint x, GLint y);

extern  void ( APIENTRY * qglRasterPos2iv )(const GLint *v);

extern  void ( APIENTRY * qglRasterPos2s )(GLshort x, GLshort y);

extern  void ( APIENTRY * qglRasterPos2sv )(const GLshort *v);

extern  void ( APIENTRY * qglRasterPos3d )(GLdouble x, GLdouble y, GLdouble z);

extern  void ( APIENTRY * qglRasterPos3dv )(const GLdouble *v);

extern  void ( APIENTRY * qglRasterPos3f )(GLfloat x, GLfloat y, GLfloat z);

extern  void ( APIENTRY * qglRasterPos3fv )(const GLfloat *v);

extern  void ( APIENTRY * qglRasterPos3i )(GLint x, GLint y, GLint z);

extern  void ( APIENTRY * qglRasterPos3iv )(const GLint *v);

extern  void ( APIENTRY * qglRasterPos3s )(GLshort x, GLshort y, GLshort z);

extern  void ( APIENTRY * qglRasterPos3sv )(const GLshort *v);

extern  void ( APIENTRY * qglRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w);

extern  void ( APIENTRY * qglRasterPos4dv )(const GLdouble *v);

extern  void ( APIENTRY * qglRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w);

extern  void ( APIENTRY * qglRasterPos4fv )(const GLfloat *v);

extern  void ( APIENTRY * qglRasterPos4i )(GLint x, GLint y, GLint z, GLint w);

extern  void ( APIENTRY * qglRasterPos4iv )(const GLint *v);

extern  void ( APIENTRY * qglRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w);

extern  void ( APIENTRY * qglRasterPos4sv )(const GLshort *v);

extern  void ( APIENTRY * qglReadBuffer )(GLenum mode);

extern  void ( APIENTRY * qglReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);

extern  void ( APIENTRY * qglRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);

extern  void ( APIENTRY * qglRectdv )(const GLdouble *v1, const GLdouble *v2);

extern  void ( APIENTRY * qglRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);

extern  void ( APIENTRY * qglRectfv )(const GLfloat *v1, const GLfloat *v2);

extern  void ( APIENTRY * qglRecti )(GLint x1, GLint y1, GLint x2, GLint y2);

extern  void ( APIENTRY * qglRectiv )(const GLint *v1, const GLint *v2);

extern  void ( APIENTRY * qglRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2);

extern  void ( APIENTRY * qglRectsv )(const GLshort *v1, const GLshort *v2);

extern  GLint ( APIENTRY * qglRenderMode )(GLenum mode);

extern  void ( APIENTRY * qglRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);

extern  void ( APIENTRY * qglRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);

extern  void ( APIENTRY * qglScaled )(GLdouble x, GLdouble y, GLdouble z);

extern  void ( APIENTRY * qglScalef )(GLfloat x, GLfloat y, GLfloat z);

/*

裁剪测试,可以定义窗口中的一个矩形区域,并将作图限制在其中。若片元部分落在该矩形区,则剪取测试通过,否则片元被删除。超出的部分不会画出

启用裁剪测试 qglEnable(GL_SCISSOR_TEST)

qglScissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight );

*/

extern  void ( APIENTRY * qglScissor )(GLint x, GLint y, GLsizei width, GLsizei height);

extern  void ( APIENTRY * qglSelectBuffer )(GLsizei size, GLuint *buffer);

/*

指定使用平滑着色还是恒定着色。mode  可以是 GL_SMOOTH 或 GL_FLAT。

默认为平滑着色,Opengl 在渲染时对顶点颜色执行插值计算

如果用GL_FLAT,一般使用最后一个顶点做为图元的颜色

qglShadeModel( GL_SMOOTH );

*/

extern  void ( APIENTRY * qglShadeModel )(GLenum mode);

extern  void ( APIENTRY * qglStencilFunc )(GLenum func, GLint ref, GLuint mask);

extern  void ( APIENTRY * qglStencilMask )(GLuint mask);

extern  void ( APIENTRY * qglStencilOp )(GLenum fail, GLenum zfail, GLenum zpass);

extern  void ( APIENTRY * qglTexCoord1d )(GLdouble s);

extern  void ( APIENTRY * qglTexCoord1dv )(const GLdouble *v);

extern  void ( APIENTRY * qglTexCoord1f )(GLfloat s);

extern  void ( APIENTRY * qglTexCoord1fv )(const GLfloat *v);

extern  void ( APIENTRY * qglTexCoord1i )(GLint s);

extern  void ( APIENTRY * qglTexCoord1iv )(const GLint *v);

extern  void ( APIENTRY * qglTexCoord1s )(GLshort s);

extern  void ( APIENTRY * qglTexCoord1sv )(const GLshort *v);

extern  void ( APIENTRY * qglTexCoord2d )(GLdouble s, GLdouble t);

extern  void ( APIENTRY * qglTexCoord2dv )(const GLdouble *v);

extern  void ( APIENTRY * qglTexCoord2f )(GLfloat s, GLfloat t);

extern  void ( APIENTRY * qglTexCoord2fv )(const GLfloat *v);

extern  void ( APIENTRY * qglTexCoord2i )(GLint s, GLint t);

extern  void ( APIENTRY * qglTexCoord2iv )(const GLint *v);

extern  void ( APIENTRY * qglTexCoord2s )(GLshort s, GLshort t);

extern  void ( APIENTRY * qglTexCoord2sv )(const GLshort *v);

extern  void ( APIENTRY * qglTexCoord3d )(GLdouble s, GLdouble t, GLdouble r);

extern  void ( APIENTRY * qglTexCoord3dv )(const GLdouble *v);

extern  void ( APIENTRY * qglTexCoord3f )(GLfloat s, GLfloat t, GLfloat r);

extern  void ( APIENTRY * qglTexCoord3fv )(const GLfloat *v);

extern  void ( APIENTRY * qglTexCoord3i )(GLint s, GLint t, GLint r);

extern  void ( APIENTRY * qglTexCoord3iv )(const GLint *v);

extern  void ( APIENTRY * qglTexCoord3s )(GLshort s, GLshort t, GLshort r);

extern  void ( APIENTRY * qglTexCoord3sv )(const GLshort *v);

extern  void ( APIENTRY * qglTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q);

extern  void ( APIENTRY * qglTexCoord4dv )(const GLdouble *v);

extern  void ( APIENTRY * qglTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q);

extern  void ( APIENTRY * qglTexCoord4fv )(const GLfloat *v);

extern  void ( APIENTRY * qglTexCoord4i )(GLint s, GLint t, GLint r, GLint q);

extern  void ( APIENTRY * qglTexCoord4iv )(const GLint *v);

extern  void ( APIENTRY * qglTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q);

extern  void ( APIENTRY * qglTexCoord4sv )(const GLshort *v);

/*

应用程序使用glTexCoorPointer()指定纹理坐标数组时,Opengl将这组纹理坐标分配给glClientActiveTexture指定的纹理单元.

定义一组纹理坐标数组,用于OpenGL的顶点数组功能

size 每个数组元素坐标数量。有效值 1-4

type 数组的数据类型.GL_FLOAT GL_INT GL_SHORT GL_DOUBLE

stride 数组坐标之间的字节偏移。0 表示数据是紧密相邻的

pointer 一个指定顶点数组的数据开始位置的指针

例如:

qglTexCoordPointer( 2, GL_FLOAT, 0, texcoords[0] );

*/

extern  void ( APIENTRY * qglTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);

/*

在进行纹理贴图时,纹理贴图可以直接贴到物体上从而覆盖物体已有的颜色,也可以和物体原有的颜色进行融合。融合是一种重要的图像处理技术,主要用于透明,发光等等效果的处理。

void glTexEnvf(GLenum target,GLenum pname,GLfloat param);

target 的参数必须是GL_TEXTURE_ENV;

pname的参数可以为GL_TEXTURE_ENV_MODE或GL_TEXTURE_ENV_COLOR;

param可以为GL_MODULATE、GL_DECAL、GL_BLEND 、GL_ADD、GL_REPLACE 等等

*/

extern  void ( APIENTRY * qglTexEnvf )(GLenum target, GLenum pname, GLfloat param);

extern  void ( APIENTRY * qglTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params);

extern  void ( APIENTRY * qglTexEnvi )(GLenum target, GLenum pname, GLint param);

extern  void ( APIENTRY * qglTexEnviv )(GLenum target, GLenum pname, const GLint *params);

extern  void ( APIENTRY * qglTexGend )(GLenum coord, GLenum pname, GLdouble param);

extern  void ( APIENTRY * qglTexGendv )(GLenum coord, GLenum pname, const GLdouble *params);

extern  void ( APIENTRY * qglTexGenf )(GLenum coord, GLenum pname, GLfloat param);

extern  void ( APIENTRY * qglTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params);

extern  void ( APIENTRY * qglTexGeni )(GLenum coord, GLenum pname, GLint param);

extern  void ( APIENTRY * qglTexGeniv )(GLenum coord, GLenum pname, const GLint *params);

extern  void ( APIENTRY * qglTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);

/*qglTexImage2D 定义一个二维纹理映射。

参数target必须是常数GL_TEXTURE_2D。

参数level表示多级分辨率的纹理图像的级数(mipmap level),若只有一种分辨率,则level设为0。Level n is the nth mipmap reduction image

参数internalformat纹理像素中存储那些分量.可以是1到4的整数,指出选择了R、G、B、A中的哪些分量用于调整和混合,1表示选择了R分量,2表示选择了R和A两个分量,3表示选择了R、G、B三个分量,4表示选择了R、G、B、A四个分量. 或者是如下的值:红色为quake3中用到的

GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_ALPHA12, GL_ALPHA16, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, GL_LUMINANCE12, GL_LUMINANCE16, GL_LUMINANCE_ALPHA, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12, GL_LUMINANCE16_ALPHA16, GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8, GL_INTENSITY12, GL_INTENSITY16, GL_R3_G3_B2, GL_RGB, GL_RGB4, GL_RGB5, GL_RGB8(24位), GL_RGB10, GL_RGB12, GL_RGB16, GL_RGBA, GL_RGBA2, GL_RGBA4(16位), GL_RGB5_A1, GL_RGBA8(32位),GL_RGB4_S3TC,GL_RGB10_A2, GL_RGBA12, or GL_RGBA16.

参数width和height给出了纹理图像的长度和宽度.

参数border为纹理边界宽度,它通常为 0

width和height必须是2n + 2(border),这里n是整数,长和宽可以有不同的值,b是border的值。

纹理映射的最大尺寸依赖于OpenGL,但它至少必须是使用64x64(若带边界为66x66),若width和height设置为0,则纹理映射有效地关闭。

参数format和type描述了输入图像数据pixels的格式和类型,它们在这里的意义与在函数glDrawPixels()中的意义相同,事实上,纹理数据与glDrawPixels()所用的数据有同样的格式。

参数format可以是GL_COLOR_INDEX、GL_RGB、GL_RGBA、GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_LUMINANCE或GL_LUMINANCE_ALPHA(注意:不能用GL_STENCIL_INDEX和GL_DEPTH_COMPONENT)。

参数type是GL_BYPE、GL_UNSIGNED_BYTE、GL_SHORT、 GL_UNSIGNED_SHORT、GL_INT、GL_UNSIGNED_INT、GL_FLOAT或GL_BITMAP。  0-255RGBA 类型数据 对应GL_UNSIGNED_BYTE 类型 。

参数pixels 指向纹理图像数据,A pointer to the image data in memory。

例子: qglTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );

如果低于 opengl 1.4 glTexImage2D 不支持自动 mipmap . 且没有手动设置mipmap。既对不同level指定纹理数据

设置纹理滤波时只能使用 GL_LINEAR.否则没有图像显示

qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );

qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

*/

extern  void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);

/*滤波

设置如何将纹理图像的纹理对应到屏幕上的像素;当纹理图像较大或较小时,怎样通过纹理贴图实现纹理缩放和重复。

void glTexParameterf(GLenum target,GLenum pname,GLfloat param);

target 的参数可以为GL_TEXTURE_1D(1维纹理)和GL_TEXTURE_2D(2维纹理), GL_TEXTURE_3D(3维纹理) 或 GL_TEXTURE_CUBE_MAP

pname 的参数可以为: GL_TEXTURE_MAG_FILTER (指定放大滤波)或 GL_TEXTURE_MIN_FILTER(指定缩小滤波)

pname

含义

param常用值

GL_TEXTURE_MIN_FILTER

一个像素对应多个纹素.

放大滤波

GL_NEAREST 使用坐标离像素中心最近的纹理像素,最近点采样

GL_LINEAR  离像素坐标中心2x2纹理像素,线性插值

GL_NEAREST_MIPMAP_NEAREST 使用1个mipmap最近点采样

GL_LINEAR_MIPMAP_NEAREST 使用1个mipmap取线性插值

GL_NEAREST_MIPMAP_LINEAR 从2个mipmap最近点采样,进行线性插质

GL_LINEAR_MIPMAP_LINEAR  三线性过滤:从 2个mipmap 线性插值取得2个点后,然后在两个值之间进行线性插值

GL_TEXTURE_MAG_FILTER

多个像素对应一个纹素

缩小滤波

GL_NEAREST

GL_LINEAR

GL_TEXTURE_WRAP_S

设置纹理在s方向上的被控行为纹理环绕方式

GL_CLAMP

GL_REPEAT

GL_TEXTURE_WRAP_T

设置纹理在t方向上的被控行为:纹理环绕方式

GL_CLAMP

GL_REPEAT

GL_TEXTURE_BORDER_COLOR

设置边界颜色

 

*/

extern  void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param);

extern  void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params);

extern  void ( APIENTRY * qglTexParameteri )(GLenum target, GLenum pname, GLint param);

extern  void ( APIENTRY * qglTexParameteriv )(GLenum target, GLenum pname, const GLint *params);

extern  void ( APIENTRY * qglTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);

extern  void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);

extern  void ( APIENTRY * qglTranslated )(GLdouble x, GLdouble y, GLdouble z);

extern  void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z);

extern  void ( APIENTRY * qglVertex2d )(GLdouble x, GLdouble y);

extern  void ( APIENTRY * qglVertex2dv )(const GLdouble *v);

extern  void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y);

extern  void ( APIENTRY * qglVertex2fv )(const GLfloat *v);

extern  void ( APIENTRY * qglVertex2i )(GLint x, GLint y);

extern  void ( APIENTRY * qglVertex2iv )(const GLint *v);

extern  void ( APIENTRY * qglVertex2s )(GLshort x, GLshort y);

extern  void ( APIENTRY * qglVertex2sv )(const GLshort *v);

extern  void ( APIENTRY * qglVertex3d )(GLdouble x, GLdouble y, GLdouble z);

extern  void ( APIENTRY * qglVertex3dv )(const GLdouble *v);

extern  void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z);

extern  void ( APIENTRY * qglVertex3fv )(const GLfloat *v);

extern  void ( APIENTRY * qglVertex3i )(GLint x, GLint y, GLint z);

extern  void ( APIENTRY * qglVertex3iv )(const GLint *v);

extern  void ( APIENTRY * qglVertex3s )(GLshort x, GLshort y, GLshort z);

extern  void ( APIENTRY * qglVertex3sv )(const GLshort *v);

extern  void ( APIENTRY * qglVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w);

extern  void ( APIENTRY * qglVertex4dv )(const GLdouble *v);

extern  void ( APIENTRY * qglVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w);

extern  void ( APIENTRY * qglVertex4fv )(const GLfloat *v);

extern  void ( APIENTRY * qglVertex4i )(GLint x, GLint y, GLint z, GLint w);

extern  void ( APIENTRY * qglVertex4iv )(const GLint *v);

extern  void ( APIENTRY * qglVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w);

extern  void ( APIENTRY * qglVertex4sv )(const GLshort *v);

/*

提交顶点数组供opengl使用

size    数据大小,发送3d顶点时指定为: 3.  范围2,3,4

type   要提交的数据类型,通常为GL_FLOAT

stride  如果数据是紧密相连的,将stride指定为0。否则指定为顶点间的跨距,单位为字节。

pointer 指向数据或者缓存对象中的偏移量

typedef float vec4_t[4];

vec4_t xyzw[1000];

例如: glVertexPointer(3,GL_FLOAT,16,xyzw) //只需要3个顶点,但数据是16位包含xyzw

*/

extern  void ( APIENTRY * qglVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);

/*

规一化设备坐标到窗口坐标

qglViewport( 0, 0, 640, 480);

*/

extern  void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height);

extern  int   ( WINAPI * qwglChoosePixelFormat )(HDC, CONST PIXELFORMATDESCRIPTOR *);

extern  int   ( WINAPI * qwglDescribePixelFormat) (HDC, int, UINT, LPPIXELFORMATDESCRIPTOR);

extern  int   ( WINAPI * qwglGetPixelFormat)(HDC);

extern  BOOL  ( WINAPI * qwglSetPixelFormat)(HDC, int, CONST PIXELFORMATDESCRIPTOR *);

extern  BOOL  ( WINAPI * qwglSwapBuffers)(HDC);

extern BOOL  ( WINAPI * qwglGetDeviceGammaRamp3DFX)( HDC, LPVOID );

extern BOOL  ( WINAPI * qwglSetDeviceGammaRamp3DFX)( HDC, LPVOID );

extern BOOL  ( WINAPI * qwglCopyContext)(HGLRC, HGLRC, UINT);

extern HGLRC ( WINAPI * qwglCreateContext)(HDC);

extern HGLRC ( WINAPI * qwglCreateLayerContext)(HDC, int);

extern BOOL  ( WINAPI * qwglDeleteContext)(HGLRC);

extern HGLRC ( WINAPI * qwglGetCurrentContext)(VOID);

extern HDC   ( WINAPI * qwglGetCurrentDC)(VOID);

extern PROC  ( WINAPI * qwglGetProcAddress)(LPCSTR);

extern BOOL  ( WINAPI * qwglMakeCurrent)(HDC, HGLRC);

extern BOOL  ( WINAPI * qwglShareLists)(HGLRC, HGLRC);

extern BOOL  ( WINAPI * qwglUseFontBitmaps)(HDC, DWORD, DWORD, DWORD);

extern BOOL  ( WINAPI * qwglUseFontOutlines)(HDC, DWORD, DWORD, DWORD, FLOAT,

FLOAT, int, LPGLYPHMETRICSFLOAT);

extern BOOL ( WINAPI * qwglDescribeLayerPlane)(HDC, int, int, UINT,

LPLAYERPLANEDESCRIPTOR);

extern int  ( WINAPI * qwglSetLayerPaletteEntries)(HDC, int, int, int,

CONST COLORREF *);

extern int  ( WINAPI * qwglGetLayerPaletteEntries)(HDC, int, int, int,

COLORREF *);

extern BOOL ( WINAPI * qwglRealizeLayerPalette)(HDC, int, BOOL);

extern BOOL ( WINAPI * qwglSwapLayerBuffers)(HDC, UINT);

/*

开启或关闭垂直同步。关闭垂直同步可以提高FPS

水平同步信号,显示设备(显示器)接收到这个信号后,就开始画下一行。

垂直同步信号,显示设备(显示器)接收到这个信号后,就开始画下一帧。

*/

extern BOOL ( WINAPI * qwglSwapIntervalEXT)( int interval );

没有使用 gluLookAt 函数。相机使用默认位置的方向。默认情况下,相机位于原点,镜头指向z轴负方向,向上向量为(0,1,0)

总结

1.glActiveTextureARB的Active不能理解为激活,使发生作用!!!
应理解为选择(Select)某纹理单元(Texture Unit),即表示后续的glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texture);作用于此所选的纹理单元.而glEnable(GL_TEXTURE_2D)才是真正激活纹理单元的调用.

glActiveTextureARB(GL_TEXTURE0_ARB);  // 选择TEXTURE0为设置目标 
glEnable(GL_TEXTURE_2D);        // 激活TEXTURE0单元
glBindTexture(GL_TEXTURE_2D, texture); // 为TEXTURE0单元绑定texture纹理图像
 
glActiveTextureARB(GL_TEXTURE1_ARB);  // 选择TEXTURE1为设置目标
glDisable(GL_TEXTURE_2D);        // 关闭禁用TEXTURE1单元
 
glDrawArrays(GL_TRIANGLE_STRIP, 0, NUM_STRIP_VERTICE); // 由于TEXTURE1单元被关闭,执行此Pass渲染时只有TEXTURE0单元发生了作用。

如果,
glActiveTextureARB(GL_TEXTURE1_ARB);  // 选择TEXTURE1为设置目标
glEnable(GL_TEXTURE_2D);        // 激活TEXTURE1单元
glBindTexture(GL_TEXTURE_2D, alphaTex); // 为TEXTURE1单元绑定alphaTex纹理图像
此时由于有2个纹理单元被激活,glDrawArrays调用将Blend两个纹理单元形成最终的画面.

2.要设置纹理单元的纹理顶点数组,不能使用glActiveTextureARB,而应该使用glClientActiveTextureARB,如:
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glTexCoordPointer(2, GL_FLOAT, 0, tp0); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

3.使用多重纹理一般都必须激活glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

4.关闭多重纹理:禁用所有非GL_TEXTURE0_ARB层纹理,最后激活GL_TEXTURE0_ARB纹理
glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_TEXTURE_2D);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);

5.特别需要小心的是:既不能在glActiveTextureARB状态下使用glTexCoordPointer设置当前纹理单元的纹理坐标数组指针,更不能在glClientActiveTextureARB状态下设置当前纹理单元的非Client属性,即此时调用的glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, tex);均为无效操作.
glEnableClientState必须进入glClientActiveTextureARB状态后设置才对纹理单元有效,在外部所作设置修改不了纹理单元的设置.

参考:www.cnitblog.com/linghuye/archive/2005/08/13/1856.aspx

OpenGL多重纹理使用与理解相关推荐

  1. windows下opengl多重纹理贴图

    参考:http://blog.sina.com.cn/s/blog_4a082449010138kt.html 转自:http://www.cnblogs.com/waytofall/archive/ ...

  2. C++ Opengl 多重纹理源码

    C++ Opengl 多重纹理源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方 ...

  3. OpenGL Multi Texture多重纹理的实例

    OpenGL Multi Texture多重纹理 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #define USE_GL3W #include <ver ...

  4. OpenGL蓝宝书源码学习(二十三)第七章——MultiTexture多重纹理

    在上一节CubeMap的基础上新增了一个纹理贴图实现多重纹理. // MultiTexture.cpp // OpenGL SuperBible // Demonstrates applying a ...

  5. GLSL着色器实现多重纹理与帧缓冲对象(FBO)

    还记得我前面几篇博客上写的东西都是将纹理直接渲染到屏幕上,就是产生一个和纹理尺寸大小相同的窗口进行渲染,那么渲染完了就正好完整的显示了纹理图案.但是在做数值计算的时候,一般是不需要输出到屏幕上的,这就 ...

  6. threejs 纹理流动_Threejs多重纹理与过程纹理实现

    Author--------------- Yen 多数时候同一图元是采用单一纹理,但是为了增强显示效果,会存在同一图元多个纹理图的情况,效果比如只有灯光照射的时候才会显示其他图案,其他没有被照射到的 ...

  7. 多重纹理和纹理组合器

    多重纹理和纹理组合器 本文主要介绍OpenGL中两种技术的使用方法:多重纹理技术和纹理组合器技术,最终根据参考[2]中的代码,实现了两个简单的演示DEMO,其中使用到了<八叉树颜色量化.BMP. ...

  8. opengl多重纹理映射

    关于多重纹理: 首先如果一个显卡支持多重纹理,表示它可以将几次渲染合为一次来进行,在这个渲染过程中,你可以在不同的纹理单元分别放入第0次,第1次,第2次需要渲染的对象.当程序向屏幕绘图时,将这些渲染结 ...

  9. GL和DX中关于纹理操作(包括多重纹理)与混合的问题

    以前看OPENGL的时候就没有彻底搞懂纹理操作到底是怎么实现的.最近看龙书又看到纹理操作了.看来这个问题不解决不行啊.于是研究一番,略有心得,在此记下以备不时之需. 先搞清楚,目标像素就是已经存在帧缓 ...

最新文章

  1. 类似百度输入框自动完成
  2. 如何在私服上传jar包
  3. ccs读取dat文件c语言程序,TMS320DM642学习----第六篇(CCS中.dat文件类型详解)
  4. split出现得问题
  5. BZOJ3597 SCOI2014方伯伯运椰子(分数规划+spfa)
  6. linux 临时文件 清理,Linux临时文件的清理
  7. 数据库的相关语句(where,order by)
  8. 电影'社交网络'获金球奖最佳影片,最佳编剧,最佳导演,最佳配乐奖
  9. php 数组添加键值对,php 给数组增加键值对
  10. 电视html转vga没有声音,怎样才能让HDMI转VGA连接电视能播放声音?
  11. 如何更改IE窗口初始大小及位置
  12. 安全策略篇 安全策略发展历程详解
  13. VB中数组的大小排序解析
  14. 香港美食攻略(3)——源记喳咋
  15. 复制链接到safari浏览器打开_苹果手机把链接复制到浏览器打不开也下载不了这怎么回事...
  16. 图像处理(3):深度学习之图像分类(垃圾分类案例)
  17. su oracle是什么意思,su 命令 以及 su oracle 与su - oracle 命令区别
  18. SRE重案调查组 第二集 | 挖掘应用处理变慢的“真相”
  19. java 判断文件是否存在
  20. oracle fal_server,ORACLE DG环境FAL参数的作用 | 信春哥,系统稳,闭眼上线不回滚!...

热门文章

  1. 推挽电路介绍、设计与分析
  2. 真的羡慕玉自寒和烈如歌的爱情
  3. vue创建一个简易版高德地铁路线图
  4. 这六大方法,如何让 Transformer 轻松应对高难度长文本序列?
  5. Linux IO体系、零拷贝和虚拟内存关系的重新思考
  6. 新概念,数字游民面临的一些挑战和应对举措
  7. Linux下定时函数timerfd_xxx()的使用
  8. [USACO09DEC]视频游戏的麻烦Video Game Troubles(DP)
  9. linux 下的进程创建线程,Linux线程 之 线程 线程组 进程 轻量级进程(LWP)
  10. php微信摇一摇,申请开通微信摇一摇