///**********************************************//**
/// 頂点属性を頂点シェーダに渡します。
/// ここではシェーダのコンパイルとリンクは省略されています。
///**********************************************//**
// バッファオブジェクトへのハンドル
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();
}