GLSL - PBR Shader - Диффузный компонент IBL, не отображающий

123
19

Я собрал программу, частично основанную на learnopengl.com.

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

При запуске без IBL сцена выглядит следующим образом:

Но при работе с IBL это выглядит так:

Как вы можете видеть, сферы с помощью PBR-шейдеров исчезают.

Раздел, который вызывает проблему, выглядит следующим образом:

vec3 kS = fresnelSchlick(max(dot(N, V), 0.0), F0);
vec3 kD = 1.0 - kS;
kD *= 1.0 - metallic;
vec3 irradiance = texture(irradianceMap, N).rgb;
vec3 diffuse = irradiance * albedo;
vec3 ambient = kD * vec3(diffuse) * ao;

colour = ambient +Lo;

В частности, проблема заключается в переменной освещенности, которая, когда я выполняю нормальные операции над ней, работает отлично, например, если умножить ее на 0.01, она будет темнеть значительно, как и ожидалось. Однако, когда я добавляю или умножаю, например, переменную альбедо с отсутствием излучения, и ничего не выводится. Я пробовал 1000 различных комбинаций и переменных, и я просто не могу понять, почему он не позволит этой переменной объединиться с другими. Я не понимаю, почему умножение irradiance.r на albedo.r как-то ничего не производит. Даже если оба равны 0, результат будет черным, а не полностью исчезают сферы.

Это, например, работает:

vec3 irradiance = texture(irradianceMap, N).rgb;

colour = irradiance;

Так же как и это:

vec3 irradiance = texture(irradianceMap, N).rgb;

colour = irradiance*0.01;

Но это не удается:

vec3 irradiance = texture(irradianceMap, N).rgb;

colour = irradiance*albedo;

Так же как и это:

vec3 irradiance = texture(irradianceMap, N).rgb;

colour = vec3(irradiance.r,albedo.g,albedo.b);

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

спросил(а) 2021-01-19T13:29:18+03:00 2 месяца, 3 недели назад
1
Решение
75

Скорее всего, компиляция шейдеров не выполняется из-за неопределенности albedo, неправильного типа и т.д. У вас есть uniform vec3 albedo; или эквивалент, определенный в шейдере?

Из примеров, которые вы показали, это, безусловно, выглядит проблемой с albedo а не с irradiance.

ответил(а) 2021-01-19T13:29:18+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема