Надежно загружать модели и их материалы в Ассимп с помощью OpenGL? - PullRequest
0 голосов
/ 13 января 2020

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

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

Вы можете представить себе вершинный шейдер в следующем виде:

#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 или цвета или оба. Возможно использование униформы в качестве флага и сохранение этих данных в объекте модели?

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

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

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

1 Ответ

1 голос
/ 14 января 2020

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

Либо это:

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

или эта :

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

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

...