2015-06-19 89 views
1

我在頂點緩衝區對象(VBO)中遇到一個奇怪的問題。我創建了一個包含VBO創建和刪除的類。我刪除了類的析構函數中的所有VBO(使用glDeleteBuffers())。OpenGL:VBO刪除的奇怪bahaviour?

現在我創建了2個OpenGL上下文窗口,每個窗口都使用VBO類運行。現在,當我關閉一個GLwindow時,它的析構函數會調用VBO也會被刪除,但奇怪的是第二個窗口上的這個析構函數效果,第二個窗口上運行的對象消失了。當我使用已棄用的glVertex3fv進行渲染時,我可以看到該對象,但不能看到VBO。 如果我不刪除與GLwindow類的析構函數的VBO,一切工作正常。我不應該刪除每個上下文刪除VBO嗎?

我的問題是爲什麼它發生?我知道OpenGL是一個狀態機,但我們不能創建一個完整的新的獨立類對象嗎?我注意到與(glDeleteTextures())相同的效果如果我沒有用析構函數刪除紋理,沒有奇怪的事情發生,但是如果我刪除一個Glwindows紋理,它會對第二個Glwindow生效並且紋理消失。

它是已知問題還是它唯一發生在我身上?

+0

@genpfault有什麼不對?這不是一個正確的問題嗎?奇怪...... – furqan

+2

你可能因爲沒有發佈代碼而得到近距離投票。使用C++封裝OpenGL對象時,人們經常遇到一些神祕的問題。原因幾乎總是由於某種原因,對象被複制/分配,但沒有適當的複製語義。看到我的答案在這裏的一些例子和背景:http://stackoverflow.com/questions/28929452/mesh-class-called-with-default-constructor-not-working-opengl-c/28930189#28930189。 –

+0

非常感謝科拉迪..你的回答我需要。非常感謝.. – furqan

回答

0

Reto Koradi已經提到了複製語義。另外需要注意的是,OpenGL允許上下文共享,即一些對象在OpenGL上下文之間共享,並且在一個上下文中刪除將其從所有上下文中刪除。對象超越共享上下文是

  • 紋理正在使用glBindBuffer
  • 結合
  • 緩衝對象渲染緩衝器

的對象中超越共享上下文是

  • 幀緩衝對象
  • 頂點數組對象
+0

謝謝datenwolf,你能查看我對Koradi回覆的最新評論嗎?我不知道我會如何解決這個問題?我只是放棄了它。我現在應該使用VAO嗎? – furqan

+0

@furqan:沒有看到你的任何實際代碼,很難給出任何有用的建議。 10行代碼經常值1萬字。 – datenwolf