質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

760閲覧

vaoオブジェクトをクラスのメンバ変数として保持したい

YS789789YS

総合スコア0

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/01/13 16:28

編集2021/01/13 17:15

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問