我最近开始学习 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);
}
Run Code Online (Sandbox Code Playgroud)
不工作的代码
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);
}
Run Code Online (Sandbox Code Playgroud)
我只有黑屏。
谢谢。
编辑 :
这是我的纹理的初始化:
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);
}
Run Code Online (Sandbox Code Playgroud)
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);
// ...
}
Run Code Online (Sandbox Code Playgroud)
使用 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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:问题是 glTexImage2D 和 glTexSubImage2D 以不同的图像大小调用,在 glTexSubImage2D 调用上生成错误 GL_INVALID_VALUE (1281, 0x501)。