OpenGL glTexImage2D 纹理生成函数注意点

来源:互联网 发布:手机vr眼睛 软件 编辑:程序博客网 时间:2024/05/22 00:30

OpenGL glTexImage2D 纹理生成函数注意点


glTexImage2D 详解


函数原型为:void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels);

关于此函数的官方介绍请查看 https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexImage2D.xml


这里说一下调用此函数需要注意的地方:

1.调用glTexImage2D函数前必须要先调用glBindTexture函数

从函数的原型就能看出 glTexImage2D函数并没有指定生成的纹理和哪一个纹理id相对应,如果在调用glTexImage2D函数前不调用glBindTexture函数,则创建的纹理就不知道是为谁创建,既创建出来的纹理找不到对应的主人。

因此在调用glTexImage2D函数创建纹理时一定必须要先调用glBindTexture(GL_TEXTURE_2D, mTextureID);以指定glTexImage2D函数创建的纹理对应哪一个纹理ID

在调用glTexImage2D该函数之前,必须调用glBindTexture(GL_TEXTURE_2D, mTextureID);以指定要操作的纹理ID,特此重申一次。

2.internalformatformat的类型必须要一致。

3.加载的图片的widthheight必须是2N次幂。否则不能正确显示纹理,如果有边界,则必须是2的整数幂+2

注意glTexSubImage2D函数也需要图片的widthheight必须是2N次幂。

4.可以使用glPixelStorei函数来指定加载的图片的内存对齐方式。

    glBindTexture(GL_TEXTURE_2D, _texture);

    //OpenGL ES对纹理的尺寸有限制,就是长和宽都必须是2的整数次幂。

    //在调用该函数之前,必须调用glBindTexture(GL_TEXTURE_2D, mTextureID);以指定要操作的纹理ID,此处是_texture

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);//图片1字节对齐这样加载最安全 OpenGL默认为4字节对齐 4字节对齐处理速度快。至于为什么4字节对齐处理快,请看微机原理,简单解释下对齐的话可以使用移位运算。

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);//纹理生成后再将图片对齐方式改为4字节对齐。

5.设置纹理的过滤方式

unsigned int mTextureID;

glGenTextures(1, &mTextureID);

glBindTexture(GL_TEXTURE_2D, mTextureID);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//此为纹理过滤参数设置

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

//widthheight等参数必需符合要求,此处不赘述。pData是指像素数据

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width,height, 0, GL_RGB, GL_UNSIGNED_BYTE, pData );

6.OpenGL gluBuild2DMipmaps()函数支持任意分辨率的图片文件 但是OpenGL ES不支持gluBuild2DMipmaps函数。