在OpenGL里以下三个函数最经常用来从存储器缓冲区中载入纹理数据:
void glTexImage1D((GLenum target, GLint level, GLenum internalformat,GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type,void* data);
void glTexImage2D((GLenum target, GLint level, GLenum internalformat,GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type,void* data);
void glTexImage3D((GLenum target, GLint level, GLenum internalformat,GLsizei width, GLsizei height,GLsizei depth,GLint border, GLenum format, GLenum type,void* data)
参数说明:
- target:指定目标纹理,这个值必须是GL_TEXTURE_2D。
- level:执行细节级别,0是最基本的图像级别,n表示第N级贴图细化级别。
-
internalformat:指定纹理中的颜色组件。可选的值有
GL_ALPHA
,GL_RGB,GL_RGBA
,GL_LUMINANCE
,GL_LUMINANCE_ALPHA
等几种。 - width,height,depth:指加载纹理的宽度、高度、深度。这些值必须是 2的整数次方。(这是因为OpenGL 旧版本上的遗留下的⼀个要求。当然现在已经可以支持不是 2的整数次方。但是开发者们还是习惯使⽤以2的整数次方去设置这些参数。)。
- height:指定纹理图像的高度,必须是2的m次方。纹理图片至少要支持64个材质元素的高度。
- border:允许为纹理贴图指定一个边界宽度。
-
type:指定像素数据的数据类型。可以使用的值有
GL_UNSIGNED_BYTE
,GL_UNSIGNED_SHORT_5_6_5
,GL_UNSIGNED_SHORT_4_4_4_4
,GL_UNSIGNED_SHORT_5_5_5_1
注:最后三个参数format
, type
, data
和用于把图像放入颜色缓冲区的glDrawPixels
函数的对应参数相同
使用颜色缓冲区
- 从颜⾊缓存区内容作为像素图直接读取
//参数1:x,矩形左下角的窗⼝坐标
//参数2:y,矩形左下⻆的窗口坐标
//参数3:width,矩形的宽,以像素为单位
//参数4:height,矩形的高,以像素为单位
//参数5:format,OpenGL的像素格式
//参数6:type,解释参数pixels指向的数据,告诉OpenGL使⽤缓存区中的什么数据类型来存储颜⾊分量,像素数据的数据类型
//参数7:pixels,指向图形数据的指针
void glReadPixels(GLint x,GLint y,GLSizei width,GLSizei
height, GLenum format, GLenum type,const void * pixels);
// 指定读取的缓存
glReadBuffer(mode);
//指定写⼊入的缓存
glWriteBuffer(mode);
一维和二维纹理也可以从颜色缓冲区加载数据,我们可以从颜色缓冲区读取一幅图像,并通过下面这两个函数将它作为一个新的纹理使用。
void glCopyTexImage1D( GLenum target,
GLint level,
GLenum internalformat,
GLint x,
GLint y,
GLsizei width,
GLint border);
void glCopyTexImage2D( GLenum target,
GLint level,
GLenum internalformat,
GLint x,
GLint y,
GLsizei width,
GLint border);
注意:不存在glCopyTextImage3D
,因为我们⽆法从2D 颜色缓存区中获取体积数据。
更新纹理
void glTexSubImage1D(GLenum target,GLint level,GLint xOffset,GLsizei width,GLenum
format,GLenum type,const GLvoid *data);
void glTexSubImage2D(GLenum target,GLint level,GLint xOffset,GLint yOffset,GLsizei
width,GLsizei height,GLenum format,GLenum type,const GLvoid *data);
void glTexSubImage3D(GLenum target,GLint level,GLint xOffset,GLint yOffset,GLint
zOffset,GLsizei width,GLsizei height,GLsizei depth,Glenum type,const GLvoid * data);
插入替换纹理
替换纹理通常比重新加载一个新纹理快得多
void glCopyTexSubImage1D(GLenum target,GLint level,GLint xoffset,GLint x,GLint y,GLsizei,width);
void glCopyTexSubImage2D(GLenum target,GLint level,GLint xoffset,GLint yOffset,GLint x,y,GLsizei width,GLsizei height);
void glCopyTexSubImage3D(GLenum target,GLint level,GLint xoffset,GLint yOffset,GLint zOffset,GLint x,GLint y,GLsizei width,GLsizei height);
颜色缓冲区是2D的,不存在一种对应方法来讲一副2D彩色图像作为一个3D纹理的来源,但我们可以使用glCopyTexSubImage3D
函数,在一个三维纹理中使用颜色缓冲区的数据来设置它的一个纹理单元平面
纹理对象
//使⽤函数分配纹理对象
//指定纹理对象的数量和指针(指针指向⼀个无符号整形数组,由纹理对象标识符填充)。
void glGenTextures(GLsizei n,GLuint * textTures);
//绑定纹理状态
//参数target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
//参数texture:需要绑定的纹理对象
void glBindTexture(GLenum target,GLunit texture);
//删除绑定纹理对象
//纹理对象以及纹理对象指针(指针指向一个无符号整形数组,由纹理对象标识符填充)。
void glDeleteTextures(GLsizei n,GLuint *textures);
//测试纹理对象是否有效
//如果texture是⼀一个已经分配空间的纹理对象,那么这个函数会返回GL_TRUE,否则会返回GL_FALSE。
GLboolean glIsTexture(GLuint texture);
网友评论