※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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

glDrawArrays


目次


概要

void glDrawArrays(GLenum mode, GLint first, GLsizei count);

属性配列からプリミティブのレンダリングを行います。
頂点インデックスを指定したい場合には glDrawElements を使用してください。

第 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 引数 first には配列内の開始インデックスを指定します。
第 3 引数 count には要素数を指定します。


エラー

  • GL_INVALID_ENUM
    • 第 1 引数 mode が許可されている値でない場合に生成されます。
  • GL_INVALID_VALUE
    • 第 3 引数 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.



サンプルコード

以下に、バッファオブジェクトを生成して頂点属性を転送する C++ コードの例を示します。
///**********************************************//**
/// 頂点属性を頂点シェーダに渡します。
/// ここではシェーダのコンパイルとリンクは省略されています。
///**********************************************//**
 
// バッファオブジェクトへのハンドル
GLuint position_buffer;
GLuint color_buffer;
 
// 頂点配列オブジェクトへのハンドル
GLuint vao;
 
// バッファオブジェクトの生成
void CreateBufferObject()
{
    // 三角形ポリゴンの位置と色に対応する頂点属性の定義
    float positions[] = { -0.5f, -0.5f, 0.0f,    0.5f, -0.5f, 0.0f,    0.5f,  0.5f, 0.0f };
    float colors[] =    {  1.0f,  0.0f, 0.0f,    0.0f,  1.0f, 0.0f,    0.0f,  0.0f, 1.0f };
 
    // バッファオブジェクトの生成
    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) * 9, positions, GL_STATIC_DRAW);
 
    // 頂点色をバッファオブジェクトに転送
    glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 9, 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);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    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 リファレンス(英語)です。


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

すべてのコメントを見る