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); }