OpenGL ES 2.0高光灯产生黑色边框

时间:2016-05-05 13:02:53

标签: java android opengl-es glsl specular

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

这是镜面光计算。

function download-dropbox($Url, $FilePath) {
    $wc = New-Object system.net.webclient
    $req = [System.Net.HttpWebRequest]::Create($Url)
    $req.CookieContainer  = New-Object System.Net.CookieContainer
    $res = $req.GetResponse()

    $cookies = $res.Cookies | % { $_.ToString()}
    $cookies = $cookies -join '; '

    $wc.Headers.Add([System.Net.HttpRequestHeader]::Cookie, $cookies)
    $newurl = $url + '?dl=1'

    mkdir (Split-Path $FilePath) -force -ea 0 | out-null
    $wc.downloadFile($newurl, $tempFile)
}

然后整体灯光计算功能返回此值。

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

在main()函数中,我只是将它们相乘。

return diffuseColor + specularColor;

它们都是vec4值。

以下是没有(1。)和WITH(2。)的屏幕截图:

one two

编辑:通过将pow函数放在if语句中来修复问题。我基本上忘记了我必须检查点积是否> 0,不是pow功能。这是更新的代码。

gl_FragColor = baseColor * textureColor * returnedValueOfTheLightCalcFunction;

1 个答案:

答案 0 :(得分:0)

两件事:

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