Я пытался нагрузка Волновой фронт объект модель с ASSIMP. Тем не менее, я не могу заставить цвета материалов MTL работать (Kd rgb)
, Я знаю, как загрузить тогда, но я не знаю, как получить соответствующий цвет для каждой вершины.
usemtl material_11
f 7//1 8//1 9//2
f 10//1 11//1 12//2
Например, приведенный выше фрагмент obj Wavefront означает, что в вершинах thoose используется material_11.
Q: Итак, как я могу получить материал, соответствующий каждой вершине?
Волновой фронт объект материалы не в правильных вершинах:
Исходная модель (отображается с помощью программы просмотра модели ASSIMP):
Модель с моим кодом:
Код, который я использую для загрузки цвета материалов MTL:
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
массив. Хотя сейчас я просто выбрасываю догадки.