Я хочу загрузить Модель кризисного нанокостюма , используя Assimp в OpenGL / GLSL.Модель имеет несколько сеток, как описано в дереве узлов в assimp.Каждая сетка связана с одной или несколькими текстурами (диффузными или зеркальными и т. Д.).Как мне рендерить текстуры поверх модели и при этом делать это одним вызовом отрисовки?
До сих пор я мог загружать модели без текстур.И вот как я это сделал: я использовал дерево узлов, чтобы выяснить, сколько сеток присутствует в модели, и сложил их, используя массив структур.Это содержало значения с плавающей точкой позиций, нормалей, текстовых координат, Color_Ambient, Color_diffuse, Color_specular и Shininess в буфер, VBO.Поскольку сетки сложены, индексный массив был смещен для каждой сетки соответственно.Наконец, с помощью одного вызова отрисовки модель была успешно обработана.Вот весь код , а соответствующие части выглядят следующим образом:
struct Vertex
{
glm::vec3 position;
glm::vec3 normal;
glm::vec2 texcoord;
glm::vec3 colorambient;
glm::vec3 colordiffuse;
glm::vec3 colorspecular;
float shininess;
};
// Creating a nodestack of all the meshes
void modelloader::NodeTreeTraversal(aiNode *node)
{
if(node->mNumChildren==0)
nodestack.push_back(node);
else
for(unsigned int i=0; i<node->mNumChildren; i++)
this->NodeTreeTraversal(node->mChildren[i]);
}
// Look into assimp data structures for data and populate them into opengl's vbo's and ebo.
void modelloader::ProcessMeshes()
{
// currently this method loads vertex positions, normals, textures;
// also loads material info such as ambient, diffuse and specular colors with shininess as 16.0f
Vertex vertex;
unsigned int offset_faces=0;
for(unsigned int i=0; i<this->nodestack.size(); i++)
{
aiNode *node = nodestack[i];
for(unsigned int j=0; j<node->mNumMeshes; j++)
{
aiMesh *mesh = this->scene->mMeshes[node->mMeshes[j]];
aiColor4D ambient;
aiColor4D diffuse;
aiColor4D specular;
if(this->scene->HasMaterials()) {
aiMaterial *mtl = scene->mMaterials[mesh->mMaterialIndex];
aiGetMaterialColor(mtl, AI_MATKEY_COLOR_AMBIENT, &ambient);
aiGetMaterialColor(mtl, AI_MATKEY_COLOR_DIFFUSE, &diffuse);
aiGetMaterialColor(mtl, AI_MATKEY_COLOR_SPECULAR, &specular);
}
// load all mesh data
for(unsigned int k=0; k<mesh->mNumVertices; k++)
{
// positions and normals
vertex.position = glm::vec3(mesh->mVertices[k].x, mesh->mVertices[k].y, mesh->mVertices[k].z); // load positions
vertex.normal = glm::vec3(mesh->mNormals[k].x, mesh->mNormals[k].y, mesh->mNormals[k].z); // load normals
// load textures
if(this->scene->HasTextures())
vertex.texcoord = glm::vec2(mesh->mTextureCoords[0][k].x, mesh->mTextureCoords[0][k].y);
else vertex.texcoord = glm::vec2(0.0f, 0.0f);
// load materials
vertex.colorambient = glm::vec3(ambient.r, ambient.g, ambient.b);
vertex.colordiffuse = glm::vec3(diffuse.r, diffuse.g, diffuse.b);
vertex.colorspecular = glm::vec3(specular.r, specular.g, specular.b);
vertex.shininess = 16.0f;
// push back all the data for each vertex
meshdata.push_back(vertex);
}
// create index data
for(unsigned int l=0; l<mesh->mNumFaces; l++) {
this->indices.push_back(mesh->mFaces[l].mIndices[0]+offset_faces);
this->indices.push_back(mesh->mFaces[l].mIndices[1]+offset_faces);
this->indices.push_back(mesh->mFaces[l].mIndices[2]+offset_faces);
}
offset_faces = offset_faces+mesh->mNumVertices;
}
}
this->MeshData = &meshdata[0].position.x;
this->MeshDataSize = meshdata.size() * 18 * sizeof(float);
this->Indices = indices.data();
this->IndicesSize = indices.size()*sizeof(unsigned int);
}
// draw call
void modelloader::RenderModel()
{
glBindVertexArray(this->VAO);
glDrawElements(GL_TRIANGLES, this->IndicesSize/sizeof(unsigned int), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
Вот это выходное изображение .
Теперь при загрузке текстур(отдельные файлы изображений для каждой части тела), когда я активировал все текстуры сразу, он растягивал каждый файл текстуры по всему телу.Как мне сделать это правильно?
Мои предварительные мысли: активировать все файлы текстур.Добавьте атрибут с именем «mesh_number» в VBO и в фрагментном шейдере используйте соответствующую текстуру, соответствующую «mesh_number».Я не знаю, будет ли это работать.Как это обычно делается?У вас есть примеры кода?
Эта проблема решается, когда вызов отрисовки применяется к каждой сетке в модели, как это было сделано здесь .1) Но не дорогие ли звонки?Разве я не должен рисовать всю сетку за один раз?2) Должен ли я создать единый файл изображения из всех частей тела, объединенных в одну;очень похоже на спрайт лист ?