c++ opengl I am working on a small game engine. I have a problem regarding rendering 3D models. Models can consist of multiple meshes and meshes consist of multiple verticies. I want to be able to load in a model using Assimp from a file and store the modesl data for each mesh and each vertex, so that we only have to load it once. Later I want to draw the model using a class called Renderer3D which will store the various buffers related to the model's meshes. Below is the code I have for loading a model, what is missing from it to store the relevant data for later binding and drawing?

#include "solpch.h"
#include "OpenGL\_Model.h"

#include "GalaxyDraw/Platform/OpenGL/GLMacros.h"
#include 
#include 
#include 
#include 

namespace GalaxyDraw
{
 struct Vertex {
 glm::vec3 Position;
 glm::vec3 Normal;
 glm::vec2 TexCoords;
 };

 struct Mesh {
 public:
 std::vector Vertices;
 std::vector Indices;
 std::vector> Textures;//TODO replace with material struct
 
 Mesh(std::vector vertices, std::vector indices, std::vector> textures):
 Vertices(vertices), Indices(indices), Textures(textures)
 {}

 };
 OpenGL\_Model::OpenGL\_Model(const std::string& modelpath)
 {
 LoadModel(modelpath);
 }

 void OpenGL\_Model::SetData(const std::string& path)
 {
 LoadModel(path);
 }

 bool OpenGL\_Model::operator==(const Model& other) const
 {
 return m\_RendererID == ((OpenGL\_Model&)other).m\_RendererID;
 }

 void OpenGL\_Model::LoadModel(const std::string& modelpath)
 {
 Assimp::Importer import;
 const aiScene\* scene = import.ReadFile(modelpath, aiProcess\_Triangulate | aiProcess\_FlipUVs | aiProcess\_GenNormals | aiProcess\_JoinIdenticalVertices);

 if (!scene || scene->mFlags & AI\_SCENE\_FLAGS\_INCOMPLETE || !scene->mRootNode)
 {
 std::cout << "ERROR::ASSIMP::" << import.GetErrorString() << std::endl;
 return;
 }
 m\_ModelDirectory = modelpath.substr(0, modelpath.find\_last\_of('/'));

 ProcessNode(scene->mRootNode, scene);
 }

 void OpenGL\_Model::ProcessNode(aiNode\* node, const aiScene\* scene)
 {
 // process all the node's meshes (if any)
 for (unsigned int i = 0; i < node->mNumMeshes; i++)
 {
 aiMesh\* mesh = scene->mMeshes[node->mMeshes[i]];
 m\_Meshes.push\_back(ProcessMesh(mesh, scene));
 }
 // then do the same for each of its children
 for (unsigned int i = 0; i < node->mNumChildren; i++)
 {
 ProcessNode(node->mChildren[i], scene);
 }
 }

 Mesh OpenGL\_Model::ProcessMesh(aiMesh\* mesh, const aiScene\* scene)
 {
 std::vector vertices;
 std::vector indices;
 std::vector> textures;

 for (unsigned int i = 0; i < mesh->mNumVertices; i++)
 {
 Vertex vertex;

 glm::vec3 vector;
 vector.x = mesh->mVertices[i].x;
 vector.y = mesh->mVertices[i].y;
 vector.z = mesh->mVertices[i].z;
 vertex.Position = vector;

 vector.x = mesh->mNormals[i].x;
 vector.y = mesh->mNormals[i].y;
 vector.z = mesh->mNormals[i].z;
 vertex.Normal = vector;

 // does the mesh contain texture coordinates?
 if (mesh->mTextureCoords[0])
 {
 glm::vec2 vec;
 vec.x = mesh->mTextureCoords[0][i].x;
 vec.y = mesh->mTextureCoords[0][i].y;
 vertex.TexCoords = vec;
 }
 else
 {
 vertex.TexCoords = glm::vec2(0.0f, 0.0f);
 }

 vertices.push\_back(vertex);
 }

 // LMAO, I wish C# procedural shit went like this
 for (unsigned int i = 0; i < mesh->mNumFaces; i++)
 {
 aiFace face = mesh->mFaces[i];
 for (unsigned int j = 0; j < face.mNumIndices; j++)
 {
 indices.push\_back(face.mIndices[j]);
 }
 }

 // Checks if any material exists at all
 //if (mesh->mMaterialIndex >= 0)
 //{
 // // gets the material cached within that specific index
 // aiMaterial\* material = scene->mMaterials[mesh->mMaterialIndex];

 // std::vector diffuseMaps = loadMaterialTextures(material, aiTextureType\_DIFFUSE, "texture\_diffuse");
 // textures.insert(textures.end(), diffuseMaps.begin(), diffuseMaps.end());

 // std::vector specularMaps = loadMaterialTextures(material, aiTextureType\_SPECULAR, "texture\_specular");
 // textures.insert(textures.end(), specularMaps.begin(), specularMaps.end());
 //}

 return Mesh(vertices, indices, textures);
 }

}
C++ 오픈GL 작은 게임 엔진으로 작업하고 있습니다. 3D 모델 렌더링과 관련하여 문제가 있습니다. 모델은 여러 개의 메쉬로 구성될 수 있고 메쉬는 여러 개의 수직으로 구성됩니다. 파일에서 Assimp를 사용하여 모델을로드하고 각 메쉬 및 각 버텍스에 대한 모드 데이터를 저장하여 한 번만로드 할 수 있도록하고 싶습니다. 나중에 모델의 메시와 관련된 다양한 버퍼를 저장하는 Renderer3D라는 클래스를 사용하여 모델을 그리고 싶습니다. 아래는 모델을 로드하는 코드인데, 나중에 바인딩하고 그리기 위해 관련 데이터를 저장하기 위해 빠진 것은 무엇인가요?#include "solpch.h"#포함 "OpenGL\_Model.h"#포함 "GalaxyDraw/Platform/OpenGL/GLMacros.h"#포함 #포함 #포함 #include 네임스페이스 GalaxyDraw{ 구조체 Vertex { glm::vec3 위치; glm::vec3 Normal; glm::vec2 TexCoords; }; 구조체 메시 { public: std::vector Vertices; std::벡터 인덱스; std::vector> 텍스처;//TODO 머티리얼 구조체로 바꾸기  Mesh(std::vector vertices, std::vector indices, std::vector> textures): Vertices(버텍스), Indices(인덱스), Textures(텍스처) {} }; OpenGL\_Model::OpenGL\_Model(const std::string& modelpath) { LoadModel(모델 경로); } void OpenGL\_Model::SetData(const std::string& path) { LoadModel(경로); } bool OpenGL\_Model::operator==(const Model& other) const { 반환 m\_RendererID == ((OpenGL\_Model&)other).m\_RendererID; } void OpenGL\_Model::LoadModel(const std::string& modelpath) { Assimp::임포터 임포트; const aiScene\* scene = import.ReadFile(modelpath, aiProcess\_Triangulate | aiProcess\_FlipUVs | aiProcess\_GenNormals | aiProcess\_JoinIdenticalVertices); if (!scene || scene->mFlags & AI\_SCENE\_FLAGS\_INCOMPLETE || !scene->mRootNode) { std::cout << "ERROR::ASSIMP::" << import.GetErrorString() << std::endl; return; } m\_ModelDirectory = modelpath.substr(0, modelpath.find\_last\_of('/')); ProcessNode(scene->mRootNode, scene); } void OpenGL\_Model::ProcessNode(aiNode\* 노드, const aiScene\* 장면) { // 노드의 모든 메시를 처리합니다 (있는 경우). for (부호없는 int i = 0; i < node->mNumMeshes; i++) { aiMesh\* mesh = scene->mMeshes[node->mMeshes[i]]; m\_Meshes.push\_back(ProcessMesh(mesh, scene)); } // 그런 다음 각 자식에 대해 동일한 작업을 수행합니다. for (부호없는 int i = 0; i < node->mNumChildren; i++) { ProcessNode(node->mChildren[i], scene); } } 메시 OpenGL\_Model::ProcessMesh(aiMesh\* 메시, const aiScene\* 장면) { std::벡터 정점; std::벡터 인덱스; std::벡터> 텍스처; for (부호 없는 int i = 0; i < mesh->mNumVertices; i++) { 정점 정점입니다; glm::vec3 벡터; vector.x = mesh->mVertices[i].x; vector.y = mesh->mVertices[i].y; vector.z = mesh->mVertices[i].z; vertex.Position = 벡터; vector.x = mesh->mNormals[i].x; vector.y = mesh->mNormals[i].y; vector.z = mesh->mNormals[i].z; vertex.Normal = 벡터; // 메시가 텍스처 좌표를 포함하나요? if (mesh->mTextureCoords[0]) { glm::vec2 vec; vec.x = mesh->mTextureCoords[0][i].x; vec.y = mesh->mTextureCoords[0][i].y; vertex.TexCoords = vec; } else { vertex.TexCoords = glm::vec2(0.0f, 0.0f); } vertices.push\_back(vertex); } // LMAO, C# 절차적 똥이 다음과 같이 진행되었으면 좋겠습니다. for (부호없는 int i = 0; i < mesh->mNumFaces; i++) { aiFace face = mesh->mFaces[i]; for (부호 없는 int j = 0; j < face.mNumIndices; j++) { indices.push\_back(face.mIndices[j]); } } // 머티리얼이 존재하는지 확인합니다. //if (mesh->mMaterialIndex >= 0) //{ // // 해당 특정 인덱스 내에 캐시된 머티리얼을 가져옵니다. // aiMaterial\* material = scene->mMaterials[mesh->mMaterialIndex]; // std::vector diffuseMaps = loadMaterialTextures(material, aiTextureType\_DIFFUSE, "texture\_diffuse"); // textures.insert(textures.end(), diffuseMaps.start(), diffuseMaps.end()); // std::vector specularMaps = loadMaterialTextures(material, aiTextureType\_SPECULAR, "texture\_specular"); // textures.insert(textures.end(), specularMaps.start(), specularMaps.end()); //} 반환 메쉬(정점, 인덱스, 텍스처); }}