我有一个 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 批量渲染到屏幕的不同部分?
我理解我想要的结果是否不完全清楚。如果您需要我详细说明任何事情,请告诉我,我很乐意尽我所能更好地解释。谢谢你。