在OpenGL中动态更改纹理

5

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

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


顺便提一下,glGetError() 返回了 0 - Geoff
1
我感到困惑,看起来“恰到好处”… - Staffan
当您尝试重新绘制图像时,Z缓冲区和颜色缓冲区是否清除?是否存在模板操作?glScissor呢?或者可能glViewport设置为奇怪的值?如果每帧使用glTexImage2d而不是SubImage2D会发生什么?我认为这与子窗口代码有关 - 可能是glViewport或glScissors或类似的东西。 - SigTerm
2个回答

2

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

尝试将纹理上传放入显示功能中,看看是否有所改善。


没错!谢谢!我现在已经在上述函数调用之前放置了 glutSetWindow(leftPanel); - Geoff

1

你是想按顺序显示新的图像而不是现有的吗?
如果是这种情况,你只需要更改image.data,而不是创建新的纹理绑定。


是的(我更新了问题,使其更加清晰)。我认为当你调用这些函数中的任何一个时,数组都会被复制。这不是这种情况吗?如果是这样,我的图像数据肯定会超出范围。 - Geoff
假设它们具有相同的大小/格式等,只需将新的像素数据复制到image.data中。请参见http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml。 - Martin Beckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接