0

我有一个 iOS 2D 渲染引擎,能够从 spritesheet/纹理图集渲染单个帧。但是,它通过将 spritesheet 切割成每一帧的不同纹理来实现这一点。正如您所猜想的那样,即使在每帧仅绘制一个实体的情况下,在制作动画时也会非常慢,因为每帧都会调用 glBindTexture。

因此,我对其进行了更改,以便将 spritesheet 保持为一体,并在运行时将 spritesheet 纹理简单地剪辑到所需的帧。这是一段示例代码,我打算稍作修改,但具有我正在寻找的一般预期效果。

- (void) drawInRect:(CGRect)dest withClip:(CGRect)src withRotation:(CGFloat)rotation {
GLfloat 
    gx0 = src.origin.x/_width, gx1 = (src.origin.x+src.size.width)/_width,
    gy0 = src.origin.y/_height, gy1 = (src.origin.y+src.size.height)/_height;
GLfloat     coordinates[] = { 
    gx0,    gy1,
    gx1,    gy1,
    gx0,    gy0,
    gx1,    gy0 
};
GLfloat vertices[] = {  
    -dest.size.width/2,     -dest.size.height/2,    0.0,
    dest.size.width/2,      -dest.size.height/2,    0.0,
    -dest.size.width/2,     dest.size.height/2,     0.0,
    dest.size.width/2,      dest.size.height/2,     0.0 
};

glBindTexture(GL_TEXTURE_2D, _name);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);

glPushMatrix();
glTranslatef(dest.origin.x+dest.size.width/2, dest.origin.y+dest.size.height/2, 0);
glRotatef(rotation, 0, 0, 1); //in degrees, about screen origin.
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glPopMatrix();
}

但是我想编辑它,以便我可以加载一个包含多个不同剪切矩形的数组(例如想要从一个精灵表中绘制多个项目的情况)。但是,据我了解,如果我只是将更多三角形加载到顶点数组中并开始将更多直角坐标粘贴到坐标数组中,那不会在纹理绑定的不同三角形之间的空间中导致一些讨厌的纹理拉伸到。如果是这样,我什至有办法将多个帧从同一个 spritesheet 批量渲染到屏幕的不同部分?

我理解我想要的结果是否不完全清楚。如果您需要我详细说明任何事情,请告诉我,我很乐意尽我所能更好地解释。谢谢你。

4

1 回答 1

0

具有批处理渲染的对象是在尽可能少的调用中将尽可能多的数据获取到 opengl。以此为指导原则,您可以采取的提高批处理效率的步骤是:

  1. 使用 spritesheet 减少纹理绑定 - 纹理绑定相对昂贵,因此将它们最小化非常重要。
  2. 不要一次绘制一个精灵 - 将几何图形批量化为一个大 VBO 并一次绘制。这意味着:
    • 您将无法使用 GL_TRIANGLE_STRIP,因为您的精灵不会在屏幕上全部连续,请尝试使用 GL_TRIANGLES 渲染索引缓冲区。
    • 您将无法使用 glTranslate 等 - 您必须自己计算
于 2012-06-18T16:05:38.890 回答