2

我有一些 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

关于这段代码,我有两个问题:

  1. 我从draw回调中调用它。这是否完全否定了将我的顶点数据存储在服务器中的用处?
  2. 如果我应该把这段代码放在外面draw,我应该把gl_STREAM_DRAW命令改成更静态的吗?
4

1 回答 1

2
  1. 是的,通过以这种方式使用缓冲区对象,您正在丢掉缓冲区对象的大部分好处。很可能,它仍然会比glBegin/更快,glEnd因为驱动程序会同时而不是增量地知道所有数据,但不能保证它会更快,甚至可能会因为小缓冲区的开销而变慢创建和销毁缓冲区对象。

  2. 是的,如glBufferData API 文档中所述,您应该避免STREAM_DRAW使用,除非缓冲区每帧或接近每一帧都发生变化。我个人的经验法则是:

    • 只改变一次-->STATIC
    • 经常改变,但比保持不变的频率低 -->DYNAMIC
    • 变化多于保持不变-->STREAM
于 2013-11-21T02:45:05.400 回答