2016-05-05 11 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値です。

ここのがwithoutスクリーンショットであり、WITH正反射光(1)(2):

one two

EDIT:問題は、もし内部POW関数を置くことによって修正されていステートメント。私はドットプロダクトがpow関数ではなく> 0であるかどうかをチェックしなければならないことを本質的に忘れていました。ここに更新されたコードがあります。

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

テクスチャの座標は、照明だけでなく、2つのスクリーンショットの間で完全に異なっているため、投稿していないコードには何か他のことがあります。コードを最小限の例に減らし、例全体を投稿してください。 –

+0

メッシュが回転していることが原因です。その混乱については残念です。 – WarSensation

+2

残りのコードが見えなくても、この症状の原因としては、あなたのベクトルが間違っていて、 'dot(directionToEye、reflectDirection)'が負の値になってしまうことが考えられます。 'specularFactor'を[0.0,1.0]の範囲にクランプして仮説をテストすることができます。もしそれが黒を取り除くなら、どのベクトルが間違っているかを調べるためにトラックバックします。 –

答えて

0

2つのこと:

  1. あなたがゼロのどこにspecularColorを初期化していますか?あなたがいれば、あなたはそれを投稿していません。
  2. pow関数の最初の入力は> = 0でなければなりません。そうしないと、未定義の動作が発生します。 (https://www.khronos.org/files/opengles_shading_language.pdfセクション8.2を参照)
+0

私はそれを0に初期化しました、その部分を投稿してくれないのは残念です。 pow関数が問題であることが判明したので、ドットプロダクトが0より大きいかどうかを調べるif文の中でpow関数を移動しました。 – WarSensation

関連する問題