前提・実現したいこと
C++ / OpenGL でPCゲームを作りたいと思っています。
ゲームの中で基本となるポリゴン(フィールドマップ描画用の板ポリなど)の情報をvaoを使って、
クラスの中のメンバとして保持しておきたいと考えて下記のコードを書きましたが
実行しても図形が描画されません。(ビルドは通っています)
デバッガで追いかけたところ、「vao[0]」や「programId[0]」には値がしっかり入っていたので、
vaoの中にに情報を保持できていないのではと思っています。
原因が分かる方がいらっしゃいましたら教えていただけますか。
該当のソースコード
main
1int main() { 2 ~略(初期化・ウィンドウ作成処理など) 3 // 要求するOpenGL バージョン指定 4 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 5 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); 6 // 上位互換性を持たせるか (※FALSEにしておく) 7 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE); 8 //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 9 //// プロファイル設定 10 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_ANY_PROFILE); 11 ~略(初期化・ウィンドウ作成処理など) 12 13 //** 描画データ初期作成 14 Vao::init(); 15 Vao::defineFieldPolygon(); 16 17 // メインループ 18 while (glfwWindowShouldClose(window) == GL_FALSE) { 19 20 //バックバッファをクリア 21 glClearColor(0.2f, 0.2f, 0.2f, 0.0f); 22 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 23 glClearDepth(1.0); 24 25 //陰面消去を有効にする 26 glEnable(GL_DEPTH_TEST); 27 28 //描画 29 drawField(); 30 31 //陰面消去を無効にする 32 glDisable(GL_DEPTH_TEST); 33 34 //バックバッファとフロントバッファの入れ替え 35 glfwSwapBuffers(window); 36 glfwPollEvents(); 37 38 } 39 40 glfwTerminate(); 41}
field
1void drawField() { 2 glUseProgram(Vao::programId[0]); 3 glBindVertexArray(Vao::vao[0]); 4 glDrawArrays(GL_QUADS, 0, 4); 5 glBindVertexArray(0); 6}
vao
1//staticメンバの実体 2GLuint Vao::vao[10]; 3GLuint Vao::programId[10]; 4 5void Vao::init() { 6 glGenVertexArrays(10, vao); 7} 8 9/* 10* フィールドの板ポリ描画情報を生成 11* vao[0] 12*/ 13void Vao::defineFieldPolygon() { 14 //** フィールド板ポリ:頂点情報 15 GLfloat vertex[] = { 16 -0.8,0.9,0.0, 17 0.8,0.9,0.0, 18 0.8,-0.9,0.0, 19 -0.8,-0.9,0.0 20 }; 21 22 //**フィールド板ポリ:頂点色情報 23 GLfloat vertex_color[] = { 24 1.0,1.0,1.0,1.0, 25 1.0,1.0,1.0,1.0, 26 1.0,1.0,1.0,1.0, 27 1.0,1.0,1.0,1.0 28 }; 29 30 //** シェーダの読み込み 31 std::string vShaderFileName = R"#(GLSL/simple.vert)#"; 32 std::string fShaderFileName = R"#(GLSL/simple.frag)#"; 33 programId[0] = createShader(vShaderFileName, fShaderFileName); 34 35 //** 描画データ(VBO)作成 36 GLuint* buffer = new GLuint[2]; 37 glGenBuffers(2, buffer); 38 //頂点情報⇒buffer[0] 39 glBindBuffer(GL_ARRAY_BUFFER, buffer[0]); 40 glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(float), vertex, GL_STATIC_DRAW); 41 //頂点色情報⇒buffer[1] 42 glBindBuffer(GL_ARRAY_BUFFER, buffer[1]); 43 glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(float), vertex_color, GL_STATIC_DRAW); 44 glBindBuffer(GL_ARRAY_BUFFER, 0); 45 46 //** VAOを紐づけ 47 glBindVertexArray(vao[0]); 48 49 int posLocation = glGetAttribLocation(programId[0], "position"); 50 glBindBuffer(GL_ARRAY_BUFFER, buffer[0]); 51 glEnableVertexAttribArray(posLocation); 52 glVertexAttribPointer(posLocation, 3, GL_FLOAT, GL_FALSE, 0, 0); 53 54 int colLocation = glGetAttribLocation(programId[0], "color"); 55 glBindBuffer(GL_ARRAY_BUFFER, buffer[1]); 56 glEnableVertexAttribArray(colLocation); 57 glVertexAttribPointer(colLocation, 4, GL_FLOAT, GL_FALSE, 0, 0); 58 59 //** VAOを解放 60 glBindVertexArray(0); 61 62}
vertexShader
1#version 140 2 3attribute vec3 position; 4attribute vec4 color; 5out vec4 c; 6 7void main(void){ 8 c = color; 9 gl_Position = vec4(position,1.0); 10}
fragmentShader
1#version 140 2 3in vec4 c; 4void main(void){ 5 gl_FragColor = c; 6 //gl_FragColor = vec4(1.0,0.0,1.0,1.0); 7} 8
試したこと
vaoを使わずvboのみで描画していた時は図形が表示されていました。
その時はVAOクラスはまだ作っていなく、
vboオブジェクトをmain.cppの中にグローバル変数として記述し、
field.cppの中でexternを付けてvboにアクセスしていました。
(上のコードのVao::defineFieldPolygonでやっていたような処理をField.cppのdrawFieldで行っていた。)
補足情報(FW/ツールのバージョンなど)
Visual Studio 2019
あなたの回答
tips
プレビュー