2013-01-16 57 views
4

我遇到了一個問題,我不知道應該如何妥善處理。我最近開始爲自己的遊戲創建一個粒子系統,並且一直在使用稱爲「粒子」的結構來處理我的粒子數據。 '粒子'包含渲染的頂點信息。glBuffer與堆內存

我遇到問題的原因是我將我的粒子結構集中在堆內存中以節省大量的分配,但是我不確定如何在glBufferData中使用指針數組,我在glBufferData需要實際的結構實例,而不是指向結構實例的指針。

我知道我可以重建一個浮動數組,每個渲染只是爲了繪製我的粒子,但是有沒有像glBufferData這樣的OpenGL調用,我錯過了某處,可以通過數據去引用指針我供應?理想情況下,我希望避免爲了複製數據而迭代數組。

回答

3

我的印象是,glBufferData需要實際的結構實例,而不是指向結構實例的指針。

正確。有效glBufferData創建在地址preseted給它的數據的一個平面副本經由數據參數指向它。

我錯過了某處可以解除引用指針的地方,因爲它正在經歷我提供的數據?

你在考慮客戶端頂點數組,這些都是OpenGL最早的特性之一。自從19年前發佈OpenGL-1.1以來,它們就已經出現了。

你只是使用緩衝區對象,即不叫glGenBuffers,glBindBuffer,glBufferData並直接通過您的客戶端數據地址glVertexPointer或glVertexAttribPointer。

不過我強烈建議實際使用緩衝區對象。無論如何,必須將數據複製到GPU,以便它可以被渲染。通過緩衝區對象來實現OpenGL驅動程序的工作效率更高。此外,由於OpenGL-4,緩衝區對象的使用不再是可選的。

+0

我居然想出如何做我想做的事,我映射緩衝區的指針和填充它自己,我不wan't使用任何舊的特點我寧願學習如何做的事情新的方式。 – user1294021

+0

@ user1294021:那麼,映射緩衝區並不是真正的堆內存。它是映射到進程地址空間的GPU系統交換內存的一部分。此外,您必須先取消映射緩衝區,然後才能從中進行繪製。 – datenwolf

+0

是的,我也未映射,謝謝,這是做到這一點最有效的方法嗎?這主要是我需要尊重我的指針,所以我可以將數據傳遞到緩衝區。 – user1294021