初期化
今回はキューブを描画するために、 CULLING(背面消去)と深度テストを有効化しました。
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
頂点シェーダの変更
#version 150
in vec4 vertex;
in vec3 in_color;
out vec3 pass_color;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
void main(void) {
gl_Position = projection_matrix * view_matrix * model_matrix * vertex;
pass_color = in_color;
}
入力変数にin_colorが増えています。
頂点シェーダの入力ですので、頂点情報vertexと同じように
OpenGLへデータを渡すことができます。
変数は上から順にindexが割り振られますので、
vertexが0、in_colorが1となり、
glVertexAttribPointerの第一引数に指定します。
キューブ描画クラス
class Cube {
public:
typedef std::shared_ptr Ptr;
Cube(GLfloat size) {
GLfloat low = -size/2.0f;
GLfloat high = size/2.0f;
GLfloat vertices[3*8] = {
low, low, low,
low, high, low,
high, high, low,
high, low, low,
low, low, high,
low, high, high,
high, high, high,
high, low, high
};
float colors[3*8] = {
0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 0.0f
};
GLuint indecise[6*6] = {
0, 1, 2, 2, 3, 0,
4, 7, 6, 6, 5, 4,
0, 4, 5, 5, 1, 0,
3, 2, 6, 6, 7, 3,
1, 5, 6, 6, 2, 1,
0, 3, 7, 7, 4, 0
};
//VAO(バッファデータ・設定群)の生成
glGenVertexArrays(1, &vertex_array_object_);
//現在のVAOに設定
glBindVertexArray(vertex_array_object_);
//VBO(バッファ)の生成
glGenBuffers(1, &vertex_buffer_object_);
//現在のバッファに設定
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_);
//現在のバッファにデータを送信
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
//データ型の設定(float * 3)
//glVertexPointer(3, GL_FLOAT, 0, 0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(0);
//インデックスの設定
glGenBuffers(1, &index_buffer_object_);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_object_);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indecise), indecise, GL_STATIC_DRAW);
//カラーバッファの生成
glGenBuffers(1, &color_buffer_object_);
glBindBuffer(GL_ARRAY_BUFFER, color_buffer_object_);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(1);
//VAO設定を終了する
glBindVertexArray(0);
}
~Cube() {
glDeleteBuffers(1, &index_buffer_object_);
glDeleteBuffers(1, &vertex_buffer_object_);
glDeleteVertexArrays(1, &vertex_array_object_);
}
void Draw() {
glBindVertexArray(vertex_array_object_);
glDrawElements(GL_TRIANGLES, 6*6, GL_UNSIGNED_INT, nullptr);
glBindVertexArray(0);
}
private:
GLuint vertex_array_object_;
GLuint vertex_buffer_object_;
GLuint index_buffer_object_;
GLuint color_buffer_object_;
};
基本的にはカラーバッファの生成が増えただけです。
ここでのポイントは、glVertexAttribPointerにindex=1を指定することと、
glEnableVertexAttribArrayでindex=1を有効化することです。
今回のサンプルはこちらです。
0 件のコメント:
コメントを投稿