🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

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

Q&A

解決済

1回答

1857閲覧

[OpenGL]VAO VBO が上書きされてしまう?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

1クリップ

投稿2020/12/27 08:46

編集2020/12/27 13:08

以下の提示コードですがなぜ最後に描画指定したvoid GenerateOutput();したインスタンスのみが画面に表示されるのでしょうか?
か描画でバッファーを指定してテクスチャも設定しているのですができない理由がわかりません最後にテクスチャとバッファーの指定を解除しているのでどうすればいいのかわかりません。Github通りにコードを作って見ましたがどうすればいいのかわかりません。

Github: https://github.com/Minganna/Shadow_Assignment/blob/43109e9d632c70304556390e403728da3202e494/src/Mesh.cpp
例 インスタンスを2つ生成して2つとも描画しようとすると最後に描画されたものしか描画されません。

cpp

1 2// コンストラクタ 3Mesh::Mesh(class Game* g, const char* texture, std::vector<Game::VertexAttribute> &vert, std::vector<unsigned int> &idx) : Transform(g) 4{ 5 6 Mesh::static_MeshNumber++; //インスタンス番号を管理 7 mDebug = new Debug_Log("Mesh_Number_%d.txt",static_MeshNumber); //デバッグログ 8 9 Owner = g; //Game 10 vertex = &vert; //頂点配列 11 index = &idx; //インデックス配列 12 Texture = (char*)texture; //テクスチャ 13 shader = new Shader(g, "Shader/3D/Basic.vert", "Shader/3D/Basic.frag"); //シェーダー 14 15 16 if (Owner == nullptr) 17 { 18 mDebug->Write("Owner変数がnullptrです。\n"); 19 } 20 21 if (vertex == nullptr) 22 { 23 mDebug->Write("頂点配列がnullptrです。\n"); 24 } 25 26 if (index == nullptr) 27 { 28 mDebug->Write("インデックス配列がnullptrです。\n"); 29 } 30 31 if (texture == nullptr) 32 { 33 mDebug->Write("テクスチャが設定されていません。nullptrです。\n"); 34 } 35 36 37 // Trnasformを初期化 38 /* 回転 * 拡大縮小 * 座標 */ 39 Rotate = glm::vec3(0, 0, 0); 40 Scale = glm::vec3(1, 1, 1); 41 Position = glm::vec3(0, 0, 0); 42 Transform::setUpdateTransform(Rotate,Scale,Position); 43 44 //VAO 45 glGenVertexArrays(1, &VAO); 46 glBindVertexArray(VAO); 47 48 //VBO 49 glGenBuffers(1, &VBO); 50 glBindBuffer(GL_ARRAY_BUFFER, VBO); 51 glBufferData(GL_ARRAY_BUFFER, std::size(*vertex) * sizeof(Game::VertexAttribute), std::data(*vertex) ,GL_STATIC_DRAW); 52 53 //頂点座標 54 glEnableVertexAttribArray(0); 55 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), NULL); 56 57 //UV座標 58 glEnableVertexAttribArray(1); 59 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 3)); 60 61 //法線 62 glEnableVertexAttribArray(2); 63 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 5)); 64 65 //IBO 66 glGenBuffers(1, &IBO); 67 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO); 68 glBufferData(GL_ELEMENT_ARRAY_BUFFER, std::size(*index) * sizeof(unsigned int),std::data(*index),GL_STATIC_DRAW); 69 70 //テクスチャを設定 71 glGenTextures(1, &TextureID); 72 glBindTexture(GL_TEXTURE_2D, TextureID); 73 74 int width, height, numComponents; 75 unsigned char* data = stbi_load((texture), &width, &height, &numComponents, 4); 76 if (data != NULL) { 77 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 78 } 79 else { 80 std::cerr << "Unable to load texture: " << texture << std::endl; 81 } 82 83 //ミニマップを設定 84 glGenerateMipmap(GL_TEXTURE_2D); 85 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 86 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 87 88 //異方性フィルタリングを設定 89 GLfloat largest; 90 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest); 91 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest); 92 93 stbi_image_free(data); 94 95 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 96 glBindVertexArray(0); 97} 98 99 100// 描画 101void Mesh::GenerateOutput() 102{ 103 glBindVertexArray(VAO); 104 glBindTexture(GL_TEXTURE_2D, TextureID); 105 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO); 106 107 glDrawElements(GL_TRIANGLES, (GLsizei)index->size(), GL_UNSIGNED_INT, 0); 108 109 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 110 glBindVertexArray(0); 111 112}; 113 114

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

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

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

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

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

guest

回答1

0

ベストアンサー

シェーダーを有効にする処理をUpdate部に書いていたため最後に描画部で最後に描画されたものに適用されてしまってました。

cpp

1 2// 描画 3void Mesh::GenerateOutput() 4{ 5 DrawUpdateShader(); 6 glBindVertexArray(VAO); 7 glBindTexture(GL_TEXTURE_2D, TextureID); 8 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO); 9 10 glDrawElements(GL_TRIANGLES, (GLsizei)index->size(), GL_UNSIGNED_INT, 0); 11 12 13 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 14 glBindVertexArray(0); 15 glBindTexture(GL_TEXTURE_2D, 0); 16 17 //shader->Disable(); 18}; 19 20 21// 更新 22void Mesh::Update() 23{ 24 25} 26 27 28// シェーダーを更新 29void Mesh::DrawUpdateShader() 30{ 31 shader->Enable(); 32 33 Transform::setUpdateTransform(Rotate, Scale, Position); 34 shader->SetFloatUniform_4m("uViewMatrix", Owner->mCamera->getViewMatrix()); 35 shader->SetFloatUniform_4m("uWorldMatrix", Transform::getWorldMatrix()); 36 37} 38

投稿2020/12/29 02:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問