2016-05-05 4 views
0

Я работаю над световой механикой для приложения и получаю рассеянный свет (окружающий и направленный), работающий просто отлично, но зеркальный свет создает некоторые странные эффекты. Как будто он сводит на нет рассеянный свет в полосе вокруг него.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).:

one two

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); 
} 
+0

Координаты текстуры совершенно разные между двумя скриншотами, а не только освещением, поэтому в коде, который вы еще не опубликовали, есть что-то еще. Пожалуйста, уменьшите свой код до минимального примера, а затем опубликуйте весь пример. –

+0

Причина в том, что они разные, потому что сетка вращается, поэтому извините за эту путаницу. – WarSensation

+2

Даже не видя остальной код, наиболее вероятной причиной этого симптома является то, что ваши векторы ошибаются где-то так, что 'dot (directionToEye, reflectionDirection)' заканчивается отрицательным. Вы можете проверить гипотезу, нажимая 'specularFactor' на диапазон [0.0,1.0], и если это удалит черный, вернитесь назад, чтобы узнать, какой вектор является неправильным. –

ответ

0

две вещи:

  1. Вы инициализацией specularColor к нулю в любом месте? Если да, вы не разместили его.
  2. Первый вход функции pow должен быть> = 0, иначе вы получите неопределенное поведение. (см. https://www.khronos.org/files/opengles_shading_language.pdf, раздел 8.2)
+0

Я инициализировал его до нуля, извините за то, что не опубликовал эту часть. И получается, что функция pow была проблемой, поэтому я просто переместил функцию pow внутри оператора if, который проверяет, является ли точечный продукт> 0. – WarSensation