Увеличение зеркального блеска уменьшает освещение в OpenGL
У меня проблема с изменением зеркальной компоненты питания в моем шейдере opengl 4.3. То, что происходит, - зеркальное отражение, работает нормально, когда я использую значение блеска от 0 до 10, однако, поскольку значение увеличивается, чтобы сделать материал более блестящим, интенсивность освещения уменьшается. Вот мой код:
//Direct Lighting
vec3 L = normalize(worldPos.xyz - lightPos.xyz);
vec3 D = normalize(lightDir.xyz);
float dist = length(-L);
float I = max(dot(N.xyz, -L), 0.0);
vec3 h = normalize(-L.xyz + E);
float specLighting = 0.0;
specLighting = pow(max(dot(N.xyz, h), 0.0),50.0);
fColor.xyz = vec3(specLighting);
Так что, если увеличить значение блеска до 50, света вообще не будет. Кстати, в этом коде я показываю только зеркальное отражение для устранения проблемы.
[EDIT] Извините за недостаток деталей в объяснении, я приложил несколько скриншотов результатов изменения значения блеска зеркального отражения с 1 на 7. Как вы можете видеть, поскольку зеркальное выделение уменьшается в размере (что я хочу), освещение также исчезает (что не то, что я хочу). Он достигает точки, где примерно через 10 он становится полностью черным.
Кстати, я делаю это полностью в пиксельном / фрагментном шейдере.
Я также добавил скриншот с моего тестового движка directx 11, использующего точно такой же код для зеркального освещения, но с коэффициентом блеска 100.
Directx 11:
4 ответа
Если вы хотите поддерживать минимальное освещение на основе освещения, вы должны добавить не зеркальный компонент. Зеркальный компонент обычно используется для добавления бликов к материалу, а не в качестве единственного участника.
В любом случае, затемнение, о котором вы сообщаете, является естественным результатом увеличения показателя степени. Подумайте об этом: потому что векторы предварительно нормализованы, dot(N.xyz, h)
не более чем 1.0
, Повышение числа от 0 до 1 до высокой мощности, естественно, приведет к тому, что результат будет очень маленьким и очень быстрым... это именно то, что вам нужно для яркого зеркального выделения!
Конечно, уменьшение размера подсветки уменьшит среднее зеркальное отражение (если, конечно, вы не сделали максимальное зеркальное отражение намного ярче...). Но очень немногие реальные объекты имеют только зеркальное отражение. И если бы объект имел только зеркальное отражение, он бы выглядел очень темным, за исключением зеркальных пятен.
Еще один способ взглянуть на это: ваша формула дает вам зеркальную яркость, максимальное значение которой равно 1.0
(что в некоторых отношениях практически удобно для обычной компьютерной графики с низким динамическим диапазоном, где каждый цветовой канал максимально 1.0
). Однако в реальном мире более блестящая поверхность, как правило, приводит к тому, что бликовые блики становятся ярче и меньше, так что средняя яркость бликов остается неизменной. Именно контраст между этими случаями делает ситуацию запутанной. Для практических целей формула "работает как задумано - не исправит"; как правило, художник просто корректирует показатель зеркальности и яркость, пока не получит желаемый вид.
Спасибо за вашу помощь, ребята,
Оказалось, что это была просто глупая ошибка в вершинном шейдере:
вместо:
fNorm = vec4(mat3(worldSpace)*vNorm.xyz,0);
Я только что:
fNorm = vNorm;
Я первоначально написал этот ответ, прежде чем вопрос был обновлен с достаточным количеством информации. Так что это, очевидно, не правильный ответ в этом случае, но может относиться к кому-то с подобной проблемой...
Одним из возможных объяснений того, почему зеркальное освещение будет уменьшаться по интенсивности с увеличением мощности, является то, что если вы рассчитываете его на уровне вершин, а не на пиксель. Если точка выделения попадает в середину многоугольника, а не прямо в вершине, тогда, когда она уменьшается в размере с увеличением блеска, вклады вершин будут быстро уменьшаться, а выделение исчезнет. Действительно для хорошего зеркального отражения (и действительно для хорошего освещения в целом), вам нужно рассчитывать на пиксель и интерполировать только те вещи, которые на самом деле плавно меняются по всему многоугольнику, например, положение или нормаль.
Если вы увеличите "блеск", ваш материал будет менее блестящим.