仅使用 glBufferData 时GL_DYNAMIC_DRAW有区别吗?

Does GL_DYNAMIC_DRAW make a difference when only using glBufferData?

提问人:Jason C 提问时间:10/31/2023 更新时间:10/31/2023 访问量:30

问:

我有一些顶点数据会更改每一帧,但由于我事先不知道顶点的(最大)数,因此我必须使用每一帧,而不是使用 .在初始化期间,我只分配一次 VAO/VBO 本身。glBufferDataglBufferSubData

我的问题是:鉴于我正在使用每一帧(因此,我想,每一帧都重新分配新的缓冲区),我应该使用 OR ?glBufferDataGL_DYNAMIC_DRAWGL_STATIC_DRAW

我的直觉是因为我永远不会写入现有的缓冲区内存,但是我想知道是否会影响对同一 VBO 的后续(不是)调用中的任何内容。GL_STATIC_DRAWGL_DYNAMIC_DRAWglBufferDataglBufferSubData

与语言无关的 OpenGL-3

评论


答:

1赞 Cem Polat 10/31/2023 #1

GL_STATIC_DRAW通常用于不希望数据频繁更改的情况,它适用于上传一次数据并在不更改数据的情况下多次呈现数据的情况。使用 GL_STATIC_DRAW 会告知 OpenGL 驱动程序针对静态数据进行优化,如果数据频繁更新,驱动程序可能会做出某些假设,这些假设可能会影响性能。

另一方面,GL_DYNAMIC_DRAW指示数据可能经常更改,驱动程序将针对该方案进行优化,使其更适合使用新数据每帧调用 glBufferData 的用例。

使用 GL_DYNAMIC_DRAW 不会对后续对 glBufferData 的调用产生负面影响,即使您正在每帧创建新的缓冲区也是如此。它更多的是关于你打算如何使用缓冲区中的数据。对于频繁变化的数据,GL_DYNAMIC_DRAW是更合适的选择