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

Fastest way to draw sprites in opengles 2.0 on android

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

编辑:我正在尝试创建一个子弹壳,但弄清楚如何绘制 500 多个东西让我头疼。

我认为您在寻找粒子系统。这里有一个类似的问题: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位置作为纹理坐标传递给片段着色器添加任何常规颜色纹理。

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

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