我有一些生成图像的(OpenCV)代码。我正在使用OpenGL显示它们。创建新图像时,我使用相同的texture
名称和新的image
运行以下功能(每次):
void loadCVTexture(GLuint& texture, const cv::Mat_<Vec3f>& image){
if(texture != 0){
glBindTexture(GL_TEXTURE_2D, texture);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image.cols, image.rows, GL_BGR, GL_FLOAT, image.data);
} else {
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, 3, image.cols, image.rows, 0, GL_BGR, GL_FLOAT, image.data);
}
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
我在 glutMainLoop()
之前初始化第一张图片并正确显示。它被赋予id 1
。当我再次更新图像时,图片不会改变。 (我已经确认正在调用显示功能,并且图像不同。)
编辑:另一个线索,我有子窗口。如果我注释掉我的其他窗口,代码就会按预期工作。
答案 0 :(得分:2)
由于它在没有“子窗口”的情况下正常工作,我的猜测是你的应用程序中有多个OpenGL上下文,并且纹理的更新发生在错误的上下文活动中。
尝试将纹理上传到显示功能中,看看是否会产生影响。
答案 1 :(得分:1)
您是否尝试按顺序显示新图像而不是现有图像? 在这种情况下,您只需要更改image.data,而不是创建新的纹理绑定。