我有一些每帧都会更改的顶点数据,但因为我提前不知道顶点的(最大)数量,所以我必须使用glBufferData
每一帧,而不是使用glBufferSubData
. 我只在初始化期间分配 VAO/VBO 本身一次。
我的问题是:鉴于我正在使用glBufferData
每一帧(因此,我猜,每帧重新分配新的缓冲区),我应该使用GL_DYNAMIC_DRAW
orGL_STATIC_DRAW
吗?
我的直觉是,GL_STATIC_DRAW
因为我永远不会写入现有的缓冲区内存,但我想知道是否会影响同一 VBO 上的后续(而不是GL_DYNAMIC_DRAW
)调用中的任何内容。glBufferData
glBufferSubData
GL_STATIC_DRAW 通常在您不希望数据频繁更改时使用,它适用于一次上传数据并渲染多次而不更改数据的情况。使用 GL_STATIC_DRAW 告诉 OpenGL 驱动程序针对静态数据进行优化,并且驱动程序可能会做出某些假设,如果数据频繁更新,这些假设可能会影响性能。
另一方面,GL_DYNAMIC_DRAW 指示数据可能经常更改,驱动程序将针对该场景进行优化,使其更适合您使用新数据每帧调用 glBufferData 的用例。
即使您每帧创建新的缓冲区,使用 GL_DYNAMIC_DRAW 也不会对后续调用 glBufferData 产生负面影响。更多的是关于您打算如何使用缓冲区内的数据。对于频繁变化的数据,GL_DYNAMIC_DRAW是更合适的选择