Я понял, что модели можно загружать разными способами. Некоторые могут не иметь текстур и использовать только цвета вершин, в то время как другие имеют материалы с текстурами. Теперь у меня есть один шейдер, который используется для рисования 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