【发布时间】:2014-07-07 15:24:47
【问题描述】:
这是最简单的情况:http://jsfiddle.net/headchem/r28mm/10/
有什么方法可以避免为我要绘制的每个三角形调用这条线?
gl.drawArrays(gl.TRIANGLES, 0, numItems);
作为一项学习练习,我正在尝试用简单的彩色三角形创建一个 2D 游戏。我想每帧在屏幕上放置数百个移动三角形,但我目前的尝试速度非常慢。我怀疑这是因为我在每一帧都进行了数百次 drawArrays() 调用。
我已经阅读了一些关于 Vertex Buffer Objects 和 this question sounds promising 的内容,但是我在上面的小提琴演示中无法将所有部分放在一起。是否可以在一次绘制调用中渲染数百个独特的 2D 三角形形状 + 不同的颜色 + 透明度并具有良好的性能?
【问题讨论】:
-
你所做的就是"immediate mode" rendering。这是一种非常错误的 OpenGL 方式。如今,使用 Vertex Buffer Objects 是一个普通的标准。未来的优化可能包括静态和动态 "batching"、"geometry instancing"、在 geometry shader 或 tessellation shaders 以及它们的任意组合。您可能想要运行一些谷歌搜索,因为现在您有了关键字。此外,这些主题的一些基础知识包含在现代 OpenGL 书籍(OpenGL 3.0+)中。
-
@Drop:注意
opengl-es和webgl标签。您提出的大多数功能在 OpenGL ES 2.0(WebGL 所基于)中不可用。 -
@RetoKoradi 哦,我没有看到那些标签。之前只有
opengl;) 无论如何,VBO 和批处理是必须有的,并且随处可用。 -
@Drop:是的,在我遇到问题之前,genpfault 正在修复标签。
-
@Drop: 不,那是不是立即模式。即时模式是
glBegin/End,per vertex 有几个 GL 调用,而且 wegbl 甚至不支持。