gpt4 book ai didi

OpenGL-drawarrays 还是 drawelements?

转载 作者:行者123 更新时间:2023-12-04 15:23:08 41 4
gpt4 key购买 nike

我正在制作一个小型的 2D 游戏演示,从我读过的内容来看,最好使用 drawElements()绘制索引三角形列表而不是使用 drawArrays()绘制一个无索引的三角形列表。

但据我所知,使用 drawElements() 在单个绘制调用中绘制未连接的多个元素似乎是不可能的。 .

因此,对于我只绘制由两个三角形组成的正方形的 2D 游戏演示,最好的方法是什么,这样我就不会结束每个对象的一次绘制调用?

最佳答案

是的,在许多情况下最好使用索引,因为您不必存储或传输重复的顶点,也不必处理重复的顶点(顶点着色器只需要为每个顶点运行一次)。在四边形的情况下,您将 6 个顶点减少到 4 个,再加上少量索引数据。三分之二确实是一个很好的改进,特别是如果您的顶点数据不仅仅是位置。

总之,glDrawElements结果是

  • 更少的数据(大部分),这意味着更多的 GPU 内存用于其他事情
  • 如果数据发生变化,更新速度更快
  • 更快地传输到 GPU
  • 更快的顶点处理(无重复)

  • 如果引用顶点在内存中彼此不靠近,则索引会影响缓存性能。建模者通常会根据这一点生成优化的网格。

    对于多个元素,如果您指的是 GL_TRIANGLE_STRIP你可以用 glPrimitiveRestartIndex 用一个 glDrawElements 绘制多条三角形称呼。在您的情况下,使用 GL_TRIANGLES 很容易并为每个四边形引用具有 6 个索引的 4 个顶点。然后,您的顶点数组需要存储所有四边形的所有顶点。如果它们在移动,您仍然需要每帧将这些数据发送到 GPU。您可以将所有移动的四边形放置在阵列的前面,并且只更新事件的四边形。您还可以将静态顶点数据存储在单独的数组中。

    绘制 3D 模型的典型方法是提供几何图形的固定顶点列表,并使用模型矩阵(作为模型 View 的一部分)移动整个事物。这里令人困惑的部分是网格数据太小了,正如你所说,绘制调用的开销可能会变得非常突出。我认为在你到达会出现问题的阶段之前,你必须绘制很多四边形。但是,如果您这样做,则应该查看实例化或一些类似的想法(例如粒子系统)。

    如果绘制调用或数据传输成为问题,因为涉及很多,也许只有沿着以下轨道走。完全在 GPU 上实现粒子系统的一个好方法是在纹理中存储实例属性,例如位置/颜色。您使用 FBO/渲染到纹理的每一帧在另一个纹理之间“乒乓”此数据并更新片段着色器中的属性。要绘制粒子,您可以设置一个静态 VBO,该 VBO 存储带有属性数据纹理坐标的四边形,以便在可以读取和应用粒子位置的顶点着色器中使用。我确定有很多很好的教程/实现可以遵循 out there (如果你知道一个好的,请评论)。

    关于OpenGL-drawarrays 还是 drawelements?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19636054/

    41 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com