在OpenGL中动态更改纹理

时间:2010-07-06 22:34:05

标签: opengl opencv

我有一些生成图像的(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。当我再次更新图像时,图片不会改变。 (我已经确认正在调用显示功能,并且图像不同。)

编辑:另一个线索,我有子窗口。如果我注释掉我的其他窗口,代码就会按预期工作。

2 个答案:

答案 0 :(得分:2)

由于它在没有“子窗口”的情况下正常工作,我的猜测是你的应用程序中有多个OpenGL上下文,并且纹理的更新发生在错误的上下文活动中。

尝试将纹理上传到显示功能中,看看是否会产生影响。

答案 1 :(得分:1)

您是否尝试按顺序显示新图像而不是现有图像? 在这种情况下,您只需要更改image.data,而不是创建新的纹理绑定。