我有一些Haskell / OpenGLRaw代码可以做这样的事情:
verticesPtr <- newArray ...
glVertexPointer 3 gl_DOUBLE 0 verticesPtr
buffersPtr <- malloc
glGenBuffers 1 buffersPtr
buffer <- peek buffersPtr
glBindBuffer gl_ARRAY_BUFFER buffer
glBufferData gl_ARRAY_BUFFER 4 verticesPtr gl_STREAM_DRAW
glDrawArrays gl_LINE_STRIP 0 4
glDeleteBuffers 1 buffersPtr
我对此代码有两个问题:
draw
回调中呼叫的。这是否完全否定了将顶点数据存储在服务器中的用处?draw
之外,我应该将gl_STREAM_DRAW
命令更改为更静态的内容吗?答案 0 :(得分:2)
是的,通过以这种方式使用它们,您正在抛弃缓冲区对象的大部分好处。很可能它仍然会比glBegin
/ glEnd
更快,因为驱动程序会同时意识到所有数据,而不是增量,但不能保证它会更快,甚至可能是由于创建和销毁缓冲区对象的开销,缓冲区大小较慢。
是的,如glBufferData API docs中所述,您应该避免STREAM_DRAW
,除非缓冲区每个或每个帧都在变化。我个人的经验法则是:
STATIC
DYNAMIC
STREAM