このチュートリアルに従って、OpenGL グラフィック エンジンにディファード ライティング メカニズムを実装しています。それはうまく機能します、私はそれで問題を起こしません。
ポイント ライトに関しては、ライトの周囲の球体をレンダリングして、ライトの影響を受ける可能性のあるピクセルのみをライティング シェーダーを通過させるように指示します。ここで正確に説明されているカルフェイスとカメラの位置に関して、その方法にはいくつかの問題があります。これらを解決するために、チュートリアルでは stencil-test を使用します。
私は最初の質問につながるその方法の効率を疑っています:
光球を表す円を描く方がはるかに良いと思いませんか?
球体は、どの視点から見ても、画面上では常に円のように見えます。タスクは、円のスクリーン位置とスケーリングを決定することです。この方法には 3 つの利点があります。
- カルフェイス問題なし
- カメレポジション イン ライトスフィアの問題はありません
- はるかに効率的 (頂点の量が大幅に削減 + ステンシル テストなし)
この手法を使用するデメリットはありますか?
私の2番目の質問は、言及された方法の実装を扱っています。円の中心位置は、いつものように簡単に計算できます。
vec4 screenpos = modelViewProjectionMatrix * vec4(pos, 1.0);
vec2 centerpoint = vec2(screenpos / screenpos.w);
しかし、結果として得られる円のスケーリングをどのように計算するのでしょうか? 距離 (カメラからライトまで) と何らかの形で透視図に依存する必要があります。