///**********************************************//**
/// インタリーブ配列を利用して三角形をレンダリングします。
///
/// 頂点位置と頂点色の配列を別々に用意する場合とくらべて参照の局所性に優れるため、
/// キャッシュメモリのヒット率が向上してパフォーマンスを改善できる可能性があります。
///
/// ここではシェーダのコンパイルとリンクは省略されています。
///**********************************************//**
// バッファオブジェクトへのハンドル
GLuint vertex_buffer;
// 頂点配列オブジェクトへのハンドル
GLuint vao;
// 三角形ポリゴンの頂点位置と頂点色を交互に指定する配列
float vertices[] = {
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,
+0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 0.0f,
+0.5f, +0.5f, 0.0f, 0.0f, 1.0f, 0.0f
};
// バッファオブジェクトの生成
void CreateBufferObject()
{
// バッファオブジェクトの生成
glGenBuffers(1, &vertex_buffer);
// 頂点位置と頂点色をまとめてバッファオブジェクトに転送
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, 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, vertex_buffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 24, (GLubyte*)(NULL + 0));
// バッファオブジェクトに転送した頂点色をインデックス 1 に関連付ける
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 24, (GLubyte*)(NULL + 12));
}
// レンダリング
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
glFlush();
}
///**********************************************//**
/// 頂点インデックスを指定して四角形をレンダリングします。
/// ここではシェーダのコンパイルとリンクは省略されています。
///**********************************************//**
// バッファオブジェクトへのハンドル
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();
}
定数 | 注釈 |
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 |
///**********************************************//**
/// 頂点インデックスを指定して四角形をレンダリングします。
/// ここではシェーダのコンパイルとリンクは省略されています。
///**********************************************//**
// バッファオブジェクトへのハンドル
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();
}
///**********************************************//**
/// シェーダの出力変数の色番号をレイアウト修飾子で指定します。
///**********************************************//**
#version 400
in vec3 color; // 頂点シェーダの出力を補間して生成された色情報
layout (location = 0) out vec4 fragment_color; // 最終的なフラグメントシェーダの出力色(色番号0)
void main()
{
fragment_color = vec4(color, 1.0);
}
///**********************************************//**
/// シェーダの入力変数の属性インデックスをレイアウト修飾子で指定します。
///**********************************************//**
#version 400
layout (location = 0) in vec3 vertex_position; // OpenGL プログラムからの頂点位置の入力(属性インデックス0)
layout (location = 1) in vec3 vertex_color; // OpenGL プログラムからの頂点色の入力(属性インデックス1)
out vec3 color; // フラグメントシェーダへの頂点色の出力
void main()
{
color = vertex_color;
gl_Position = vec4( vertex_position, 1.0 );
}