2010-07-06 178 views
5

我有一些(OpenCV)代码可以生成图像。我使用OpenGL显示这些图像。当创建新的图像I具有相同texture名称和新image运行以下函数(每次):在OpenGL中动态更改纹理

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()初始化第一图像并正确显示。它的编号为1。当我再次更新图像时,图片不会改变。 (我已经确认显示功能被调用,并且图像不同。)

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

+0

顺便说一句,'glGetError()'返回'0'。 – Geoff 2010-07-06 22:50:39

+1

我很困惑,看起来*只是*正确的... – Staffan 2010-07-07 09:41:09

+0

当您尝试重新绘制图像时是否清除z缓冲区和颜色缓冲区?有模板操作吗? glScissor?或者,也许glViewport被设置为奇怪的价值?当您每帧使用glTexImage2d而不是SubImage2D时会发生什么?我认为它与子窗口代码有关 - 可能是glViewport或glScissors或类似的东西。 – SigTerm 2010-07-07 13:11:04

回答

2

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

尝试将纹理上传到您的显示功能,看看是否有所作为。

+0

正确!谢谢!在调用上述函数之前,我已经放了'glutSetWindow(leftPanel);'。 – Geoff 2010-07-07 16:05:29

1

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

+0

是的(我更新了一个更清晰的问题)。我认为当你调用这些函数时,数组被复制。情况并非如此吗?如果是这样,我的图像数据肯定会超出范围。 – Geoff 2010-07-06 23:01:01

+0

Assumign他们是相同的大小/格式/ etc只是复制新的像素数据image.data 见http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml – 2010-07-07 02:20:09