スプライトシート/テクスチャ アトラスから個々のフレームをレンダリングできる iOS 2D レンダリング エンジンがあります。ただし、スプライトシートをフレームごとに異なるテクスチャにカットすることでこれを行います。ご想像のとおり、glBindTexture がすべてのフレームで呼び出されるため、フレームごとに 1 つのエンティティのみを描画する場合でも、これをアニメーション化すると信じられないほど遅くなります。
そのため、スプライト シートを 1 つの部分に保持し、実行時にスプライト シート テクスチャを目的のフレームに単純にクリップするように変更しました。これは、少し変更する予定のサンプルコードですが、探している一般的な望ましい効果があります。
- (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();
}
ただし、これを編集して、複数の異なるクリッピング四角形で配列をロードできるようにしたいと思います (1 つのスプライトシートから複数のアイテムを描画する場合など)。ただし、単純に頂点配列にさらに三角形をロードし、座標配列に直角座標を追加し始めると、テクスチャがバインドされた異なる三角形の間のスペースで厄介なテクスチャストレッチが発生することはありません。に。もしそうなら、同じスプライトシートから画面の異なる部分に複数のフレームをバッチレンダリングする方法さえありますか?
希望する結果が完全に明確でない場合は理解しています。何か詳しく説明する必要がある場合はお知らせください。より適切に説明できるよう最善を尽くします。ありがとうございました。