1

このチュートリアルに従って、OpenGL グラフィック エンジンにディファード ライティング メカニズムを実装しています。それはうまく機能します、私はそれで問題を起こしません。

ポイント ライトに関しては、ライトの周囲の球体をレンダリングして、ライトの影響を受ける可能性のあるピクセルのみをライティング シェーダーを通過させるように指示します。ここで正確に説明されているカルフェイスとカメラの位置に関して、その方法にはいくつかの問題があります。これらを解決するために、チュートリアルでは stencil-test を使用します。

私は最初の質問につながるその方法の効率を疑っています:

光球を表す円を描く方がはるかに良いと思いませんか?

球体は、どの視点から見ても、画面上では常に円のように見えます。タスクは、円のスクリーン位置とスケーリングを決定することです。この方法には 3 つの利点があります。

  • カルフェイス問題なし
  • カメレポジション イン ライトスフィアの問題はありません
  • はるかに効率的 (頂点の量が大幅に削減 + ステンシル テストなし)

この手法を使用するデメリットはありますか?

私の2番目の質問は、言及された方法の実装を扱っています。円の中心位置は、いつものように簡単に計算できます。

vec4 screenpos = modelViewProjectionMatrix * vec4(pos, 1.0);
vec2 centerpoint = vec2(screenpos / screenpos.w);

しかし、結果として得られる円のスケーリングをどのように計算するのでしょうか? 距離 (カメラからライトまで) と何らかの形で透視図に依存する必要があります。

4

2 に答える 2

1

それはうまくいかないと思います。球を使用するポイントは、球が単なる円ではなくライト ボリュームとして使用されることです。ライト ボリューム内にあるシーン内のポリゴンにライティングを適用します。シーンがレンダリングされると、深度バッファーに書き込まれます。このデータは、照明を正しく適用するために、ライト ボリューム レンダリング ステップで使用されます。ただの円だと、円が正しい奥行きで投影されたとしても、A と C が照らされるべきかどうかはわかりません。

ここに画像の説明を入力

于 2014-02-21T17:38:27.707 に答える
1

全体を読んだわけではありませんが、この方法の一般的な考え方は理解できたと思います。

  1. あまり役に立ちません。円がニア プレーンの後ろになるようにカメラを移動すると、まだ問題が発生します。この場合、フラグメントは生成されず、ライトは「消えます」。

  2. この記事で説明されているライトは急激な減衰があります - 当然のことながら、球や円は境界がはっきりしているためです。私はそれを点雷とは呼びません...

  3. 私にとって、これは時期尚早の最適化のように見えます...私は確かにスクリーンクワッド全体をレンダリングし、ほとんどいつものようにシェーディングを行います。特別なケースを心配する必要はありません。opengl 状態のすべての操作と追加の描画操作もオーバーヘッドを導入することを忘れないでください。ここでは、どちらが他方を上回るかは明確ではありません。

  4. ここでパースペクティブ分割を行うのを忘れました

  5. スケーリングを計算する最も簡単な方法は、球面上のポイントをスクリーン座標に変換し、ベクトルの長さを計算することです。明らかに、画面空間の境界上の点でなければなりません。

于 2014-02-21T17:30:53.393 に答える