スポンサーリンク

glsl+GL_TRIANGLE_STRIPでCube

GL_QUADが非推奨になったらしいので(知ってた)GL_TRIANGLE_STRIPで立方体を描きます。

これをやる理由はシェーディングをやりたいんだけどある程度まともな形をしてないと見ても評価ができないから。

インデクスバッファつかうのが正しいのだろうけれどまだできないので面ごとに描きます。

実行結果

※矢印は別

データ定義

データ定義用関数

void set(std::vector<GLfloat>& v, GLfloat x, GLfloat y, GLfloat z) {
  v.push_back(x);
  v.push_back(y);
  v.push_back(z);
}

データ定義部分

  std::vector<GLfloat> vtx;
  std::vector<GLfloat> col;

  double width = 1;
  double m = -width / 2;
  double p = width / 2;
  double xp = p;
  double yp = p;
  double zp = p;
  double xm = m;
  double ym = m;
  double zm = m;
  //(A)
  set(vtx,xp, yp, zm);
  set(vtx,xp, ym, zm);
  set(vtx,xm, yp, zm);
  set(vtx,xm, ym, zm);
  //(B)
  set(vtx, xp, yp, zp);
  set(vtx, xp, ym, zp);
  set(vtx, xp, yp, zm);
  set(vtx, xp, ym, zm);
  //(C) (Aの反対)
  set(vtx, xm, ym, zp);
  set(vtx, xp, ym, zp);
  set(vtx, xm, yp, zp);
  set(vtx, xp, yp, zp);
  //(D)(Bの反対)
  set(vtx, xm, ym, zm);
  set(vtx, xm, ym, zp);
  set(vtx, xm, yp, zm);
  set(vtx, xm, yp, zp);

  //上
  set(vtx, xp, yp, zm);
  set(vtx, xm, yp, zm);
  set(vtx, xp, yp, zp);
  set(vtx, xm, yp, zp);

  //下
  set(vtx, xp, ym, zp);
  set(vtx, xm, ym, zp);
  set(vtx, xp, ym, zm);
  set(vtx, xm, ym, zm);

  //(A)
  set(col, 1.0, 0.0, 0.0);
  set(col, 0.0, 1.0, 0.0);
  set(col, 0.0, 0.0, 1.0);
  set(col, 1.0, 1.0, 1.0);

  //(B)
  set(col, 1.0, 1.0, 0.0);
  set(col, 0.0, 1.0, 1.0);
  set(col, 1.0, 0.0, 0.0);
  set(col, 0.0, 1.0, 0.0);

  //(C) (Aの反対)
  set(col, 1.0, 0.0, 0.0);
  set(col, 0.0, 1.0, 1.0);
  set(col, 0.0, 1.0, 0.0);
  set(col, 1.0, 1.0, 0.0);

  //(D)(Bの反対)
  set(col, 1.0, 1.0, 1.0);
  set(col, 1.0, 0.0, 0.0);
  set(col, 0.0, 0.0, 1.0);
  set(col, 0.0, 1.0, 0.0);

  //上
  set(col, 1.0, 0.0, 0.0);
  set(col, 0.0, 0.0, 1.0);
  set(col, 1.0, 1.0, 0.0);
  set(col, 0.0, 1.0, 0.0);

  //下
  set(col, 0.0, 1.0, 1.0);
  set(col, 1.0, 0.0, 0.0);
  set(col, 0.0, 1.0, 0.0);
  set(col, 1.0, 1.0, 1.0);


  glGenBuffers(1, &buf_v_name);
  glBindBuffer(GL_ARRAY_BUFFER, buf_v_name);
  glBufferData(
    GL_ARRAY_BUFFER,
    4 * 6 * 3 * sizeof(GLfloat),
    &vtx[0],
    GL_STATIC_DRAW
  );

  glGenBuffers(1, &buf_c_name);
  glBindBuffer(GL_ARRAY_BUFFER, buf_c_name);
  glBufferData(
    GL_ARRAY_BUFFER,
    4 * 6 * 3 * sizeof(GLfloat),
    &col[0],
    GL_STATIC_DRAW
  );

描画部分

  glUseProgram(m_shader.getProgramID());
  // 頂点バッファ:頂点
  glEnableVertexAttribArray(0);
  glBindBuffer(GL_ARRAY_BUFFER, buf_v_name);
  glVertexAttribPointer(
    0,                  // シェーダ内のlayoutとあわせる
    3, // 1要素の要素数(x,y,z)で3要素
    GL_FLOAT,           // タイプ
    GL_FALSE,           // 正規化しない(データが整数型の時)
    0,                  // ストライド
    (void*)0            // 配列バッファオフセット
  );

  // カラーバッファを有効にする
  glEnableVertexAttribArray(1);
  glBindBuffer(GL_ARRAY_BUFFER, buf_c_name);
  glVertexAttribPointer(
    1,                  // シェーダ内のlayoutとあわせる
    3, // 1要素の要素数(r,g,b)で3要素
    GL_FLOAT,           // タイプ
    GL_FALSE,           // 正規化しない(データが整数型の時)
    0,                  // ストライド
    (void*)0            // 配列バッファオフセット
  );


  glEnable(GL_CULL_FACE);

  // 三角形を描きます!
  glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
  glDrawArrays(GL_TRIANGLE_STRIP, 8, 4);
  glDrawArrays(GL_TRIANGLE_STRIP, 12, 4);
  glDrawArrays(GL_TRIANGLE_STRIP, 16, 4);
  glDrawArrays(GL_TRIANGLE_STRIP, 20, 4);
  glDisableVertexAttribArray(0);
  glDisableVertexAttribArray(1);


  glUseProgram(0);

シェーダ

両方とも特に変わったことはしていない

頂点シェーダ

#version 460 core

layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 color;

//行列
uniform mat4 gl_ModelViewMatrix;  //モデルビュー行列
uniform mat4 gl_ProjectionMatrix; //透視投影変換行列

out vec3 c; //色の出力先

void main()
{
  gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(aPos, 1.0);
  c = color;
}

フラグメントシェーダ

#version 460 core

out vec4 FragColor;

in vec3 c;

void main()
{
  FragColor = vec4( c , 1.0);
} 

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: