Что не так с моей стратегией загрузки модели в моей графической библиотеке OpenGL?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Что не так с моей стратегией загрузки модели в моей графической библиотеке OpenGL?

Сообщение Anonymous »

Я создаю графическую библиотеку на C++ (https://github.com/jopo86/onyx для получения дополнительной информации). На данный момент я добился довольно хорошего прогресса: вы можете визуализировать объекты, используя определяемые пользователем вершины, включая позиции вершин, нормали, координаты текстуры и/или цвета, но сейчас я пытаюсь добавить некоторую загрузку модели. Я начал пытаться использовать Learnopengl.com и их раздел загрузки моделей с помощью Assimp, но все, что я написал к этому моменту, сильно отличалось от того, как они это сделали, и это было очень сложно перенести в мою библиотеку. Итак, я искал более простое решение — нашел хороший и простой загрузчик OBJ с одним заголовком для C++ (https://github.com/Bly7/OBJ-Loader) и поработал над ним. Что странно, так это то, что загружаемые и визуализированные объекты узнаваемы, просто многое отсутствует или совершенно не на своем месте. Обычно все работает либо полностью, либо почти полностью, либо просто не работает вообще, но мне кажется странным, что это что-то среднее.
Поэтому я попробовал использовать Загрузчик 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;
}

Я попробовал использовать OBJ-файлы человека, Bugatti и нескольких низкополигональных яблок, и вот что у меня получилось:
Человек :
Изображение

Bugatti:
Изображение

Яблоки:
Изображение

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

Подробнее здесь: https://stackoverflow.com/questions/783 ... cs-library
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»