9

私はスプライトグラフィックスを使用したOpenGL2Dゲームに取り組んでいます。最近、OpenGL ES呼び出しを使用する必要があるとアドバイスされました。これは、OpenGLのサブセットであり、モバイルプラットフォームへの移植がより簡単になるためです。コードの大部分は、次のように定義されているdraw_image関数の呼び出しです。

void draw_img(float x, float y, float w, float h, GLuint tex,float r=1,float g=1, float b=1) {
    glColor3f(r,g,b);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, tex);
    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f( x, y);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(w+x, y);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f( w+x, h+y);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f( x, h+y);
    glEnd();
}

このOpenGLESと互換性を持たせるには、何を変更する必要がありますか?また、シェーダーではなく固定機能を使用しているのは、GLSLをサポートしていないマシンで開発しているためです。

4

1 に答える 1

13

OpenGL ES 1.1では、、、および関数を使用しglVertexPointer()glColorPointer()クワッドglTexCoordPointer()glDrawArrays()描画します。glTexCoord2fOpenGLの実装とは対照的に、組み込みのメソッドを使用するのではなく、クワッドを構成する構造(ベクトル、色、テクスチャ座標)を記述する必要がglVertex2fありglColor3fます。

これがあなたが望むことをするべきいくつかのサンプルコードです。(関数定義で使用した引数名を使用したので、例からコードを移植するのは簡単です。)

まず、クワッドの1つの頂点の構造を定義する必要があります。これにより、クワッド頂点の位置、色、テクスチャ座標が保持されます。

// Define a simple 2D vector
typedef struct Vec2 {
    float x,y;
} Vec2;

// Define a simple 4-byte color
typedef struct Color4B {
    GLbyte r,g,b,a;
};

// Define a suitable quad vertex with a color and tex coords.
typedef struct QuadVertex {
    Vec2 vect;              // 8 bytes
    Color4B color;          // 4 bytes
    Vec2 texCoords;         // 8 bytes
} QuadVertex;

次に、4つの頂点で構成されるクワッド全体を記述する構造を定義する必要があります。

// Define a quad structure
typedef struct Quad {
    QuadVertex tl;
    QuadVertex bl;
    QuadVertex tr;
    QuadVertex br;
} Quad; 

次に、クワッドをインスタンス化し、クワッド頂点情報(位置、色、テクスチャ座標)を割り当てます。

Quad quad;
quad.bl.vect = (Vec2){x,y};
quad.br.vect = (Vec2){w+x,y};
quad.tr.vect = (Vec2){w+x,h+y};
quad.tl.vect = (Vec2){x,h+y};
quad.tl.color = quad.tr.color = quad.bl.color = quad.br.color
              = (Color4B){r,g,b,255};
quad.tl.texCoords = (Vec2){0,0};
quad.tr.texCoords = (Vec2){1,0};
quad.br.texCoords = (Vec2){1,1};
quad.bl.texCoords = (Vec2){0,1};

次に、クワッドの描画方法をOpenGLに指示します。gl...PointerOpenGLに頂点構造の値に対する適切なオフセットとサイズを提供するための呼び出し。これにより、後でその情報を使用してクワッドを描画できます。

// "Explain" the quad structure to OpenGL ES

#define kQuadSize sizeof(quad.bl)    
long offset = (long)&quad;

// vertex
int diff = offsetof(QuadVertex, vect);
glVertexPointer(2, GL_FLOAT, kQuadSize, (void*)(offset + diff));

// color
diff = offsetof(QuadVertex, color);
glColorPointer(4, GL_UNSIGNED_BYTE, kQuadSize, (void*)(offset + diff));

// texCoods
diff = offsetof(QuadVertex, texCoords);
glTexCoordPointer(2, GL_FLOAT, kQuadSize, (void*)(offset + diff));

最後に、テクスチャを割り当ててクワッドを描画します。glDrawArraysOpenGLに、以前に定義されたオフセットをオブジェクトに含まれる値と一緒に使用して、頂点Quadによって定義された形状を描画するように指示します。4

glBindTexture(GL_TEXTURE_2D, tex);

// Draw the quad
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glBindTexture(GL_TEXTURE_2D, 0);

シェーダーが必要ない場合は、OpenGLES1を使用してもまったく問題がないことにも注意してください。ES1とES2の主な違いは、ES2には固定パイプラインがないため、基本的なレンダリング用にマトリックススタックとシェーダーを独自に実装する必要があることです。固定パイプラインによって提供される機能に問題がない場合は、OpenGLES1を使用してください。

于 2012-04-24T14:33:43.647 に答える