我最近开始学习 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。

最佳答案

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

10-08 08:21