我有一些(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);
}
Run Code Online (Sandbox Code Playgroud)
我之前 初始化第一张图片glutMainLoop()并正确显示.它给了id 1.当我再次更新图像时,图片不会改变.(我已经确认正在调用显示功能,并且图像不同.)
编辑:另一个线索,我有子窗口.如果我注释掉我的其他窗口代码按预期工作.
由于它在没有“子窗口”的情况下可以正常工作,我的猜测是您的应用程序中有多个 OpenGL 上下文,并且纹理的更新是在错误的上下文活动时发生的。
尝试将纹理上传放入您的显示函数中,看看是否会产生影响。