【问题标题】:OpenGL Vertex Attribute ReuseOpenGL顶点属性重用
【发布时间】:2013-02-08 05:50:12
【问题描述】:

在默认的网格顶点构造中,我们这样做。

//v = vertex, p = position, c = color
buffer = { v0 , p0, c0,
           v1 , p0, c0,
           v2 , p0, c0  };

我们有一个三角形。 但我想重用这样的明显属性:

//p and c are the same for all vertexes
buffer = { v0, p0, c0 ,
           v1, 
           v2 };

我们可以在着色器上使用统一的值来做到这一点,但我会在同一个缓冲区上渲染数千个具有不同位置的三角形:

buffer = { v0, p0, c0 ,
           v1, 
           v2,
           v3, p1, c1,
           v4,
           v5, 
           v6, p2, c2,
           ...};

我现在的解决方案是:

1) 像第一个示例一样发送每个顶点的属性副本(不想这样做,但可能是最好的解决方案)。

2) 为位置/颜色发送索引属性(用于搜索)和统一数组(统一大小限制问题?)

3) 最佳解决方案?

【问题讨论】:

  • 这样做的(非常小的)内存好处的性能损失通常是不值得的,没有干净的方法可以做到这一点。对于您加载的大多数模型,您将拥有大部分独特的纹理坐标和法线。
  • 这对我来说真的像是虚假的经济。在担心一些“冗余”数据之前,我会更担心 GPU 效率。与纹理内存需求相比,这不算什么。
  • 除了(或尽管如此!)我之前所说的,您可能会发现provoking vertex 有一些用处。
  • 你的问题没有意义。位置是顶点的部分;它是顶点的一个组成部分。那么如果不改变位置或颜色,v0 的哪一部分与 v1 不同。简而言之,这里的“顶点”是什么意思?
  • 我的意思是:一个三角形有 3 个点来定义它们的模型。我可以发送 3 个位置或 3 个颜色或其他。但通常这 3 个位置对于三角形的 3 个点是相同的。我想知道是否有办法减少这种位置(或颜色等)的减少。当发送例如。一千个三角形我发送了 3 千个点和相同大小的位置、颜色等。如果每个三角形使用一个位置,则将其减少 2/3。由于我可能会使用数百万个三角形,因此切割 200 万个浮点数似乎是个好主意;p

标签: opengl shader vbo


【解决方案1】:
//p and c are the same for all vertexes

不,他们不是。在您的情况下,顶点是 v、p 和 c 的整体组合。改变其中一个,你得到一个完全不同的顶点。常见的误解,但这就是它的工作原理

【讨论】:

    【解决方案2】:

    假设您不在一个古老的硬件上,并且顶点内存并不是那么重要,只需复制数据并为每个顶点保留完整的属性集。肯定不会慢的。

    以这种方式“重用”数据通常会导致性能下降,因为GPU无法优化数据访问;它必须做你想做的复杂事情。

    【讨论】:

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