OpenGL-载入纹理

2019-05-24  本文已影响0人  Tobesky

在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)

参数说明:

注:最后三个参数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);
上一篇 下一篇

猜你喜欢

热点阅读