2013年7月5日金曜日

カラー描画

初期化

今回はキューブを描画するために、 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_;
};

基本的にはカラーバッファの生成が増えただけです。
ここでのポイントは、glVertexAttribPointerindex=1を指定することと、 glEnableVertexAttribArrayindex=1を有効化することです。


今回のサンプルはこちらです。

0 件のコメント:

コメントを投稿