Opengl 交错顶点提交如何帮助提高性能?

Opengl 交错顶点提交如何帮助提高性能?,opengl,Opengl,我已经阅读并看到了其他一些问题,这些问题通常都指向将顶点位置和颜色等交织到一个数组中的建议,因为这样可以最小化从cpu发送到gpu的数据 我不清楚的是OpenGL是如何做到这一点的,即使使用交错数组,您仍然必须对位置和颜色指针进行单独的GL调用。如果两个指针使用相同的数组,只是设置为从该数组中的不同点开始,那么draw调用是否不会复制数组两次,因为它是两个不同指针的对象?这主要是关于缓存的。例如,假设我们有4个顶点和4种颜色。您可以通过这种方式提供信息(对不起,我不记得确切的函数名) 它的内部功

我已经阅读并看到了其他一些问题,这些问题通常都指向将顶点位置和颜色等交织到一个数组中的建议,因为这样可以最小化从cpu发送到gpu的数据


我不清楚的是OpenGL是如何做到这一点的,即使使用交错数组,您仍然必须对位置和颜色指针进行单独的GL调用。如果两个指针使用相同的数组,只是设置为从该数组中的不同点开始,那么draw调用是否不会复制数组两次,因为它是两个不同指针的对象?

这主要是关于缓存的。例如,假设我们有4个顶点和4种颜色。您可以通过这种方式提供信息(对不起,我不记得确切的函数名)

它的内部功能是读取顶点[0],然后应用颜色[0],然后再次使用颜色[1]读取顶点[1]。如您所见,例如,如果顶点长度为20兆,那么顶点[0]和颜色[0]之间的间距至少为20兆字节

另一方面,如果提供类似{vertex0,color0,vertex1,color1,等等}的结构,那么会有很多缓存命中,因为vertex0和color0在一起,vertex1和color1也在一起

希望这有助于回答这个问题

编辑:二读时,我可能没有回答这个问题。您可能想知道OpenGL如何知道从该结构中读取哪些值?就像我之前所说的那样,对于{vertex,color,vertex,color}这样的结构,你告诉OpenGL顶点在位置0,偏移量为2(所以下一个顶点将在位置2,然后是4,等等),颜色从位置1开始,偏移量也为2(所以位置1,然后是3,等等)

另外:如果你想要一个更实际的例子,看看这个链接。您可以在这里看到它如何只提供一次缓冲区,然后使用偏移量高效地进行渲染。

我建议阅读:

h4lc0n提供了很好的解释,但我想补充一些额外的信息:

  • 当数据经常更改时,交错数据实际上会影响性能。例如,更改点精灵的位置时,会更新位置,但颜色和TEXCOORD通常相同。然后,当数据交错时,您必须“触摸”其他数据。在这种情况下,最好只有一个VBO用于POS(或通常用于经常更改的数据),第二个VBO用于常量数据
  • 要给出关于VBO布局的严格规则并不容易,因为它非常特定于供应商/驱动程序。此外,您的用法可能与其他人不同。一般来说,需要为您的特定测试用例制定一些基准

    • 您还可以为分离不同的属性提供参数。假设GPU不处理一个接一个的顶点,而是并行处理一堆顶点(如16),则在执行顶点着色器时会得到如下结果:

      • 读取所有16个顶点的属性A
      • 进行一些计算
      • 读取所有16个顶点的属性B
      • 再进行一些计算

      因此,一次读取多个顶点的一个属性。从这个推理看来,交错属性实际上会损害性能。当然,这只有在带宽受限或由于某种原因无法隐藏内存延迟时才可见(例如,需要多个寄存器的复杂着色器将减少在给定时间内可以飞行的顶点数)。

      同意,我之前所说的主要是快速缓存友好的readingAh ok,所以这是一个实际opengl API之外的缓存问题。我希望draw调用足够聪明,能够意识到指针在看同一个数组,opengl只会尝试将数组传递一次,而不是继续将数组从CPU传递到gpu两次,即使第二次从缓存中受益。确实如此,我只是不记得提供所用确切函数的细节。我相信这是我的数据。您只提供一个数组,然后glVertexPointer/glColorPointer/etc只告诉初始偏移量和步长。因此,您提供了一个单独的阵列,并且所有内容都与中的单个阵列一起工作memory@SebbyJohanns是的,似乎我还是记得一些事情:“如果一个非零命名缓冲区对象绑定到GL_数组_缓冲区目标(请参见glBindBuffer)指定顶点数组时,指针被视为缓冲区对象数据存储区中的字节偏移量。“。查看@SebbyJohanns添加了更多信息,了解更实用的方法相关信息:
      glVertexPointer(..., vertex);
      glColorPointer(..., colors);