1

シーンでピクセルごとの blinn phong ライティングを行うための GLSL シェーダーを作成しましたが、シーンのライト キャストに問題がありました。各ライトは、その効果に非常に厳しい境界を持っているようです (添付のスクリーンショットでは、底面のライトの境界を見ることができます - ライト (そのワールド位置は、シーン内のぶら下がっている黒い球体に相当します) がぶら下がっています)飛行機とフェラーリのモデルですが、何らかの理由で、カメラから離れた前方ではなく、カメラの後方/に向かって/カメラに適切にライトをキャストするだけです。

私は間違いを犯しているように感じます/目の方向がブリンフォン照明モデルにどのように影響するかについての理解が不足しています. 計算を間違えたのでしょうか、それともこの特定の照明モデルがどのように機能するのか理解できていないのでしょうか?

私のシェーダー コードはこちら: https://gist.github.com/1040417

効果のスクリーンショット:シーンのライト境界カットオフ

4

1 に答える 1

2

半ベクトルの計算が間違っているようです。ハーフ ベクトルは、ライトの方向とビューの方向 (カメラの方向) の間のベクトルであり、目の方向が照明に影響を与える部分でもあります。ただし、ビュー空間ではなくワールド空間で照明を計算しているため、ビュー空間の位置を視線方向として使用することはできません。代わりに、ワールド空間でのビューアー/カメラの位置をシェーダーへの入力として使用する必要があります。ああ、ハーフ ベクトルを計算する前にライト ベクトルを正規化することを忘れないでください (また、正規化されたライト ベクトルを補間します)。だから代用

halfVectors[i] = normalize(lights.allLights[i].position + lightDirections[i]);

uniform vec3 viewerPos;
...
vec3 eyeDirection = normalize(viewerPos - worldPosition.xyz);
...
lightDirections[i] /= dist;
halfVectors[i] = normalize(eyeDirection + lightDirections[i]);

トリックを行う必要があります。目の方向は、フラグメント シェーダーでは必要ないため (ハーフ ベクトルに暗黙的に保存されるため)、可変である必要はもうありません。

ハーフ ベクトルを補間すると、目の方向を補間してフラグメント シェーダーでハーフ ベクトルを計算するのとまったく同じ結果が得られるかどうかはわかりません (この方法では、多くの変数を節約できます)。しかし、少なくとも今はうまくいくはずです。

EDIT:減衰係数と同じ。光までの距離は非線形であるため、フラグメントごとに計算した場合とまったく同じ結果が得られない場合があります。しかし、テッセレーションの品質によっては、許容できる場合があります。

于 2011-06-22T22:50:49.847 に答える