我试图用glTexSubImage2D更新纹理

时间:2016-08-08 08:13:40

标签: c++ opengl

我最近开始学习OpenGL,而且我一直在搞乱纹理。我使用glTexImage2D更新了我的纹理,但我已经了解到使用glTexSubImage2D会更好,所以我尝试更改代码但是我没有工作。

工作代码

void GLWidget::updateTextures(){

    QImage t = img.mirrored();

    glBindTexture(GL_TEXTURE_2D, tex);

        glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());

    glBindTexture( GL_TEXTURE_2D, 0);
}

无效代码

void GLWidget::updateTextures(){

    QImage t = img.mirrored();

    glBindTexture(GL_TEXTURE_2D, tex);

        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, t.width(), t.height(), GL_RGBA, GL_UNSIGNED_BYTE, t.bits());

    glBindTexture( GL_TEXTURE_2D, 0);
}

我所有的都是黑屏。

感谢。

编辑:

这是纹理的初始化:

void GLWidget::initializeGL(){

...

    LoadGLTextures();

...

}

void GLWidget::LoadGLTextures(){


    QImage t = img.mirrored();

    glGenTextures(1, &tex);

    glBindTexture(GL_TEXTURE_2D, tex);

        glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glBindTexture( GL_TEXTURE_2D, 0);

}

img是包含像素数据的QImage变量。

glGetError()返回代码1281。

1 个答案:

答案 0 :(得分:3)

glTexSubImage2D更新先前分配的纹理的内容。必须至少调用glTexImage2D才能触发分配:

void GLWidget::initializeGL(){

    //...

    QImage t = img.mirrored();

    glBindTexture(GL_TEXTURE_2D, tex);

    glTexImage2D(
        GL_TEXTURE_2D,
        0,
        3,
        t.width(),
        t.height(),
        0,
        GL_RGBA,
        GL_UNSIGNED_BYTE,
        t.bits()
    );

    glBindTexture( GL_TEXTURE_2D, 0);

    // ...
}

使用glTexSubImage2D更新:

void GLWidget::updateTextures(){

    QImage t = img.mirrored();

    glBindTexture(GL_TEXTURE_2D, tex);

    glTexSubImage2D(
        GL_TEXTURE_2D,
        0,
        0,
        0,
        t.width(),
        t.height(),
        GL_RGBA,
        GL_UNSIGNED_BYTE,
        t.bits()
    );

    glBindTexture( GL_TEXTURE_2D, 0);
}

编辑:问题是glTexImage2D和glTexSubImage2D被调用不同的图像大小,在glTexSubImage2D调用上生成错误GL_INVALID_VALUE(1281,0x501)。