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