2010年5月20日木曜日

三角形の描画

Open GLで三角形を描画するには、glVertexPointer関数、glColorPointer関数、glEnableClientState関数、glDrawArrays関数を使用します。


void glVertexPointer( (GLint)頂点1つあたりの配列の要素数, (GLenum)頂点配列のタイプ, 配列の開始位置, 配列へのポインタ);
最初に頂点の座標を格納した配列をOpen GLに登録します。


void glEnableClientState( GLenum );
頂点を登録したことをOpen GLに通知します。
引数には、登録した配列のタイプを指定します。


void glColorPointer( (GLint)頂点1つあたりの配列の要素数, (GLenum)頂点配列のタイプ, 配列の開始位置, 配列へのポインタ);
頂点の色を登録します。


void glDrawArrays( (GLenum)描画モード, (GLint)描画を開始する配列のインデックス, (GLint) 描画する頂点の数);
描画します。


    const GLfloat triangleVerteces[] = {
        -0.5f, -0.5f,
         0.5f, -0.5f,
         0.0f,  0.5f,
    };
    const GLubyte triangleColors[] = {
        255, 0, 0, 255,
        255, 0, 0, 255,
        255, 0, 0, 255,
    };
   
    // 頂点座標を登録
    glVertexPointer(2, GL_FLOAT, 0, triangleVerteces);
    glEnableClientState(GL_VERTEX_ARRAY);
   
    // 頂点色を登録
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, triangleColors);
    glEnableClientState(GL_COLOR_ARRAY);
   
    // 描画
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);

上の例では、赤い三角形が1つ描画されます。
頂点座標の配列(triangleVertices)にX, Y座標のみを与え、Z座標は省きました。このため、glVertexPointer関数の第一引数(頂点1つあたりの配列の要素数)は2(X座標とY座標の2つ)としています。
また、triangleColors配列にはR, G, B, Aの色(Aはアルファ値)を保持しています。
後は、配列の型(GL_FLOAT, GL_UNSIGNED_BYTE等)と配列の開始インデックス(0)、配列アドレスを与えてglVertexPointer,glColorPointerを呼び出します。
glEnableClientState関数には、それぞれ頂点座標を与えるときにはGL_VERTEX_ARRAYを、色配列を与える時はGL_COLOR_ARRAYを与えます。
最後にglDrawArrayで配列に指定した座標と色で描画します。
第1引数の描画モードとは、頂点座標をつなげて描画を行うか(GL_TRIANGLE_STRIP)、ばらばらの三角形として描画を行うか(GL_TRIANGLES)、線分として描画を行う(GL_LINES)かの描画モードを指定します。
例えば、座標が4つ指定してある場合、GL_TRIANGLE_STRIPが指定してあると0番目〜2番目までの頂点を使って三角形を描画し、1番目〜3番目までの頂点を使って三角形を描画するというように、次の頂点と前の三角形とを順次つなげながら描画を行います。
GL_TRIANGLESが指定してあると、0番目〜2番目までの頂点を使って三角形を描画し、3番目〜5番目までの頂点を使って三角形を描画します。
GL_LINESが指定してある場合は、0〜1番目の頂点をつなぐ線分、2〜3番目をつなぐ線分というように、ばらばらの線が描画されます。

0 件のコメント:

コメントを投稿