OpenGL ES 2.0 Зеркальный свет создает черную рамку

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

Вот расчет зеркального света.

vec3 directionToEye = normalize(u_eyePos - position);
vec3 reflectDirection = normalize(reflect(direction, normal));

float specularFactor = dot(directionToEye, reflectDirection);
specularFactor = pow(specularFactor, u_specularExponent);

if(specularFactor > 0.0){
    specularColor = vec4(base.color, 1.0) * u_specularIntensity * specularFactor;
}

И затем функция расчета общего освещения возвращает это.

return diffuseColor + specularColor;

А в функции main() я просто перемножаю их все вместе.

gl_FragColor = baseColor * textureColor * returnedValueOfTheLightCalcFunction;

Все они являются значениями vec4.

Вот скриншоты БЕЗ(1.) и С(2.) включенным зеркальным светом:

одиндва

РЕДАКТИРОВАТЬ: Проблема была исправлена ​​путем помещения функции pow внутрь оператора if. По сути, я забыл, что мне нужно проверять, является ли скалярное произведение > 0, а не pow-функцией. Вот обновленный код.

diffuseColor = vec4(base.color, 1.0) * base.intensity * diffuseFactor;

vec3 directionToEye = normalize(u_eyePos - position);
vec3 reflectDirection = normalize(reflect(direction, normal));

float specularFactor = dot(directionToEye, reflectDirection);

if(specularFactor > 0.0){
    specularColor = vec4(base.color, 1.0) * u_specularIntensity * pow(specularFactor, u_specularExponent);
}

person WarSensation    schedule 05.05.2016    source источник
comment
Координаты текстуры на ваших двух скриншотах совершенно разные, а не только освещение, так что в коде, который вы не опубликовали, определенно происходит что-то еще. Пожалуйста, сократите свой код до минимального примера, а затем опубликуйте весь пример.   -  person Dan Hulme    schedule 05.05.2016
comment
Причина, по которой они разные, заключается в том, что сетка вращается, так что извините за эту путаницу.   -  person WarSensation    schedule 05.05.2016
comment
Даже не видя остального кода, наиболее вероятной причиной этого симптома является то, что ваши векторы где-то идут неправильно, так что dot(directionToEye, reflectDirection) заканчивается отрицательным значением. Вы можете проверить гипотезу, зажав specularFactor в диапазоне [0.0,1.0], и если это удалит черный цвет, проследите назад, чтобы выяснить, какой вектор неверен.   -  person Dan Hulme    schedule 05.05.2016
comment
Вы правы, зажатие удаляет черный цвет. Спасибо за помощь, сейчас попробую отследить баг.   -  person WarSensation    schedule 05.05.2016


Ответы (1)


Две вещи:

  1. Вы где-нибудь инициализируете specularColor до нуля? Если да, то вы его не опубликовали.
  2. Первый ввод функции pow ДОЛЖЕН быть >= 0, иначе вы получите неопределенное поведение. (см. https://www.khronos.org/files/opengles_shading_language.pdf, раздел 8.2. )
person Columbo    schedule 05.05.2016
comment
Я инициализировал его нулем, извините, что не опубликовал эту часть. И оказалось, что проблема заключалась в функции pow, поэтому я просто переместил функцию pow внутрь оператора if, который проверяет, больше ли скалярное произведение > 0. - person WarSensation; 05.05.2016