Поэтому я попробовал использовать Загрузчик OBJ для загрузки вершин, индексов, координат текстур и т. д. в мою структуру данных Mesh, которая принимает структуры данных VertexArray и IndexArray. VertexArray содержит фактические данные вершины (указатель/массив с плавающей запятой), размер данных и формат вершины (VN, VNT, VNC, VNCT и т. д., где V — вершина (позиция), N — нормальное, T — координата текстуры, C — цвет). Формат вершин используется только для установки указателей атрибутов вершин для шейдеров. Индексные массивы содержат фактические индексные данные (указатель/массив uint) и размер данных. Затем я загружаю данные текстуры в свою структуру данных текстуры, которая просто содержит идентификатор текстуры OpenGL и генерирует текстуру из ImageData, которая загружает информацию о текстуре из пути к файлу с помощью stb_image. Я создаю шейдер, либо беря вершины, нормали и диффузный цвет из материала OBJ (Kd), либо, если есть текстура, беру вершины, нормали и координаты текстуры и привязываю текстуру, когда это необходимо.< /p>
Все это делается в классе Model, который содержит каталог OBJ, а также векторы сеток, шейдеров и текстур. Вот этот код:
Код: Выделить всё
Onyx::Model* Onyx::Model::LoadOBJ(const std::string& filepath)
{
Model* model = new Model;
AddMalloc(model, false);
std::string slash = filepath.find("/") ? "/" : "\\";
model->directory = filepath.substr(0, filepath.find_last_of(slash));
objl::Loader loader;
if (!loader.LoadFile(filepath))
{
Err("Unable to load OBJ model: \"" + filepath + "\"");
return model;
}
for (const objl::Mesh& objlMesh : loader.LoadedMeshes)
{
std::vector* vertices = new std::vector;
for (const objl::Vertex& vertex : objlMesh.Vertices)
{
vertices->push_back(vertex.Position.X);
vertices->push_back(vertex.Position.Y);
vertices->push_back(vertex.Position.Z);
vertices->push_back(vertex.Normal.X);
vertices->push_back(vertex.Normal.Y);
vertices->push_back(vertex.Normal.Z);
vertices->push_back(vertex.TextureCoordinate.X);
vertices->push_back(vertex.TextureCoordinate.Y);
}
std::vector* indices = new std::vector;
for (uint index : objlMesh.Indices)
{
indices->push_back(index);
}
AddMalloc(vertices, false);
AddMalloc(indices, false);
model->meshes.push_back(Mesh(
VertexArray(vertices->data(), vertices->size(), VertexFormat::VNT),
IndexArray(indices->data(), indices->size())
));
bool hasTexture = objlMesh.MeshMaterial.map_Kd != "";
model->textures.push_back(
hasTexture ?
Texture(
ImageData::Load(model->directory + "/" + objlMesh.MeshMaterial.map_Kd)
)
: Texture()
);
if (hasTexture) model->shaders.push_back(ShaderPresets::VNT());
else
{
model->shaders.push_back(ShaderPresets::VN_Color(Vec4(objlMesh.MeshMaterial.Kd.X, objlMesh.MeshMaterial.Kd.Y, objlMesh.MeshMaterial.Kd.Z, 1.0f)));
}
}
return model;
}
Человек :

Bugatti:

Яблоки:

Проблема НЕ в триангуляции, я пробовал использовать триангулированные файлы OBJ, и это в значительной степени тот же результат.
Программа не аварийно завершает работу, она прекрасно закрывается с кодом завершения 0.
Весь исходный код для дополнительной справки , находится на GitHub: https://github.com/jopo86/onyx
Подробнее здесь: https://stackoverflow.com/questions/783 ... cs-library