Я работаю над световой механикой для приложения и получаю рассеянный свет (окружающий и направленный), работающий просто отлично, но зеркальный свет создает некоторые странные эффекты. Как будто он сводит на нет рассеянный свет в полосе вокруг него.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).:
EDIT: Проблема была решена путем ввода функции POW внутри если заявление. Я по существу забыл, что мне нужно проверить, является ли точечный продукт> 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);
}
Координаты текстуры совершенно разные между двумя скриншотами, а не только освещением, поэтому в коде, который вы еще не опубликовали, есть что-то еще. Пожалуйста, уменьшите свой код до минимального примера, а затем опубликуйте весь пример. –
Причина в том, что они разные, потому что сетка вращается, поэтому извините за эту путаницу. – WarSensation
Даже не видя остальной код, наиболее вероятной причиной этого симптома является то, что ваши векторы ошибаются где-то так, что 'dot (directionToEye, reflectionDirection)' заканчивается отрицательным. Вы можете проверить гипотезу, нажимая 'specularFactor' на диапазон [0.0,1.0], и если это удалит черный, вернитесь назад, чтобы узнать, какой вектор является неправильным. –