Надежно ли загружать модели и их материалы в Assimp с помощью OpenGL?

Я понял, что модели можно загружать разными способами. Некоторые могут не иметь текстур и использовать только цвета вершин, в то время как другие имеют материалы с текстурами. Теперь у меня есть один шейдер, который используется для рисования 3D-моделей с освещением, но как мне подойти к загрузке моделей, которые требуется отрисовывать по-другому, и чтобы они правильно отображались в сцене.

Один из методов, о котором я подумал, - это иметь жестко определенные указатели атрибутов в вершинном шейдере, и если модель не требует привязки атрибута, это не обязательно. Я бы предположил, что если атрибут не привязан к нему и не используется в вычислениях, он не будет вносить или смещать какие-либо значения (особенно, если вы выполняете вычисления отдельно и суммируете их в конце (например, вычисляя цвет пиксель для цвета вершины в этом фрагменте и суммируя это для цвета пикселя для текстуры)

Вы можете представить, что вершинный шейдер выглядит так:

#version 330 core
layout (location = 0) in vec3 aPos; // Vertex positions
layout (location = 1) in vec3 aNormal; // Normals
layout (location = 2) in vec2 aTexCoords; // Optional Texture coordinates 
layout (location = 3) in vec3 aColors; // Optional vertex colours

out vec3 FragPos;
out vec3 Normal;
out vec2 TexCoords;
out vec3 Colors;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    FragPos = vec3(model * vec4(aPos, 1.0));
    Normal = mat3(transpose(inverse(model))) * aNormal;  
    TexCoords = aTexCoords;
    Colors = aColors;

    gl_Position = projection * view * vec4(FragPos, 1.0);
}

Проблема, которую я вижу в этом, заключается в том, что я не уверен, как я могу определить, использовать ли texCoords или цвета, или и то, и другое. Возможно, использовать униформу в качестве флага и сохранить эти данные в объекте модели?

Другой метод - определение шейдеров для различных типов методов освещения, а затем определение того, какой шейдер вызывается для какой модели. Это мой наименее любимый вариант, поскольку он не позволяет использовать динамические подходы (т.е. одновременно цвета и текстуры вершин).

Какой был бы подход в профессиональной среде, чтобы любую модель можно было загрузить и нарисовать в сцене с освещением так же напрасно, как это делают игровые движки? (Прямо сейчас используется прямой рендеринг, поэтому не нужны никакие концепции отложенного затенения, так как на данный момент это выше моей зарплаты). Я не ищу конкретных решений, я скорее эксперт, знающий, как подойти к этой проблеме.

Также я использую OpenGL 3.3


person Samuel Innocent-Primus Mungy    schedule 13.01.2020    source источник
comment
Это не отвечает на ваш вопрос об opengl, но чем более явно вы хотите что-то делать, тем больше я рекомендую хотя бы выяснить, что делает Vulkan. Он нацелен на то, чтобы делать вещи более явными и, в конечном итоге, быстрее, но не на то, чтобы делать вещи проще ...   -  person Yunnosch    schedule 13.01.2020
comment
Какой был бы подход в профессиональной среде, чтобы любую модель можно было загрузить и нарисовать в сцене с освещением так же напрасно, как это делают игровые движки? Игровые движки этого не делают - никто не может. Игровые движки тесно связаны с соответствующими конвейерами ресурсов, и вы не можете импортировать только любую модель, особенно любой материал. Параметры материала имеют смысл только для определенных моделей освещения, и без каких-либо знаний этой информации (обычно не хранящейся в файлах) невозможно правильно ее отобразить.   -  person derhass    schedule 13.01.2020
comment
@derhass, не могли бы вы пояснить, что конкретно вы подразумеваете под конвейером активов? Поскольку это может означать разные вещи в разных контекстах. Кроме того, это больше связано с тем, что я могу импортировать модель, которая использует цвета вершин, и модель, которая использует диффузные, окружающие, зеркальные карты, и я думаю, что Unity или Unreal могут это уловить. Мне было интересно, как они это понимают и отправляют правильные данные своим шейдерам   -  person Samuel Innocent-Primus Mungy    schedule 13.01.2020
comment
Что ж, под конвейером ресурсов я просто подразумеваю все инструменты и фактические рабочие процессы, которые используются различными художниками для создания контента / ресурсов для использования с этими движками. Модель, которая использует карты рассеивания, окружающей среды и отражения, которая предполагает модель освещения, которая имеет эти три компонента - они больше не используются. Тенденция основана на физическом затенении (также для увеличения взаимозаменяемости между различными движками / конвейерами ресурсов), где обычно есть некоторые параметры альбедо, шероховатости и металличности. Но фактические модели и, следовательно, значение параметров различаются.   -  person derhass    schedule 13.01.2020
comment
В конце концов, все сводится к следующему: данные, хранящиеся в этих файлах модели, являются просто параметрами / входными данными в некоторой формуле. И с программируемым затенением эта формула больше не запекается в ваших графических процессорах (у нас это было два десятилетия назад), а также не записана в какой-либо окончательной спецификации, но каждый может - и будет - писать свои собственные формулы. Без знания формул параметры не имеют никакого значения сами по себе.   -  person derhass    schedule 13.01.2020
comment
@derhass Хорошо, я понял. Но мне все еще интересно, поэтому я загрузил модель с помощью assimp. У меня есть цвета вершин и текстуры. Должен ли я просто тогда не визуализировать какое-либо освещение на модели, пока конечный пользователь не настроит его с помощью определенных встроенных в движок инструментов? Я имею в виду, что Assimp даже позволяет вам подбирать диффузные и окружающие текстуры из модели. Разве это нельзя использовать в модели освещения? А что насчет шейдера, который отображает модель? Должно ли это быть похоже на приведенный выше пример, в котором я заранее определил указатели атрибутов вершин для всех моделей, чтобы мне не приходилось писать шейдер для каждой модели   -  person Samuel Innocent-Primus Mungy    schedule 13.01.2020
comment
и под этим я подразумеваю, что для каждой модели местоположение 2 относится к координатам текстуры, а местоположение 3 относится к цветам вершин и т.д. Я просто хочу, чтобы модель загружалась без написания настраиваемого шейдера для рисования этой модели с ее текстурами и цветами   -  person Samuel Innocent-Primus Mungy    schedule 13.01.2020
comment
@ SamuelInnocent-PrimusMungy Если вам просто нужно немного освещения, относитесь к любой имеющейся у вас информации о цвете как к рассеянной.   -  person user253751    schedule 14.01.2020


Ответы (1)


Какой был бы подход в профессиональной среде, чтобы любую модель можно было загрузить и нарисовать в сцене с освещением так же напрасно, как это делают игровые движки?

Либо это:

определение шейдеров для различных типов техники освещения, а затем определение того, какой шейдер вызывается для какой модели

или это:

наличие жестко определенных указателей атрибутов в вершинном шейдере и что, если модель не требует привязки атрибута, она не должна

Выбери один. Во втором подходе вам не нужны флаги - вы можете просто привязать фиктивные значения, такие как обычная белая текстура, если модель не имеет текстуры, и белый цвет вершин, если модель не имеет цветов вершин.

person user253751    schedule 14.01.2020