批量渲染以及我应该如何进行

时间:2012-06-15 08:41:29

标签: iphone ios cocoa-touch opengl-es

我有一个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中绘制多个项目的场合)。但是根据我的理解,如果我简单地将更多的三角形加载到顶点阵列中并开始在更多的直角坐标中插入到坐标数组中,那么不会导致纹理被绑定的不同三角形之间的空间中的一些令人讨厌的纹理拉伸至。  如果是这样,我甚至有办法将同一个spritesheet中的多个帧批量渲染到屏幕的不同部分?

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

1 个答案:

答案 0 :(得分:0)

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

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