2010-07-06 86 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