質問編集履歴

5 タイトルを修正しました。

退会済みユーザー

退会済みユーザー

2020/12/27 22:08  投稿

[OpenGL]最後に描画したものしか描画されない原因と理由が知りたい。
[OpenGL]VAO VBO が上書きされてしまう?
以下の提示コードですがなぜ最後に描画指定したvoid GenerateOutput();したインスタンスのみが画面に表示されるのでしょうか?
か描画でバッファーを指定してテクスチャも設定しているのですができない理由がわかりません最後にテクスチャとバッファーの指定を解除しているのでどうすればいいのかわかりません。Github通りにコードを作って見ましたがどうすればいいのかわかりません。
Github: https://github.com/Minganna/Shadow_Assignment/blob/43109e9d632c70304556390e403728da3202e494/src/Mesh.cpp
例 インスタンスを2つ生成して2つとも描画しようとすると最後に描画されたものしか描画されません。
```cpp
// コンストラクタ
Mesh::Mesh(class Game* g, const char* texture, std::vector<Game::VertexAttribute> &vert, std::vector<unsigned int> &idx) : Transform(g)
{
Mesh::static_MeshNumber++; //インスタンス番号を管理
mDebug = new Debug_Log("Mesh_Number_%d.txt",static_MeshNumber); //デバッグログ
Owner = g; //Game
vertex = &vert; //頂点配列
index = &idx; //インデックス配列
Texture = (char*)texture; //テクスチャ
shader = new Shader(g, "Shader/3D/Basic.vert", "Shader/3D/Basic.frag"); //シェーダー
if (Owner == nullptr)
{
mDebug->Write("Owner変数がnullptrです。\n");
}
if (vertex == nullptr)
{
mDebug->Write("頂点配列がnullptrです。\n");
}
if (index == nullptr)
{
mDebug->Write("インデックス配列がnullptrです。\n");
}
if (texture == nullptr)
{
mDebug->Write("テクスチャが設定されていません。nullptrです。\n");
}
// Trnasformを初期化
/* 回転 * 拡大縮小 * 座標 */
Rotate = glm::vec3(0, 0, 0);
Scale = glm::vec3(1, 1, 1);
Position = glm::vec3(0, 0, 0);
Transform::setUpdateTransform(Rotate,Scale,Position);
//VAO
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
//VBO
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, std::size(*vertex) * sizeof(Game::VertexAttribute), std::data(*vertex) ,GL_STATIC_DRAW);
//頂点座標
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), NULL);
//UV座標
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 3));
//法線
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 5));
//IBO
glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, std::size(*index) * sizeof(unsigned int),std::data(*index),GL_STATIC_DRAW);
//テクスチャを設定
glGenTextures(1, &TextureID);
glBindTexture(GL_TEXTURE_2D, TextureID);
int width, height, numComponents;
unsigned char* data = stbi_load((texture), &width, &height, &numComponents, 4);
if (data != NULL) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
}
else {
std::cerr << "Unable to load texture: " << texture << std::endl;
}
//ミニマップを設定
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//異方性フィルタリングを設定
GLfloat largest;
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest);
stbi_image_free(data);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
// 描画
void Mesh::GenerateOutput()
{
glBindVertexArray(VAO);
glBindTexture(GL_TEXTURE_2D, TextureID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glDrawElements(GL_TRIANGLES, (GLsizei)index->size(), GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
};
```
  • C++

    8434 questions

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

4 文章を修正しました。

退会済みユーザー

退会済みユーザー

2020/12/27 21:30  投稿

[OpenGL]最後に描画したものしか描画されない原因と理由が知りたい。
以下の提示コードですがなぜ最後に描画指定したvoid GenerateOutput();したインスタンスのみが画面に表示されるのでしょうか?
多分バッファーに上書きされていると思うのですがどうすれば別のバッファーとして捉える事ができるのでしょうか?何をしていないためこうなるのでしょうか?調べましたが 検討が付きません。また参考サイトのGithubを見ながら自分のコードを比較しましたが何も間違えていないと思うのですがどうすればいいのでしょうか?
か描画でバッファーを指定してテクスチャも設定しているのですができない理由がわかりません最後にテクスチャとバッファーの指定を解除しているのでどうすればいいのかわかりません。Github通りにコードを作って見ましたがどうすればいいのかわかりません。
Github: https://github.com/Minganna/Shadow_Assignment/blob/43109e9d632c70304556390e403728da3202e494/src/Mesh.cpp
例 インスタンスを2つ生成して2つとも描画しようとすると最後に描画されたものしか描画されません。
```cpp
// コンストラクタ
Mesh::Mesh(class Game* g, const char* texture, std::vector<Game::VertexAttribute> &vert, std::vector<unsigned int> &idx) : Transform(g)
{
   Mesh::static_MeshNumber++;                                       //インスタンス番号を管理
   mDebug = new Debug_Log("Mesh_Number_%d.txt",static_MeshNumber);   //デバッグログ
   Owner = g;                                                               //Game
   vertex = &vert;                                                           //頂点配列
   index = &idx;                                                           //インデックス配列
   Texture = (char*)texture;                                               //テクスチャ
   shader = new Shader(g, "Shader/3D/Basic.vert", "Shader/3D/Basic.frag");   //シェーダー
   if (Owner == nullptr)
   {
       mDebug->Write("Owner変数がnullptrです。\n");
   }
   
   if (vertex == nullptr)
   {
       mDebug->Write("頂点配列がnullptrです。\n");
   }
   if (index == nullptr)
   {
       mDebug->Write("インデックス配列がnullptrです。\n");
   }
   if (texture == nullptr)
   {
       mDebug->Write("テクスチャが設定されていません。nullptrです。\n");
   }
   // Trnasformを初期化
   /* 回転 * 拡大縮小 * 座標 */
   Rotate = glm::vec3(0, 0, 0);
   Scale = glm::vec3(1, 1, 1);
   Position = glm::vec3(0, 0, 0);
   Transform::setUpdateTransform(Rotate,Scale,Position);
   //VAO
   glGenVertexArrays(1, &VAO);
   glBindVertexArray(VAO);
   //VBO
   glGenBuffers(1, &VBO);
   glBindBuffer(GL_ARRAY_BUFFER, VBO);
   glBufferData(GL_ARRAY_BUFFER, std::size(*vertex) * sizeof(Game::VertexAttribute), std::data(*vertex) ,GL_STATIC_DRAW);
   //頂点座標
   glEnableVertexAttribArray(0);
   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), NULL);   
   
   //UV座標   
   glEnableVertexAttribArray(1);
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 3));
   //法線
   glEnableVertexAttribArray(2);
   glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 5));
   //IBO
   glGenBuffers(1, &IBO);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
   glBufferData(GL_ELEMENT_ARRAY_BUFFER, std::size(*index) * sizeof(unsigned int),std::data(*index),GL_STATIC_DRAW);
   
   //テクスチャを設定   
   glGenTextures(1, &TextureID);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   int width, height, numComponents;
   unsigned char* data = stbi_load((texture), &width, &height, &numComponents, 4);
   if (data != NULL) {
       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
   }
   else {
       std::cerr << "Unable to load texture: " << texture << std::endl;
   }
   //ミニマップを設定
   glGenerateMipmap(GL_TEXTURE_2D);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   //異方性フィルタリングを設定
   GLfloat largest;
   glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest);
   stbi_image_free(data);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
   glBindVertexArray(0);
}
// 描画
void Mesh::GenerateOutput()
{   
   glBindVertexArray(VAO);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
   glDrawElements(GL_TRIANGLES, (GLsizei)index->size(), GL_UNSIGNED_INT, 0);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
   glBindVertexArray(0);
};
```
  • C++

    8434 questions

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

3 文章にGithubを追加しました。

退会済みユーザー

退会済みユーザー

2020/12/27 20:16  投稿

[OpenGL]最後に描画したものしか描画されない原因と理由が知りたい。
以下の提示コードですがなぜ最後に描画指定したvoid GenerateOutput();したインスタンスのみが画面に表示されるのでしょうか?
多分バッファーに上書きされていると思うのですがどうすれば別のバッファーとして捉える事ができるのでしょうか?何をしていないためこうなるのでしょうか?調べましたが 検討が付きません。
多分バッファーに上書きされていると思うのですがどうすれば別のバッファーとして捉える事ができるのでしょうか?何をしていないためこうなるのでしょうか?調べましたが 検討が付きません。また参考サイトのGithubを見ながら自分のコードを比較しましたが何も間違えていないと思うのですがどうすればいいのでしょうか?
Github: https://github.com/Minganna/Shadow_Assignment/blob/43109e9d632c70304556390e403728da3202e494/src/Mesh.cpp
例 インスタンスを2つ生成して2つとも描画しようとすると最後に描画されたものしか描画されません。
```cpp
//標準ヘッダー 関係  
#include <iostream>  
 
//自作ヘッダー 関係  
#include "../Header/Game.hpp"  
#include "../Header/TransformComponent.hpp"  
#include "../Header/MeshComponent.hpp"  
 
//OpenGL 関係  
#include "GLEW/include/GL/glew.h"  
#include "gl/GL.h"  
#include "GLFW/include/GLFW/glfw3.h"  
 
//数学ライブラリ  
#include "glm/glm.hpp"  
#include "glm/gtx/euler_angles.hpp"  
#include <glm/gtx/quaternion.hpp>  
 
unsigned int Mesh::static_MeshNumber = 0;   //インスタンス番号を管理  
 
/*###########################################################################################  
* Game::VertexAttribute  
############################################################################################*/  
class Game;  
// コンストラクタ
Mesh::Mesh(class Game* g, const char* texture, std::vector<Game::VertexAttribute> &vert, std::vector<unsigned int> &idx) : Transform(g)
{
   Mesh::static_MeshNumber++;                                       //インスタンス番号を管理
   mDebug = new Debug_Log("Mesh_Number_%d.txt",static_MeshNumber);   //デバッグログ
   Owner = g;                                                               //Game
   vertex = &vert;                                                           //頂点配列
   index = &idx;                                                           //インデックス配列
   Texture = (char*)texture;                                               //テクスチャ
   shader = new Shader(g, "Shader/3D/Basic.vert", "Shader/3D/Basic.frag");   //シェーダー
   if (Owner == nullptr)
   {
       mDebug->Write("Owner変数がnullptrです。\n");
   }
   
   if (vertex == nullptr)
   {
       mDebug->Write("頂点配列がnullptrです。\n");
   }
   if (index == nullptr)
   {
       mDebug->Write("インデックス配列がnullptrです。\n");
   }
   if (texture == nullptr)
   {
       mDebug->Write("テクスチャが設定されていません。nullptrです。\n");
   }
   // Trnasformを初期化
   /* 回転 * 拡大縮小 * 座標 */
   Rotate = glm::vec3(0, 0, 0);
   Scale = glm::vec3(1, 1, 1);
   Position = glm::vec3(0, 0, 0);
   Transform::setUpdateTransform(Rotate,Scale,Position);
   //VAO
   glGenVertexArrays(1, &VAO);
   glBindVertexArray(VAO);
   //VBO
   glGenBuffers(1, &VBO);
   glBindBuffer(GL_ARRAY_BUFFER, VBO);
   glBufferData(GL_ARRAY_BUFFER, std::size(*vertex) * sizeof(Game::VertexAttribute), std::data(*vertex) ,GL_STATIC_DRAW);
   //頂点座標
   glEnableVertexAttribArray(0);  
   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), NULL);   
   glEnableVertexAttribArray(0);  
   
   //UV座標   
   glEnableVertexAttribArray(1);  
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 3));
   glEnableVertexAttribArray(1);  
   //法線
   glEnableVertexAttribArray(2);  
   glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 5));
   glEnableVertexAttribArray(2);  
   //IBO
   glGenBuffers(1, &IBO);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
   glBufferData(GL_ELEMENT_ARRAY_BUFFER, std::size(*index) * sizeof(unsigned int),std::data(*index),GL_STATIC_DRAW);
   
   //テクスチャを設定   
   glGenTextures(1, &TextureID);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   int width, height, numComponents;
   unsigned char* data = stbi_load((texture), &width, &height, &numComponents, 4);
   if (data != NULL) {
       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
   }
   else {
       std::cerr << "Unable to load texture: " << texture << std::endl;
   }
   //ミニマップを設定
   glGenerateMipmap(GL_TEXTURE_2D);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   //異方性フィルタリングを設定
   GLfloat largest;
   glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest);
   stbi_image_free(data);
 
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);  
   glBindVertexArray(0);  
}
 
// 描画
void Mesh::GenerateOutput()
{   
   glBindVertexArray(VAO);   
   glBindVertexArray(VAO);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   glDrawElements(GL_TRIANGLES, (GLsizei)index->size(), GL_UNSIGNED_INT, NULL);   
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
   glDrawElements(GL_TRIANGLES, (GLsizei)index->size(), GL_UNSIGNED_INT, 0);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
   glBindVertexArray(0);
};
 
 
```
  • C++

    8434 questions

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

2 文章を修正しました。

退会済みユーザー

退会済みユーザー

2020/12/27 20:13  投稿

以下の提示コードですがなぜ最後に描画指定したvoid GenerateOutput();したインスタンスのみが画面に表示されるのでしょうか?
多分バッファーに上書きされていると思うのですがどうすれば別のバッファーとして捉える事ができるのでしょうか?何をしていないためこうなるのでしょうか?調べましたが 検討が付きません。
原因と対処方法が知りたいです。  
例 インスタンスを2つ生成して2つとも描画しようとすると最後に描画されたものしか描画されません。  
```cpp
//標準ヘッダー 関係
#include <iostream>
//自作ヘッダー 関係
#include "../Header/Game.hpp"
#include "../Header/TransformComponent.hpp"
#include "../Header/MeshComponent.hpp"
//OpenGL 関係
#include "GLEW/include/GL/glew.h"
#include "gl/GL.h"
#include "GLFW/include/GLFW/glfw3.h"
//数学ライブラリ
#include "glm/glm.hpp"
#include "glm/gtx/euler_angles.hpp"
#include <glm/gtx/quaternion.hpp>
unsigned int Mesh::static_MeshNumber = 0;   //インスタンス番号を管理
/*###########################################################################################
* Game::VertexAttribute
############################################################################################*/
class Game;
// コンストラクタ
Mesh::Mesh(class Game* g, const char* texture, std::vector<Game::VertexAttribute> &vert, std::vector<unsigned int> &idx) : Transform(g)
{
   Mesh::static_MeshNumber++;                                       //インスタンス番号を管理
   mDebug = new Debug_Log("Mesh_Number_%d.txt",static_MeshNumber);   //デバッグログ
   Owner = g;                                                               //Game
   vertex = &vert;                                                           //頂点配列
   index = &idx;                                                           //インデックス配列
   Texture = (char*)texture;                                               //テクスチャ
   shader = new Shader(g, "Shader/3D/Basic.vert", "Shader/3D/Basic.frag");   //シェーダー
   if (Owner == nullptr)
   {
       mDebug->Write("Owner変数がnullptrです。\n");
   }
   
   if (vertex == nullptr)
   {
       mDebug->Write("頂点配列がnullptrです。\n");
   }
   if (index == nullptr)
   {
       mDebug->Write("インデックス配列がnullptrです。\n");
   }
   if (texture == nullptr)
   {
       mDebug->Write("テクスチャが設定されていません。nullptrです。\n");
   }
   // Trnasformを初期化
   /* 回転 * 拡大縮小 * 座標 */
   Rotate = glm::vec3(0, 0, 0);
   Scale = glm::vec3(1, 1, 1);
   Position = glm::vec3(0, 0, 0);
   Transform::setUpdateTransform(Rotate,Scale,Position);
   //VAO
   glGenVertexArrays(1, &VAO);
   glBindVertexArray(VAO);
   //VBO
   glGenBuffers(1, &VBO);
   glBindBuffer(GL_ARRAY_BUFFER, VBO);
   glBufferData(GL_ARRAY_BUFFER, std::size(*vertex) * sizeof(Game::VertexAttribute), std::data(*vertex) ,GL_STATIC_DRAW);
   //頂点座標
   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), NULL);   
   glEnableVertexAttribArray(0);
   
   //UV座標   
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 3));
   glEnableVertexAttribArray(1);
   //法線
   glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 5));
   glEnableVertexAttribArray(2);
   //IBO
   glGenBuffers(1, &IBO);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
   glBufferData(GL_ELEMENT_ARRAY_BUFFER, std::size(*index) * sizeof(unsigned int),std::data(*index),GL_STATIC_DRAW);
   
   //テクスチャを設定   
   glGenTextures(1, &TextureID);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   int width, height, numComponents;
   unsigned char* data = stbi_load((texture), &width, &height, &numComponents, 4);
   if (data != NULL) {
       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
   }
   else {
       std::cerr << "Unable to load texture: " << texture << std::endl;
   }
   //ミニマップを設定
   glGenerateMipmap(GL_TEXTURE_2D);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   //異方性フィルタリングを設定
   GLfloat largest;
   glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest);
   stbi_image_free(data);
}
// 描画
void Mesh::GenerateOutput()
{   
   glBindVertexArray(VAO);   
   glBindTexture(GL_TEXTURE_2D, TextureID);
   glDrawElements(GL_TRIANGLES, (GLsizei)index->size(), GL_UNSIGNED_INT, NULL);   
};
```
  • C++

    8434 questions

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

1 文章を修正しました。

退会済みユーザー

退会済みユーザー

2020/12/27 19:29  投稿

[OpenGL]最後に描画したメッチュのみが表示される原因が知りたい。
以下の提示コードですがなぜ最後に描画指定したvoid GenerateOutput();したインスタンスのみが画面に表示されるのでしょうか?
多分バッファーに上書きされていると思うのですがどうすれば別のバッファーとして捉える事ができるのでしょうか?また
多分バッファーに上書きされていると思うのですがどうすれば別のバッファーとして捉える事ができるのでしょうか?何をしていないためこうなるのでしょうか?調べましたが 検討が付きません。
原因と対処方法が知りたいです。
```cpp
//標準ヘッダー 関係
#include <iostream>
//自作ヘッダー 関係
#include "../Header/Game.hpp"
#include "../Header/TransformComponent.hpp"
#include "../Header/MeshComponent.hpp"
//OpenGL 関係
#include "GLEW/include/GL/glew.h"
#include "gl/GL.h"
#include "GLFW/include/GLFW/glfw3.h"
//数学ライブラリ
#include "glm/glm.hpp"
#include "glm/gtx/euler_angles.hpp"
#include <glm/gtx/quaternion.hpp>
unsigned int Mesh::static_MeshNumber = 0;   //インスタンス番号を管理
/*###########################################################################################
* Game::VertexAttribute
############################################################################################*/
class Game;
// コンストラクタ
Mesh::Mesh(class Game* g, const char* texture, std::vector<Game::VertexAttribute> &vert, std::vector<unsigned int> &idx) : Transform(g)
{
   Mesh::static_MeshNumber++;                                       //インスタンス番号を管理
   mDebug = new Debug_Log("Mesh_Number_%d.txt",static_MeshNumber);   //デバッグログ
   Owner = g;                                                               //Game
   vertex = &vert;                                                           //頂点配列
   index = &idx;                                                           //インデックス配列
   Texture = (char*)texture;                                               //テクスチャ
   shader = new Shader(g, "Shader/3D/Basic.vert", "Shader/3D/Basic.frag");   //シェーダー
   if (Owner == nullptr)
   {
       mDebug->Write("Owner変数がnullptrです。\n");
   }
   
   if (vertex == nullptr)
   {
       mDebug->Write("頂点配列がnullptrです。\n");
   }
   if (index == nullptr)
   {
       mDebug->Write("インデックス配列がnullptrです。\n");
   }
   if (texture == nullptr)
   {
       mDebug->Write("テクスチャが設定されていません。nullptrです。\n");
   }
   // Trnasformを初期化
   /* 回転 * 拡大縮小 * 座標 */
   Rotate = glm::vec3(0, 0, 0);
   Scale = glm::vec3(1, 1, 1);
   Position = glm::vec3(0, 0, 0);
   Transform::setUpdateTransform(Rotate,Scale,Position);
   //VAO
   glGenVertexArrays(1, &VAO);
   glBindVertexArray(VAO);
   //VBO
   glGenBuffers(1, &VBO);
   glBindBuffer(GL_ARRAY_BUFFER, VBO);
   glBufferData(GL_ARRAY_BUFFER, std::size(*vertex) * sizeof(Game::VertexAttribute), std::data(*vertex) ,GL_STATIC_DRAW);
   //頂点座標
   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), NULL);   
   glEnableVertexAttribArray(0);
   
   //UV座標   
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 3));
   glEnableVertexAttribArray(1);
   //法線
   glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), (void*)(sizeof(GLfloat) * 5));
   glEnableVertexAttribArray(2);
   //IBO
   glGenBuffers(1, &IBO);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
   glBufferData(GL_ELEMENT_ARRAY_BUFFER, std::size(*index) * sizeof(unsigned int),std::data(*index),GL_STATIC_DRAW);
   
   //テクスチャを設定   
   glGenTextures(1, &TextureID);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   int width, height, numComponents;
   unsigned char* data = stbi_load((texture), &width, &height, &numComponents, 4);
   if (data != NULL) {
       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
   }
   else {
       std::cerr << "Unable to load texture: " << texture << std::endl;
   }
   //ミニマップを設定
   glGenerateMipmap(GL_TEXTURE_2D);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   //異方性フィルタリングを設定
   GLfloat largest;
   glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest);
   stbi_image_free(data);
}
// 描画
void Mesh::GenerateOutput()
{   
   glBindVertexArray(VAO);   
   glBindTexture(GL_TEXTURE_2D, TextureID);
   glDrawElements(GL_TRIANGLES, (GLsizei)index->size(), GL_UNSIGNED_INT, NULL);   
};
```
  • C++

    8434 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る