В настоящее время я настраиваю освещение в 3D-сцене, созданной в Blender и загруженной через assimp со следующими параметрами:
aiProcess_GenSmoothNormals | aiProcess_Triangulate | aiProcess_CalcTangentSpace | aiProcess_FlipUVs
В настоящее время я застрял в действительно странном сбое в моей программе. Я реализую Фонг затенение на фрагмент шейдера для освещения со следующими свойствами:
Однако объекты трубы различны: рассеянные цвета всегда находятся на противоположной стороне трубы, которая должна гореть, а зеркальный свет — на правильной. Это делает вещи странными, поскольку зеркальный свет работает так, как должен, а рассеянный компонент всегда находится не на той стороне. Я заметил этот эффект при масштабировании объектов-цилиндров за определенную точку в блендере (более мелкие масштабированные цилиндры по-прежнему работают так, как они должны), поэтому масштабирование объектов-цилиндров за пределами определенного порога, вероятно, как-то связано с этим.
Моя сцена, где объекты, похожие на трубы, имеют рабочие зеркальные компоненты, но рассеянные цвета находятся на противоположной стороне источника света.
Нормалы как видно в блендере
Моим первым предположением было то, что это как-то связано с нормальным масштабированием, но я уже использовал для этого нормальную матрицу в вершинном шейдере, и другие объекты в моей сцене работают просто отлично.
Вершинный шейдер:
#version 330
layout (location = 0) in vec3 vertex;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec3 tangent;
layout(location = 3) in vec3 color;
layout(location = 4) in vec2 texCoord;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform vec3 lightPos;
out vec3 Position;
out vec3 Normal;
out vec3 LightPos;
out vec2 TexCoord;
void main()
{
gl_Position = projection * view * model * vec4(vertex, 1.0);
// Position
Position = vec3(view * model * vec4(vertex, 1.0));
// Normal
mat3 normalMat = transpose(inverse(mat3(view * model)));
Normal = normalMat * normal;
// Lighting
LightPos = vec3(view * vec4(lightPos, 1.0));
// Texture
TexCoord = texCoord;
}
Фрагмент шейдера:
#version 330
in vec3 Position;
in vec3 Normal;
in vec3 LightPos;
in vec2 TexCoord;
uniform sampler2D texture0;
out vec4 outColor;
void main()
{
// defaults
vec4 ambient = vec4(0.2);
vec4 diffuse = vec4(0.4);
vec4 specular = vec4(0.5);
vec4 texColor = texture(texture0, TexCoord);
// Phong shading
vec3 LightDir = normalize(LightPos - Position);
vec3 Norm = normalize(Normal);
vec3 ViewDir = normalize(-Position);
vec3 ReflectDir = reflect(-LightDir,Norm);
float specularContribution = pow(max(dot(ViewDir, ReflectDir), 0.0), 32);
// Calculate diffuse component
vec4 I = diffuse * max(dot(Norm, LightDir), 0.0);
diffuse = clamp(I, 0.0, 1.0);
// Calculate specular component
specular = specular * specularContribution;
outColor = texColor * (diffuse + ambient + specular);
}
редактировать
Я добавил геометрический шейдер, который отображает все нормали вершин во втором проходе рисования для целей отладки. Однако при отображении нормалей они слегка двигаются движением камеры, чего не следует делать. Я предполагаю, что это, вероятно, причина моей вышеупомянутой проблемы.
Я сделал небольшое видео, иллюстрирующее нормальное движение: Youtube видео, которое отображает нормальные проблемы движения.
Видео показывает, как розовые нормали меняют направление при движении камеры. Этого не должно быть, и я не знаю почему. Это неправильная матрица нормалей или, возможно, assimp неправильно загружает нормали?
Задача ещё не решена.
Других решений пока нет …