我必须绘制多个立方体(取决于数据,范围从6k到,在极端情况下,11k对象)。
立方体具有在动画期间不会改变的固定位置,但颜色确实会改变每一帧。我估计可以绘制一次几何体,然后重新绘制颜色,但是如何有效地实现它?
另外,我是初学者,所以我对OpenGL只有基本的了解。 什么是最佳实践(假设使用PyOpenGL)?
答案 0 :(得分:0)
我对pyOpenGL没有任何经验,但我对webGL有很多经验,有些使用openGL,所以希望这会有所帮助。
我不完全确定绘制几何体的含义是什么,然后只绘制颜色,你的意思是就像有一个缓冲区用于位置而一个用于颜色然后只改变颜色一个?如果是这样,我认为这是不可能的,因为我认为openGL一次只能处理一个顶点属性缓冲区。
我想说最好的方法是将所有多维数据集放在同一个缓冲区中以减少绘制调用,并将缓冲区的用法设置为BeyelerStudios评论的GL_DYNAMIC_DRAW,因为动态缓冲区是经常访问的。然后在更改颜色时将位置和颜色数据更新到此缓冲区中。
我希望这有帮助!
答案 1 :(得分:0)
已经有一段时间了,但与此同时我已经解决了这个问题,并认为发布答案可能会有所帮助。
通常,正如BeyelerStudios建议的那样,glBufferData
可用于确定是否要动态更改一个缓冲区的内容,方法是将GL_DYNAMIC_DRAW
或GL_STATIC_DRAW
设置为{{1}参数。
但是,还有一点,我们可以更进一步。
我将使用PyOpenGl来解释这一点,但C ++ api可能也是如此。
让我们看一下可能负责创建VBO的一组函数:
usage
基本上,def create_vbo(self):
buffers = gl.glGenBuffers(2)
# vertices buffer is static, so GL_STATIC_DRAW
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, buffers[0])
gl.glBufferData(gl.GL_ARRAY_BUFFER,
self.vectors_list,
gl.GL_STATIC_DRAW)
# colour buffer
# note the parameter GL_DYNAMIC DRAW - this buffer will be rebound
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, buffers[1])
gl.glBufferData(gl.GL_ARRAY_BUFFER,
self.colour_vectors[self.i],
gl.GL_DYNAMIC_DRAW)
return buffers
def vbo_cubic_draw(self):
... # make sure buffers are not None i.e. were created
# actually replaces data in colour buffer
gl.glBufferSubData(gl.GL_ARRAY_BUFFER, 0, self.buffer_len,
colour_vectors[self.i])
self.draw_vbo() # call drawing
def draw_vbo(self):
... # enable client states
# bind vertex buffer - will be static
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.buffers[0])
gl.glVertexPointer(4, gl.GL_FLOAT, 0, None)
# bind color buffer which is dynamic
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.buffers[1])
gl.glColorPointer(3, gl.GL_FLOAT, 0, None)
... # do more stuff and actually draw
函数声明了两个缓冲区:顶点缓冲区为静态缓冲区,颜色缓冲区为动态缓冲区。我们可以采取的额外步骤是在create_vbo
中使用glBufferSubdata
而不是glBufferData
作为动态缓冲区。然后只需要重绘颜色缓冲区然后我们实际上可以在vbo_cubic_draw
中调用一些绘图函数(例如glDrawArrays
)。显然,这种方法需要两个单独的缓冲区,一个用于颜色,一个用于顶点,有时是不希望的。但是看一下glBufferSubdata
doc,我认为不可能将它用于单个交错缓冲区,因为我们只有 offset 参数。也许某人有不同的看法?
编辑。实际上,如果数组紧密打包并且结构合理,可能会非常有可能 - 我怀疑你只能使用一个大缓冲区而不是很多缓冲区。