我一直在为一个应用程序的光机制工作,并获得漫反射光(环境和方向)工作得很好,但镜面光创造了一些奇怪的效果。就好像它可以消除它周围的散射光。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):
编辑:问题已得到修复通过将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,reflectDirection)'最终为负值。您可以通过将'specularFactor'限制在[0.0,1.0]范围内来检验假设,如果删除了黑色,则可以回溯以找出哪个向量是错误的。 –