2016-05-05 41 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

编辑:问题已得到修复通过将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,reflectDirection)'最终为负值。您可以通过将'specularFactor'限制在[0.0,1.0]范围内来检验假设,如果删除了黑色,则可以回溯以找出哪个向量是错误的。 –

回答

0

两件事情:

  1. 你初始化specularColor随时随地为零?如果你是,你还没有发布它。
  2. pow函数的第一个输入必须> = 0,否则你会得到未定义的行为。 (请参阅https://www.khronos.org/files/opengles_shading_language.pdf第8.2节)
+0

我没有初始化为零,抱歉没有发布该部分。事实证明pow函数是个问题,所以我只是在if语句中移动pow函数来检查点积是否大于0。 – WarSensation