opengl - 多个缓冲区与单个缓冲区?

标签 opengl

我正在绘制简单的 3D 形状,我想知道从长远来看,只使用 1 个缓冲区来存储顶点的所有数据是否更好?

现在我有顶点数据数组(每个顶点的位置和颜色),并且我将它们推送到自己单独的缓冲区。

但是如果我使用 strideoffset,我可以将它们加入到一个数组中,但这会变得更困惑且更难以管理。

“传统”的做法是什么?

为每条数据提供单独的缓冲区感觉更加干净和有组织,但我认为它的效率较低。

效率的提高是否值得将其全部放入单个缓冲区中?

最佳答案

这个问题的答案高度依赖于使用情况。

如果您的所有顶点属性都高度不稳定或高度静态,您可能会受益于 interleaving并将它们放在一起,如评论中所述。

但是,如果一个属性比其他属性波动性大得多,则分离数据可以产生更好的性能。例如,如果您有一个网格,您经常更改顶点位置,但从不更改纹理坐标,则将它们分开可能会受益:您只需将位置重新上传到视频卡,而不是整套属性。 CPU 驱动的布料模拟就是一个例子。

它还依赖于硬件和实现。交错并不是在任何地方都有用,但我从未听说过它会产生负面影响。如果您可以使用它,您可能应该使用它。

但是,由于如果拆分属性就无法正确交错,因此您实际上是在比较两个未知数的性能影响。交错对您的目标硬件/驱动程序有帮助吗?您的数据会因分割而受益吗?第一个没有真正的答案。第二个是您和您的数据之间的问题。

就我个人而言,我建议仅使用交错的单 block 顶点属性,除非您有高度特化的需求。它降低了复杂性,而不是需要在同一后端将可能不同的系统混合在一起。

另一方面,就 C++ 中的内存寻址而言,设置交错是一项相当复杂的任务。如果您不是从头开始设计整个图形引擎,我真的怀疑您是否值得付出努力。但同样,这取决于您和您的应用程序。

但从理论上讲,仅仅将要上传到视频卡的数据分组在一起应该不会产生什么影响。由于减少了调用次数,将所有属性分组在一起可能会稍微更有效,但这又将高度依赖于驱动程序。

不幸的是,我认为你的问题的简单答案可以归结为:“这取决于”“没有人真正知道”

关于opengl - 多个缓冲区与单个缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35756541/

相关文章:

c++ - 如何使用 Nsight 调试 (GLSL) 着色器?

opengl - 渲染地形法线时出现奇怪的 'striping' 问题

c - 如何用不同于边界的颜色填充多边形?

Java:Mac 上的 Activity 监视器与 JVisualVM 中的内存消耗

opengl - alpha 不使用 glsl 着色器改变对象的透明度

qt - 带有 GLFW 和 Qt 的 OpenGL 游戏引擎?

opengl - OpenGL 在图形管道中调用什么用户模式图形驱动程序 (UMD)?

c++ - OpenGL:使用多个纹理渲染到 FBO

c++ - 如何在不同的线程上调用 glReadPixels?

python - 在 3D openGL 世界中创建 2D 界面的问题