更新日時:2013-06-15 23:53:54 (Sat)アクセス数: -

glDrawElements


目次


概要

void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);

属性配列からプリミティブのレンダリングを行います。
glDrawArrays によく似ていますが、この API では頂点インデックスを指定することができる点が異なります。

第 1 引数 mode では以下の定数を利用してプリミティブの種類を指定します。
定数 注釈
GL_POINTS
GL_LINE_STRIP
GL_LINE_LOOP
GL_LINE_LINES
GL_LINE_STRIP_ADJACENCY OpenGL 3.2 以上で利用できます
GL_LINE_ADJACENCY OpenGL 3.2 以上で利用できます
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_TRIANGLES
GL_TRIANGLE_STRIP_ADJACENCY OpenGL 3.2 以上で利用できます
GL_TRIANGLES_ADJACENCY OpenGL 3.2 以上で利用できます
GL_PATCHES

第 2 引数 count には要素数を指定します。
第 3 引数 type では第 4 引数 indices の型を指定します。
GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT のいずれかを指定しなければなりません。
第 4 引数 indices では頂点インデックスを格納した配列を指定します。


エラー

  • GL_INVALID_ENUM
    • 第 1 引数 mode が許可されている値でない場合に生成されます。
  • GL_INVALID_VALUE
    • 第 2 引数 count が負である場合に生成されます。
  • GL_INVALID_OPERATION
    • ジオメトリシェーダが有効で現在のプログラムが入力されたプリミティブタイプに互換性が無い場合に発生します
    • generated if a non-zero buffer object name is bound to an enabled array and the buffer object's data store is currently mapped.



サンプルコード

以下に、頂点インデックスを指定してレンダリングするコードの例を示します。
より実用的には、8 頂点だけから立方体をレンダリングする例が考えられます。
///**********************************************//**
/// 頂点インデックスを指定して四角形をレンダリングします。
/// ここではシェーダのコンパイルとリンクは省略されています。
///**********************************************//**
 
// バッファオブジェクトへのハンドル
GLuint position_buffer;
GLuint color_buffer;
 
// 頂点配列オブジェクトへのハンドル
GLuint vao;
 
// 四角形ポリゴンの位置・色・頂点インデックスの定義
float positions[] = {
    -0.5f, -0.5f, -0.5f,    +0.5f, -0.5f, -0.5f,    +0.5f, +0.5f, -0.5f,    -0.5f, +0.5f, -0.5f
};
float colors[] = {
     1.0f,  0.0f,  0.0f,     1.0f,  1.0f,  0.0f,     0.0f,  1.0f,  0.0f,     0.0f,  1.0f,  1.0f,
};
unsigned int indices[] = {
     1,2,0,3
};
 
// バッファオブジェクトの生成
void CreateBufferObject()
{
    // バッファオブジェクトの生成
    GLuint vbo[2];
    glGenBuffers(2, vbo);
    position_buffer = vbo[0];
    color_buffer = vbo[1];
 
    // 頂点位置をバッファオブジェクトに転送
    glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 24, positions, GL_STATIC_DRAW);
 
    // 頂点色をバッファオブジェクトに転送
    glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 24, colors, GL_STATIC_DRAW);
}
 
// 頂点シェーダの入力属性とバッファオブジェクトを対応付ける
void BindVertexAttribute()
{
    // 頂点シェーダの vertex_position と vertex_color に属性インデックス 0, 1 をマッピング
    glBindAttribLocation(program, 0, "vertex_position");
    glBindAttribLocation(program, 1, "vertex_color");
 
    // フラグメントシェーダの出力変数をマッピング
    glBindFragDataLocation(program, 0, "fragment_color");
 
    // 頂点配列オブジェクトを 1 つ作成してバインド
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
 
    // 頂点位置と頂点色のそれぞれについて頂点属性配列を有効化
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
 
    // バッファオブジェクトに転送した頂点位置をインデックス 0 に関連付ける
    glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);
 
    // バッファオブジェクトに転送した頂点色をインデックス 1 に関連付ける
    glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);
}
 
// レンダリング
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(vao);
    glDrawElements(GL_TRIANGLE_STRIP, sizeof(indices)/sizeof(indices[0]), GL_UNSIGNED_INT, indices);
    glFlush();
}
 


参考文献

OpenGLに関連するオススメの本や WEB サイトを紹介します.
ページ右の画像をクリックすると Amazon で参考文献を購入できます.

OpenGL策定委員会, 「OpenGLプログラミングガイド 原著第5版」, ピアソンエデュケーション
  • OpenGLの赤本(Red Book)と呼ばれる定番の参考書の日本語版です。
  • 少し値は張りますがOpenGLの基本的な使い方が丁寧にまとめられています。
  • 初心者の方には敷居が高いかもしれませんがOpenGLを極めるつもりなら必須の教本だと思います。

Mark Segal, Kurt Akeley, Jon Leech, 「OpenGL4.0グラフィックスシステム」, カットシステム
  • OpenGLの仕様書の日本語訳です。個人的には翻訳に違和感を覚えることはありませんでした。
  • 英語が苦手な方は本書をAPIリファレンスの代わりに利用できます。
  • チュートリアルのような内容は含まれていませんので他の書籍との併用をオススメします。

床井 浩平, 「GLUTによるOpenGL入門」, 工学社
  • これから OpenGL を初めようとしている方にはこの本がオススメです。
  • おそらく OpenGL に関する文献の中では最も敷居が低く 3DCG に関する知識が全くなくても理解しやすいです。
  • 少し内容は古いかもしれませんが導入という目的では最高の文献で、私もこの本から OpenGL に入門しました。

床井 浩平, 「GLUTによるOpenGL入門2 テクスチャマッピング」, 工学社
  • 上の「GLUT によるOpenGL入門」の続編です。
  • 前作の内容では物足りなかった方は本書を読むことで 3DCG の表現力が大幅に広がります。
  • 引き続き平易な内容となっており、前作を読破した方であれば難なく理解できると思います。

David Wolff , 「OpenGL 4.0 シェーディング言語 -実例で覚えるGLSLプログラミング-」, ボーンデジタル
  • 最近のゲームに見られるようなリアルな映像をつくりだすにはプログラマブル・シェーダという機能が欠かせません。
  • 床井 浩平さんの「GLUTによるOpenGL入門2 テクスチャマッピング」でもシェーダに関しては少しだけ触れられていますが、書籍の後半で軽く紹介されているだけでいささか物足りない内容ではありますので、本格的に学ぶためにこの本の購入をオススメします。
  • 公式の API リファレンス(英語)です。


質問・コメント欄
名前:
コメント:

すべてのコメントを見る

最終更新:2013年06月15日 23:53