Диффузный нормальный инвертированный, когда 3D-модель слишком велика (цилиндр) с использованием ASSIMP и затенения Фонга

В настоящее время я настраиваю освещение в 3D-сцене, созданной в Blender и загруженной через assimp со следующими параметрами:

aiProcess_GenSmoothNormals | aiProcess_Triangulate | aiProcess_CalcTangentSpace | aiProcess_FlipUVs

В настоящее время я застрял в действительно странном сбое в моей программе. Я реализую Фонг затенение на фрагмент шейдера для освещения со следующими свойствами:

  1. У каждой из моделей есть настроенные текстуры.
  2. У каждой из моделей есть нормальные векторы, загруженные из модели (с некоторыми предварительными вычислениями, вероятно, из-за флага aiProcess_GenSmoothNormals)
  3. Зеркальный свет работает на всех объектах.
  4. Рассеянные цвета работают как надо.

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

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

Нормалы как видно в блендере
Нормалы как видно в блендере

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

Вершинный шейдер:

#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 неправильно загружает нормали?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]