1

我一直在研究应用程序的光机制,并且让漫反射光(环境光和定向光)工作得很好,但是镜面光会产生一些奇怪的效果。好像它消除了它周围一条带中的漫射光。

这是镜面光的计算。

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);
}
4

1 回答 1

0

两件事情:

  1. 您是否在任何地方将 specularColor 初始化为零?如果你是,你还没有发布它。
  2. pow 函数的第一个输入必须 >= 0,否则您将获得未定义的行为。(见https://www.khronos.org/files/opengles_shading_language.pdf第 8.2 节)
于 2016-05-05T16:59:17.207 回答