危机纳米服中的多个纹理 - 使用Assimp加载模型
Multiple textures in Crisis Nanosuit - Model loading using Assimp
我想在OpenGl/glsl中使用Assimp加载危机纳米服模型。该模型具有Assimp中节点树所述的几个网格。每个网格都与一个或多个纹理(扩散或镜面等)相关联。我如何在模型上呈现纹理,并且仍然使用单个拉动调用进行操作?
到目前为止,我已经能够加载模型没有纹理。这是我的做法:我使用节点树来找出模型中存在多少个网格,并使用结构阵列堆叠它们。这包含位置,正常,TexCoords,color_ambient,color_diffuse,color_pecular和Shininess的浮动值,vbo。由于网格是堆叠的,因此每个网格的索引阵列被相应地抵消。最终,通过单个抽奖电话,该模型成功地呈现了。这是整个代码,Relavent零件如下
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);
}
这是输出图像。
现在,当加载纹理(为身体的每个部分分开图像文件)时,当我激活所有纹理atonce时,它将每个纹理文件拉伸到整个身体上。我该如何正确执行?
我的初步想法是:激活所有纹理文件。在VBO和片段着色器中添加一个称为" mesh_number"的属性,使用与" mesh_number"相对应的适当纹理。我不知道这是否会起作用。通常如何完成?您有任何代码样本吗?
当在此处完成的每个网格中应用绘制调用时,该问题就会解决。1)但是打电话不昂贵吗?我不应该一口气画整个网格吗?2)我是否应该创建一个拼贴到一个的身体部位的单个图像文件;很像精灵表?
您需要通过:
激活每个纹理glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, <cour texture id>);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, <cour texture id>);
因此,所有纹理都可以为您的抽奖式呈现。
相关文章:
- 使用 CUDA 和纹理进行图像减法
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 将使用太多的纹理插值器 - 带旋转的着色器
- 如何使用 DXGI 格式DXGI_FORMAT_R1_UNORM创建 2D 纹理?
- 使用 C++在 OpenGL 中对 3D 多边形进行纹理处理
- SFML 纹理使用问题
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- 使用 assimp 获取纹理比例
- Assimp - 如何使用任何文件格式导入带有纹理的网格?
- 使用程序生成来创建磁盘,但纹理无法正常工作
- 如何使用 openGL 在屏幕上显示加载的纹理
- 使用片段着色器写入 1D 纹理后从 1D 纹理读回不起作用
- 使用 SDL2 操作硬件纹理
- 如何在 Opengl 中使用多个纹理解决此问题
- 如何使用着色器在 opengl es 中渲染四边形内部的部分纹理
- 如何使用Qt多媒体和C++将.mp4视频从OpenGL纹理中保存出来
- 危机纳米服中的多个纹理 - 使用Assimp加载模型
- 我如何缓冲模型矩阵数据到纹理使用OpenGL ES2, GLSL, c++
- OpenGL纹理使用c++
- OpenGL -纹理使用glDrawElements被错误地映射