【问题标题】:OpenGL buffers - Stride vs Tightly packedOpenGL 缓冲区 - 步幅与紧密包装
【发布时间】:2013-07-15 17:37:12
【问题描述】:

为每个属性使用跨步顶点缓冲区与紧密打包缓冲区的优缺点是什么?我的意思是例如:

步幅:xyzrgb xyzrgb xyzrgb

紧:xyzxyzxyz rgbrgbrgb

乍一看,使用 stride 时您可能很容易更改大小,但是当您使用 glBufferData() 重新分配顶点缓冲区时,顶点缓冲区的内容会被删除。

对我来说,最好使用紧密模型,因为位置、颜色和纹理坐标可能来自本地内存中的不同数组,并且没有跨步缓冲区数据函数;您必须在上传之前将所有数组复制到交错缓冲区中,或者每个属性的每个顶点使用一个 glBufferSubData()(我猜这个想法很糟糕)。

似乎有使用交错缓冲区(步幅)的常见做法。这是为什么?我在这里缺少什么吗?

【问题讨论】:

    标签: opengl vertex-buffer vertex-attributes vertexdata


    【解决方案1】:

    我认为交错缓冲区很常见,因为它更容易创建(涉及更少的缓冲区,更直观)并且据说更快(因为内存访问模式或类似的东西),紧密打包的最大优势是仅更新您需要更新的数据的能力,从而加快更新速度。大多数 OpenGL 教程通过绘制静态网格来教授 VBO,它们不需要更新,因此可以从交错数据中受益。

    一般意见似乎是:尽可能交错,在需要时拆分。

    见: How does interleaved vertex submission help performance?

    还有:Performance gain using interleaved attribute arrays in OpenGL4.0

    另请参阅: http://www.opengl.org/wiki/Vertex_Specification_Best_Practices

    直接声明:

    “交错属性对渲染性能有多大帮助尚不清楚。需要分析数据。由于对齐需要,交错的顶点数据可能比未交错的数据占用更多的空间。”

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多