因此,在 OpenGL 渲染应用程序中,通常是在应用程序的整个生命周期中创建和维护一个顶点缓冲区并用 glBufferData 交换每一帧的数据更好,还是只删除 VBO 并在每一帧重新创建它更好?
直觉告诉我最好交换数据,但是我见过的一些示例程序可以交换数据,所以我有点困惑。
我阅读了 Nvidia 关于 VBO 的白皮书,但由于我是 opengl 的新手,所以它没有多大意义。
提前感谢您的建议和建议
因此,在 OpenGL 渲染应用程序中,通常是在应用程序的整个生命周期中创建和维护一个顶点缓冲区并用 glBufferData 交换每一帧的数据更好,还是只删除 VBO 并在每一帧重新创建它更好?
直觉告诉我最好交换数据,但是我见过的一些示例程序可以交换数据,所以我有点困惑。
我阅读了 Nvidia 关于 VBO 的白皮书,但由于我是 opengl 的新手,所以它没有多大意义。
提前感谢您的建议和建议
由于您每帧都会生成一组全新的数据,因此文档似乎表明这GL_STREAM_DRAW
是处理事情的正确方法。
VBO 的重要之处在于它们是存储在图形内存中而不是计算机主内存中的渲染数据缓冲区。当它们中的数据没有(太)频繁更新时,这使得它们的使用非常有效,因为每次你这样做时,计算机都必须将(可能大量的)数据从主内存传输到图形内存 - 这很慢.
因此,理想的情况是将所有需要的渲染数据一次性放入 VBO,然后仅通过矩阵变换或着色器等 OpenGL 函数对其进行操作。
因此,您可以将每个网格的世界空间坐标和纹理坐标放入 VBO 中,并且不再直接接触它们;你会使用模型视图矩阵、光照函数和着色器来渲染它们。
您可以做更多的事情来优化 VBO 的使用,但这是我所理解的基础知识。
在此处找到一些好的提示和更多详细信息:如何使用 OpenGL 3.x VBO 渲染动态世界?