我正在制作一个小的2D游戏演示,据我所读,使用drawElements()绘制索引三角形列表比使用drawArrays()绘制无索引三角形列表要好得多。
但据我所知,似乎不可能在一个抽签调用中绘制与drawElements()没有连接的多个元素。
所以在我的2D游戏演示中,我只想画出由两个三角形组成的方块,那么最好的方法是什么,这样我就不会在每个物体上都有一个抽签命令了?
发布于 2013-10-28 14:32:42
是的,在许多情况下使用索引更好,因为您不必存储或传输重复的顶点,也不必处理重复的顶点(每个顶点只需要运行一次顶点着色)。在四叉点的情况下,将6个顶点减少到4个,加上少量的索引数据。三分之二确实是一个很好的改进,特别是当你的顶点数据不仅仅是位置的时候。
总之,glDrawElements的结果是
如果内存中的引用顶点彼此不接近,索引可能会影响缓存性能。建模人员通常会产生网格,并在考虑到这一点的情况下进行优化。
对于多个元素,如果您指的是GL_TRIANGLE_STRIP,可以使用glPrimitiveRestartIndex来用一个glDrawElements调用绘制多个三角形条。在您的例子中,可以很容易地使用GL_TRIANGLES和引用4个顶点,每个四边形有6个索引。然后,顶点数组需要存储所有四边形的所有顶点。如果他们正在移动,你仍然需要将数据发送到GPU的每一个帧。您可以将所有移动的四角体定位在数组的前面,并且只更新活动的四角体。您还可以将静态顶点数据存储在单独的数组中。
绘制三维模型的典型方法是为几何学提供一个固定顶点列表,并使用模型矩阵(作为模型视图的一部分)移动整个事物。这里令人困惑的地方是,网格数据太小了,正如您所说的,绘制调用的开销可能会变得非常突出。我想你得先画很多四角图,然后才能登上舞台,这会是个问题。然而,如果你这样做,实例或类似的想法,如粒子系统,是你应该看的地方。
也许只有当抽签调用或数据传输成为一个问题时,才沿着下面的轨道前进,因为这涉及到很多问题。完全在GPU上实现粒子系统的一个好方法是在纹理中存储实例属性,如位置/颜色。使用FBO/呈现到纹理的每一个帧都可以在另一个纹理之间"ping-pong“这个数据,并更新片段着色器中的属性。要绘制粒子,您可以设置一个静态的VBO,它用属性-数据纹理坐标存储四元,以便在顶点着色器中读取和应用粒子位置。我确信有许多好的教程/实现可以遵循在外面 (如果您知道一个好的教程/实现,请评论)。
https://stackoverflow.com/questions/19636054
复制相似问题