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

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