Отображение нормалей только "работает" на отрицательной оси - PullRequest
0 голосов
/ 26 января 2019

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

Я пытался сделать кучу вещей, включая использование различных методов, умножение направления света и положения камеры вместо карты нормалей, использование транспонированной и инвертированной матрицы TBN, проверка процесса загрузки текстуры иотключение всех процессов, которые могут помешать, и многое другое.

Вот мой основной метод в моем вершинном шейдере:

gl_Position = ProjectionMatrix * EyeMatrix * ModelMatrix * vec4(Position, 1.0);
texCoords = TexCoords;
position = (ModelMatrix * vec4(Position, 1.0)).xyz;

vec3 n = normalize((ModelMatrix * vec4(Normal, 0.0))).xyz;
vec3 t = normalize((ModelMatrix * vec4(Tangent, 0.0))).xyz;

t = normalize(t - dot(t, n) * n);

vec3 b = cross(t, n);

tbnMatrix = mat3(t, b, n);

Вот как я вычисляю свое освещение:

vec3 calculatePointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir, float energyConservation)
{
vec3 lightDir = normalize(light.position - fragPos);

float diff = max(dot(normal, normalize(lightDir + viewDir)), 0.0);

float spec = energyConservation * pow(max(dot(normal, normalize(lightDir + viewDir)), material.specularIntensity), material.specularDampening);

float distance    = length(light.position - fragPos);
float attenuation = 1.0 / (light.attenuation.constant + light.attenuation.linear * distance + 
             light.attenuation.quadratic * pow(distance, 2.2));    

vec3 ambient  = light.baseLight.ambient * vec3(texture(material.texture_diffuse, texCoords));
vec3 diffuse  = (light.baseLight.diffuse * light.baseLight.intensity) * diff * vec3(texture(material.texture_diffuse, texCoords));
vec3 specular = (light.baseLight.specular * light.baseLight.intensity) * spec * vec3(texture(material.texture_gloss, texCoords));

ambient  *= attenuation;
diffuse  *= attenuation;
specular *= attenuation;

return (ambient + diffuse + specular);
}

и вот код моей карты нормалей:

vec3 normal = normalize(tbnMatrix * (255.0/128.0 * texture(material.texture_normal, texCoords).xyz - 1));

Вот как выглядят касательные:

Вот как выглядят касательные с примененной матрицей TBN:

Вот компонент T, загруженный в (без каких-либо выпусков):
HeЭто компонент B (компонент вершинного шейдера):
Вот компонент N, загруженный (без каких-либо выпусков):

И вот что я получаю при рендеринге сцены с нормальным отображением:


Вот как это выглядит без нормального отображения (с включенным mipmapping и анизотропной фильтрацией):

(Имейте в виду, яесть и зеркальные карты)

1 Ответ

0 голосов
/ 16 февраля 2019

Итак, я обнаружил проблему через несколько недель, и это была очень простая ошибка.Во время обработки загрузки текстуры я использовал GL_SRGB вместо обычного GL_RGB, а SRGB - это версия текстуры с гамма-коррекцией вместо реального чистого изображения.Поэтому мне пришлось сделать опцию, чтобы отключить и включить загрузку SRGB в конструкторе для карт нормалей, глянца и смещений, в основном всего, что не отображалось на экране.

...