在android上的opengles 2.0中绘制精灵的最快方法

时间:2015-06-15 04:58:33

标签: android performance opengl-es opengl-es-2.0

所以我试图弄清楚如何多次绘制单个纹理四边形。我的问题是,因为这些是创建和删除的,并且每个人都有一个独特的位置和轮换。我不确定vbo是最好的解决方案,因为我听说修改缓冲区在android上非常慢,似乎我需要每帧创建一个新的,因为不同的四边形可能随机消失(与敌人碰撞)。如果我只是为每个人做一个平局调用,我会得到20fps大约100,这是无法使用的。有什么建议吗?

编辑:我正在尝试创建一个子弹壳,但弄清楚如何绘制500多件东西会伤到我的脑袋。

1 个答案:

答案 0 :(得分:4)

我认为你是在粒子系统之后。类似的问题在这里:Drawing many textured particles quickly in OpenGL ES 1.1

使用点精灵非常便宜,但你必须在片段着色器中做额外的工作,如果你需要不同大小的粒子,我不确定GLES2是否支持gl_PointSizegl_PointSize Corresponding to World Space Size

我的首选粒子系统将位置存储在双缓冲纹理中,然后使用单个绘制调用和静态四边形数组绘制。 This是相关的,但我会在这里描述一下......

  1. 创建纹理(如果可以,则浮点数,但这可能会限制支持的设备)。每个像素保持粒子位置和旋转信息。
  2. [已编辑]如果需要为粒子设置动画,则需要在每帧中更改纹理中的值。为了加快速度,让GPU在着色器中完成。使用FBO绘制全屏多边形并更新片段着色器中的值。问题是你无法读取和写入相同的纹理(或者不应该)。常见的方法是通过创建第二个来渲染到纹理,同时从第一个读取,然后在它们之间打乒乓,来对纹理进行双重缓冲。
  3. 创建用于绘制三角形的VBO。位置都是相同的,填充-1到1四边形。但是,使每个四边形的纹理坐标成为上述纹理中的正确像素。
  4. 绘制VBO,绑定您的位置纹理。在顶点着色器中,读取给定顶点纹理坐标的位置。将-1到1个顶点位置缩放到正确的大小,应用位置和任何旋转。使用原始的-1到1位置作为纹理坐标传递给片段着色器以添加任何常规颜色纹理。

    如果您的GLSL版本为gl_Vertex,我非常喜欢在顶点着色器中生成这些坐标,从而节省存储不必要的简单数据以绘制简单对象。 This for example

  5. 要生成粒子,请使用glTexSubImage2D并将粒子块写入位置纹理。如果开始存储更多粒子属性,则可能需要一些纹理。