私はアプリケーションのための光力学に取り組んでおり、拡散光(周囲光と指向性)はうまく機能していますが、鏡面光は奇妙な効果を作り出します。あたかも周囲のストリップの拡散光を無効にするかのように。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):
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);
}
テクスチャの座標は、照明だけでなく、2つのスクリーンショットの間で完全に異なっているため、投稿していないコードには何か他のことがあります。コードを最小限の例に減らし、例全体を投稿してください。 –
メッシュが回転していることが原因です。その混乱については残念です。 – WarSensation
残りのコードが見えなくても、この症状の原因としては、あなたのベクトルが間違っていて、 'dot(directionToEye、reflectDirection)'が負の値になってしまうことが考えられます。 'specularFactor'を[0.0,1.0]の範囲にクランプして仮説をテストすることができます。もしそれが黒を取り除くなら、どのベクトルが間違っているかを調べるためにトラックバックします。 –