1

個人用の小さな 2D グラフィックス/ゲーム ライブラリに取り組んでおり、現在、タイル マップを描画する際のパフォーマンスを向上させる方法を考えています。現在、マップ内の各タイルに対して静的な GL_QUADS VBO を作成し、それを画面に描画しています。各 VBO は、サブイメージ化されて VBO にマップされるメモリにロードされたテクスチャを参照しています。

現在、テスト中の 20 x 20 のタイル マップがあります。私の現在の実装では、個々のタイルを描画する必要があるため、フレームごとに 400 回の glDraw* 呼び出しが行われます。

たとえば、タイル マップの各行を 1 つの VBO にする方法はありますか? これにより、この例では、glDraw* 呼び出しが 20 に減少します。サブイメージをどのようにマッピングしますか? 個々のタイルを回転できます。

Texture Atlas の使用についての言及を見たことがあります。それは良い代替案でしょうか?これをopenglで実装する方法に関する便利なリンクはありますか?

コード:

現在のレンダリング方法:

public void render() {
    texture.bind();

    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    for (SpriteSheet spriteSheet : spriteSheets) {
        VBO vbo = spriteSheet.getVBO();
        float angle = spriteSheet.getAngle();

        vbo.bind();
        if (angle != 0) {
            glPushMatrix();

            Vector2f position = spriteSheet.getPosition();

            glTranslatef(position.x, position.y, 0);
            glRotatef(angle, 0.0f, 0.0f, 1);
            glTranslatef(-position.x, -position.y, 0);

            glVertexPointer(Vertex.positionElementCount, GL_FLOAT, Vertex.stride, Vertex.positionByteOffset);
            glColorPointer(Vertex.colorElementCount, GL_FLOAT, Vertex.stride, Vertex.colorByteOffset);
            glTexCoordPointer(Vertex.textureElementCount, GL_FLOAT, Vertex.stride, Vertex.textureByteOffset);

            glDrawArrays(vbo.getMode(), 0, Vertex.elementCount);

            glPopMatrix();
        }
        else {
            glVertexPointer(Vertex.positionElementCount, GL_FLOAT, Vertex.stride, Vertex.positionByteOffset);
            glColorPointer(Vertex.colorElementCount, GL_FLOAT, Vertex.stride, Vertex.colorByteOffset);
            glTexCoordPointer(Vertex.textureElementCount, GL_FLOAT, Vertex.stride, Vertex.textureByteOffset);

            glDrawArrays(vbo.getMode(), 0, Vertex.elementCount);
        }
        vbo.unbind();
    }

    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);

    texture.unbind();
}
4

1 に答える 1

1

できることはいくつかあります。

テクスチャ アトラス 1 つのオプションですがGL_TEXTURE_2D_ARRAY、3 番目のテクスチャ座標を使用して使用するレイヤーを選択することもできます。

次に考えるべきことはインスタンス化です。バッファーに単一のクワッドを配置し、OpenGL にそれを数回描画させます。追加のバッファーを使用して、描画されたインスタンスに基づいてテクスチャ レイヤーと回転を選択します。

于 2013-06-27T17:53:59.100 に答える