Я работал над механикой света для приложения и добился того, что рассеянный свет (окружающий и направленный) работает просто отлично, но зеркальный свет создает некоторые странные эффекты. Он как бы сводит на нет рассеянный свет в полосе вокруг себя.
Вот расчет зеркального света.
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);
}
dot(directionToEye, reflectDirection)
заканчивается отрицательным значением. Вы можете проверить гипотезу, зажавspecularFactor
в диапазоне [0.0,1.0], и если это удалит черный цвет, проследите назад, чтобы выяснить, какой вектор неверен. - person Dan Hulme   schedule 05.05.2016