0

スプライトシート/テクスチャ アトラスから個々のフレームをレンダリングできる 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 つのスプライトシートから複数のアイテムを描画する場合など)。ただし、単純に頂点配列にさらに三角形をロードし、座標配列に直角座標を追加し始めると、テクスチャがバインドされた異なる三角形の間のスペースで厄介なテクスチャストレッチが発生することはありません。に。もしそうなら、同じスプライトシートから画面の異なる部分に複数のフレームをバッチレンダリングする方法さえありますか?

希望する結果が完全に明確でない場合は理解しています。何か詳しく説明する必要がある場合はお知らせください。より適切に説明できるよう最善を尽くします。ありがとうございました。

4

1 に答える 1

0

バッチ レンダリングの目的は、可能な限り少ない呼び出しで可能な限り多くのデータを opengl に取り込むことです。これを指針として使用すると、バッチ処理の効率を上げるために実行できる手順は次のとおりです。

  1. スプライトシートを使用してテクスチャ バインドを減らします。テクスチャ バインドは比較的コストがかかるため、最小化することが非常に重要です。
  2. スプライトを一度に 1 つずつ描画しないでください。ジオメトリを 1 つの大きな VBO にまとめて、一度にすべて描画します。この意味は:
    • スプライトがすべて画面上で連続しているわけではないため、GL_TRIANGLE_STRIP を使用することはできません。GL_TRIANGLES を使用してインデックス付きバッファをレンダリングしてみてください。
    • glTranslate などを使用することはできません。自分で計算する必要があります。
于 2012-06-18T16:05:38.890 に答える