6.OpenGL学习之多个纹理映射

纹理基础

  在纹理之间进行切换或者重新加载不同的纹理图像可能会是开销非常大的操作。纹理对象允许我们一次加载一个以上的纹理 状态(包括纹理图像),以及在它们之间进行快速切换。纹理状态是由当前绑定的纹理对象维护的,而纹理对象是由一个无符号整数标识的。

void glGenTextures(GLsizei n, GLuint *textures);

在这个函数中,我们可以指定纹理对象的数量和一个指针,这个指针指向一个无符号整型数组(由纹理对象标识符填充)。我们可以把它们看成不同的可用纹理状态的句柄。为了“绑定”其中一种纹理状态,可以调用下面这个函数。

void glBindTexture(GLenum target, GLuint texture);

target参数必须是GL_TEXTURE_1D、GL_TEXTURE_2D或GL_TEXTURE_3D,而texture参数则是需要绑定的特定纹理对象。此后,所有的纹理加载和纹理参数设置只影响当前绑定的纹理对象。为了删除纹理对象,可以调用下面这个函数。

void glDeleteTextures(GLsizei n, GLuint *textures);

这个函数的参数和glGenTextures函数的参数 具有相同的含义。我们并不需要同时产生和删除所有的纹理对象。多次调用glGenTextures所带来的额外开销很小。多次调用glDeleteTextures可能造成一些延迟,但这种情况只有在销毁大量的纹理内存时才会发生。

示例演示

加载纹理时生成多个纹理对象。

void MyQGLWidget::loadGLTextures()
{
    QString fileName[6] = { ":/new/img/0.jpg",
                            ":/new/img/1.jpg",
                            ":/new/img/2.jpg",
                            ":/new/img/3.jpg",
                            ":/new/img/4.jpg",
                            ":/new/img/5.jpg",};
    for(int i = 0; i < 6; i++)
    {
        QImage tex, buf;
        if(!buf.load(fileName[i])){
            QImage dummy(128, 128, QImage::Format_RGB32);
            dummy.fill(Qt::green);
            buf = dummy;
        }
        tex = convertToGLFormat(buf);
        glGenTextures(1, &textureID[i]);
        glBindTexture(GL_TEXTURE_2D, textureID[i]); // 将生成的纹理的名称绑定到指定的纹理上
        glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 1, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    }
}

运行结果:

这里写图片描述

代码分析:

  函数glGenTextures将分配一个纹理对象,并将其放置到textureID数组中。我们通过textureID数组来识别某个纹理,并调用glglBindTexture对这个纹理状态进行初始化绑定。

代码下载
OpenGL学习系列导航

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值