我正在制作一个小型2D游戏演示,从我读过的内容来看,最好使用drawElements()绘制索引三角形列表而不是drawArrays()用于绘制未编制索引的三角形列表.
但据我所知,在单个绘图调用中绘制多个未连接的元素似乎是不可能的drawElements().
因此,对于我的2D游戏演示,我只会绘制由两个三角形组成的正方形,那么最好的方法是什么,所以我不会结束每个对象一次绘制调用?
是的,在许多情况下最好使用索引,因为您不必存储或传输重复的顶点,也不必处理重复的顶点(顶点着色器只需要为每个顶点运行一次)。在四边形的情况下,您将 6 个顶点减少到 4 个,再加上少量索引数据。三分之二确实是一个很好的改进,特别是如果您的顶点数据不仅仅是位置。
总之,glDrawElements结果是
如果参考顶点在内存中彼此不靠近,则索引会影响缓存性能。建模者通常会根据这一点生成优化的网格。
对于多个元素,如果您指的是GL_TRIANGLE_STRIP您可以使用glPrimitiveRestartIndex一次glDrawElements调用绘制多条三角形。在您的情况下,使用GL_TRIANGLES和引用每个四边形有 6 个索引的 4 个顶点很容易。然后,您的顶点数组需要存储所有四边形的所有顶点。如果它们在移动,您仍然需要每帧将这些数据发送到 GPU。您可以将所有移动的四边形放置在阵列的前面,并且只更新活动的四边形。您还可以将静态顶点数据存储在单独的数组中。
绘制 3D 模型的典型方法是提供几何图形的固定顶点列表,并使用模型矩阵(作为模型视图的一部分)移动整个事物。这里令人困惑的部分是网格数据太小了,正如你所说,绘制调用的开销可能会变得非常突出。我认为在你到达会出现问题的阶段之前,你必须绘制很多四边形。但是,如果您这样做,则应该查看实例化或一些类似的想法(例如粒子系统)。
如果绘制调用或数据传输成为问题,因为涉及很多,也许只有沿着以下轨道走。完全在 GPU 上实现粒子系统的一个好方法是在纹理中存储实例属性,例如位置/颜色。您使用 FBO/渲染到纹理的每一帧在另一个纹理之间“乒乓”此数据并更新片段着色器中的属性。要绘制粒子,您可以设置一个静态 VBO,该 VBO 存储带有属性数据纹理坐标的四边形,以便在可以读取和应用粒子位置的顶点着色器中使用。我敢肯定有一帮很好的教程/实现遵循那里(请评论,如果你知道一个很好的一个人)。
| 归档时间: |
|
| 查看次数: |
6634 次 |
| 最近记录: |