使用assimp加载mtl颜色
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用assimp加载mtl颜色相关的知识,希望对你有一定的参考价值。
我一直在尝试使用ASSIMP load一个Wavefront obj模型。但是,我无法获得MTL材质的颜色来工作(Kd rgb)
。我知道该如何加载,但是,我不知道如何为每个顶点获取相应的颜色。
usemtl material_11
f 7//1 8//1 9//2
f 10//1 11//1 12//2
例如,上面的Wavefront obj代码段表示,thoose顶点使用material_11。
Q:那么如何获得每个顶点对应的材质?
错误
Wavefront obj材质不在正确的顶点:
原始模型(使用ASSIMP模型查看器渲染):
用我的代码渲染的模型:
代码:
我用于加载材料颜色的代码:
std::vector<color4<float>> colors = std::vector<color4<float>>();
...
for (unsigned int i = 0; i < scene->mNumMeshes; i++)
const aiMesh* model = scene->mMeshes[i];
const aiMaterial *mtl = scene->mMaterials[model->mMaterialIndex];
color4<float> color = color4<float>(1.0f, 1.0f, 1.0f, 1.0f);
aiColor4D diffuse;
if (AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_DIFFUSE, &diffuse))
color = color4<float>(diffuse.r, diffuse.g, diffuse.b, diffuse.a);
colors.push_back(color);
...
用于创建顶点的代码:
vertex* vertices_arr = new vertex[positions.size()];
for (unsigned int i = 0; i < positions.size(); i++)
vertices_arr[i].SetPosition(positions.at(i));
vertices_arr[i].SetTextureCoordinate(texcoords.at(i));
// Code for setting vertices colors (I'm just setting it in ASSIMP vertices order, since I don't know how to set it in the correct order).
for (unsigned int i = 0; i < scene->mNumMeshes; i++)
const unsigned int vertices_size = scene->mMeshes[i]->mNumVertices;
for (unsigned int k = 0; k < vertices_size; k++)
vertices_arr[k].SetColor(colors.at(i));
编辑:
看起来模型顶点的位置也没有正确加载。即使禁用脸部剔除并更改背景颜色。
忽略与绘制调用的数量以及顶点颜色的额外存储,带宽和处理有关的问题,
看起来vertex* vertices_arr = new vertex[positions.size()];
是您要创建的一个大数组,用于容纳整个模型(该模型具有许多网格,每个网格都包含一种材料)。假设您的第一个循环是正确的,并且positions
包含模型中所有网格的所有位置。第二个循环开始为网格中的每个顶点复制网格颜色。但是,vertices_arr[k]
始终从零开始,并且需要在前一个网格的最后一个顶点之后开始。相反,请尝试:
int colIdx = 0;
for (unsigned int i = 0; i < scene->mNumMeshes; i++)
const unsigned int vertices_size = scene->mMeshes[i]->mNumVertices;
for (unsigned int k = 0; k < vertices_size; k++)
vertices_arr[colIdx++].SetColor(colors.at(i));
assert(colIdx == positions.size()); //double check
正如您所说,如果几何图形绘制不正确,则positions
可能不包含所有顶点数据。也许与上述代码类似的问题?另一个问题可能是加入每个网格的索引。所有索引都需要更新,并具有vertices_arr
数组中新顶点位置的偏移量。尽管现在我只是在猜测。
以上是关于使用assimp加载mtl颜色的主要内容,如果未能解决你的问题,请参考以下文章