2017-08-27 9 views
0

これは私の現在のフラグメントシェーダのメインです。光の計算でlightDotを使用しないと、照明はあらゆる方向に均等に白を退色させる素敵な丸です。しかし、いったん私はlight.Dotを追加すると、オブジェクトの他の半分を黒くするようです。

Screenshot

私の知る限り、ドットプロダクトは、世界の位置とライトの間の角度がサーフェスの法線に近く、ライトが明るくなるように明るくする必要があります。私のドットプロダクトが3dのために他の方向に黒くなるのはなぜですか?

void main() 
{ 
    vec3 lightDir=normalize(lightPosition-worldPosition); 

    float lightDot=dot(worldNormal,lightDir); 
    float dist=distance(lightPosition,worldPosition); 
    vec3 light=lightDot*materialDiffuse/(dist*dist); 

    fragmentColor=vec4(pow(light.x,gamma),pow(light.y,gamma),pow(light.z,gamma),1); 
} 

答えて

1

ドットプロダクトは署名されています。ただ、いくつかの値をプラグイン:あなたが0にクランプシェーダで通常

(0,1) dot (0,1) = 1 
(0,-1) dot (0,1) = -1 

を、私たちは否定することはできません入射光を近似しようとしているため。

0

問題は実際にモデルのインポーターがジオメトリ上でY軸とZ軸を入れ替えても法線を入れ替えていないことです。私は、X軸が一方向に動くことによって、ドットプロダクトが通常のものから離れていくように、なぜドットプロダクトを縮小するのか疑問に思ってこれを理解しました。

関連する問題