照明モデルの線形減衰成分には物理的な対応物がありますか?


18

OpenGL(および他のシステム)では、ポイントライトの距離減衰係数はのようなものです1/(c+kd+sd^2)。ここdで、はライトからの距離ckおよびsは定数です。

sd^2現実に予想される、よく知られている物理的に正確な「逆二乗則」減衰をモデル化するコンポーネントを理解しています。

定数c(通常は1)は、非常に小さな値d(およびおそらくゼロ除算の防御)を処理するためにあると思います。

kdモデルでの線形コンポーネントの役割(kOpenGLではデフォルトでゼロ)。いつ他の値を使用しkますか?これは「線形減衰」コンポーネントと呼ばれますが、ライティングモデルでどのような動作をシミュレートしますか?私が知っている光の物理モデルには現れないようです。

[編集]

David Gouveiaは、線形係数を使用して、シーンを開発者/アーティストが意図したものに近づけたり、ライトが落ちる速度をよりよく制御したりするのに役立つ可能性があると指摘しています。どちらの場合、私の質問は「線形減衰係数に物理的な同等物がありますか、それとも単にシーンの光の品質を制御するためのファッジ係数として使用されていますか?」


線形減衰により、シーンがより良く見える、またはよりリアルになるとは言いませんでした。私が言ったことあなたの目的にとってはより良く見えるかもしれないということです。私のレイトレーサーは非常に小さなシーンを照らし、両方のモデルを比較すると、線形がより良く見えました。それが良く見えると言うのに物理的な理由は必要ありません-それはちょうど私が達成したい効果に近く見えました。逆に、逆二乗の法則が現実的に見えなかったということではなく、ただちに落ちすぎて、必要なものよりもシーンの照明に寄与しなかっただけです。
デヴィッド

申し訳ありませんが、デビッド、私はあなたの答えを誤って伝えるつもりはありませんでした。上記の編集を変更しました。
ケン

1
すべての照明はハックであり、純粋でシンプルなことを忘れないでください=)
パトリックヒューズ

回答:


21

点状の光源からの光は、距離の2乗で落ちます。それが物理的な現実です。

多くの場合、線形減衰は優れていると言われています。しかし、これは非線形色空間で作業している場合にのみ当てはまります。つまり、適切なガンマ補正がアクティブになっていない場合です。その理由は非常に簡単です。

ガンマ補正なしで線形ディスプレイに非線形RGB値を書き込む場合、線形値はモニターの組み込みガンマランプによって破壊されます。これにより、実際に意図したものと比べてシーンが効果的に暗くなります。

ガンマが2.2であると仮定すると、モニターは効果的にすべての色を2.2の累乗まで表示します。

これは線形減衰です1/kd。これは、モニターのガンマランプが適用された線形減衰です1/(kd)^2.2。これは、適切な逆二乗関係にかなり近いです。

しかし、実際の逆二乗:1/sd^2は次のようになります1/((s^2)(d^4.4))。これは、光の減衰が落下しますずっとより大幅に予想以上。

一般に、適切なガンマ補正(sRGBフレームバッファーへのレンダリングなど)を使用している場合は、線形減衰を使用しないでください。正しく見えません。まったく。そして、ガンマ補正を使用していない場合...あなたの何が問題なのか;)

いずれにせよ、現実を模倣しようとする場合、逆二乗(およびガンマ補正)が必要です。そうでない場合は、シーンに必要なことは何でもできます。


4
+1ガンマ補正のレンダリングについてはしばらく知っています。私はしばらくの間、二次および線形減衰について知っていました。そして、これは私が最初に2つの間の接続を実現する瞬間です。:-)
デヴィッドゴーベイア

-1の理由は何ですか?
ニコルボラス

9

柔軟性

ライトを直線的に落とす必要があるかもしれないからです。その程度の制御を提供するためにあります。実際には物理的に正確である必要はありません(フォンシェーディングライティング方程式全体も物理的に正確ではありません)。

時々、二次モデルは光源の近くで速すぎて光を出し、近くの表面に「白いまぶしさ」を残すことがあります。線形および定数係数を提供することにより、好みに合わせて結果を調整する柔軟性があります

たとえば、レイトレーサーを実装したとき、逆二乗の法則によってポイントライトが急速に落ちてしまうことがわかりました。クランプ線形モデル(各ライトに最小および最大半径があり、その間に線形補間がある)に変更したところ、見栄えがよくなりました。

編集:これを説明する素晴らしいリソースを見つけました。


6

さて、私はそれを推測するつもりです。

予備観察

OpenGL(および他のシステム)では、ポイントライトの距離減衰係数はのようなものです1/(c+kd+sd^2)。ここdで、はライトからの距離ckおよびsは定数です。

sd^2現実に予想される、よく知られている物理的に正確な「逆二乗則」減衰をモデル化するコンポーネントを理解しています。

の曲線c+kd+sd^2は放物線であり、の曲線も同様ですsd^2。違いは見た目ほど重要ではありません。それらは無限で同様に振る舞います。小さな値のためだけに違います。kを意味するにしても、光に近いときにのみ意味があります。

予備的な簡素化

これは減衰係数であるため、式でs == 1各定数を設定、または除算sし、光源のパワーをで除算することもできますs。数式に1つのパラメーターが多すぎます。

次のようになります。

1/(c/s+(k/s)d+d^2)

変数の変更

…これは次のものと厳密に同等です。

1/(A + D^2)

A == c/s - k^2/(4s^2)そして、さらに重要なことD == d + k/2s

これは1/(A+D^2)本当にいつものように見え1/(c+d^2)ますよね?

結論

k因子前進またはそれだけの半径で開始するように光の減衰を遅延させる-k/2s(はい、それはまた、「負」の半径を有するだけ二度目外光聞かせ虚球面ミラー内部の仮想点光源と考えることができます) 。数学が再び勝ったようです!

編集:ちょっとの間、私はそれが球形の光と同等であると思ったが、そうではなかった。最も顕著なのは、ソフトシャドウを生成しないことです。

使いやすさ?

私の推測では、アーティストはこのパラメーターを使用して、照明の観点からオブジェクトに近い(または遠い)ように見えるように、ただし動かさずにライトを表示できると考えています。ポイントライトはハードシャドウを生成するため、ライトが特定の位置にとどまることが必要な場合があります。


3

線形減衰係数は、媒体に移動する光の物理的な対応物です。減衰がなければ、光は完全に空虚に進むようです。「リアルな」シーンをレンダリングする場合、空気の距離に応じて光の強度を減衰させ、この減衰は線形です。


それは本当だとは思わない。媒体を介して進行する光は、によって減衰されるであろう1/dR、座標依然としてによって1/d^2thetaphi球面座標。したがって、あなたが説明1/d^3するのは光の強度の減衰です。
サムホセバー

3

線形減衰係数は、照明に線形減衰を使用する場合に使用しますが、重要なのは、それを使用する必要がないことです(または、他の減衰係数を使用する必要があります)。

これにより、照明を自分の好みに合わせて調整できます。したがって、0にしたくない減衰係数と0以外にしたい減衰係数を設定するだけで済みます。

線形減衰を使用する場合の具体的な例の1つは、より数学的に正しい逆2乗が速すぎるフォールオフを提供する場合です。リニアを使用すると、多かれ少なかれ十分に見える結果を得ることができます(そして、シーン内のより少ないライトで)。したがって、定数0、線形1、指数0を使用します。

OpenGLとD3Dの両方のポイントスプライト(およびOpenGLのポイントパラメーター)が同じ減衰式を使用していることに注意してください(ただし、この議論には関係ありません)。

また、OpenGL / D3Dライティングは厳密に物理的に正しいことを意図したものではないことに注意してください。許容できる近似値を超えるように設計されたことはありません。その動作方法に関連するクエリを実行する場合は、この点に留意する必要があります。

もちろん、最近ではシェーダーを使用する可能性が最も高いため、古いライト式は主に学術的/歴史的関心のみを目的としています。好きなライト式を書くことができます。


1
  • c 光源の一定の減衰値です。
  • lは線形減衰です。そのため、光源までの距離が乗算されます。
  • s は2次減衰であるため、距離の2乗が乗算されます。

このリンクにはさらに情報があります。


感謝しますが、私の質問は、光のモデリングにおける線形減衰成分の役割です。私が知っている光の物理モデルには現れないからです。提供するリンクは、線形減衰成分の目的を説明していません。ただ言うだけです。「これは線形減衰」であり、他に説明はありません。
ケン

さて、あなたの質問を誤解しました。線形減衰は、無限の1次元光源(蛍光灯のような)でよりよく観察されますが、2次モデルは球状光源の動作をモデル化します。これまでのところ、物理ライトモデルとコンピューターグラフィックスで使用されるモデルとの対応関係の説明がある場所は1つだけでした。imdoingitwrong.wordpress.com
2011

1

これは、尊敬されているエリックレンジェルの言葉で、 Zが、

透視補正ラスタライズには1 / zの線形補間が必要なため、非線形です。z自体の線形補間では正しい結果が生成されません。ハードウェアは各頂点で1 / zを計算し、三角形全体に補間する必要があるため、zを回復するためにすべてのピクセルで高価な除算を実行するのではなく、その値を深度バッファーに書き込むだけで便利です。

ニアプレーンにより近いz精度が得られるという事実は単なる副作用であり、1 / z補間の背後にある動機とは関係ありません。

深度バッファは距離を保存します。光は減衰に距離を使用します。これが必要なのは深度バッファーとライティングの実装との関係かもしれませんが、ライティングアルゴリズムがスクリーンスペースで実行された場合にのみ適用されると思います。事前に計算された(またはハードウェアで計算された)逆行列を常に保存する方が、それを必要とするフレームごとの各opの分割されていない値で除算を実行するよりも優れていることを忘れないでください...そしてそれは非常に多くのopになる傾向があります

これは単なる推測です。


そこに何かがあるかもしれません。それは、照明が計算される空間と何か関係があるかもしれません。ただし、深度バッファは、光からオブジェクトまでの距離ではなく、目(またはフロントプレーン)からオブジェクトまでの「疑似距離」を格納するため、深度バッファはその一部ではないと思います。照明で使用される光の距離です。
ケン

@downvoter-コメントするのを気にするか、単にトローリングしますか?(ジョナサンを引用)
エンジニア

ダウンボーティングも同様に、減衰は正規化された空間ではなく目の空間で計算されます-> perspective / zはこれとは関係ありません
オリバーゼンデル

1

補足として:openGLモデルを使用して球面光源を近似する場合、3つの係数はすべて意味を持ち有効です(「オーバーフローを防ぐため」または「芸術的な自由」を持たないため)。

半径rの球の場合:

1 /(d / r + 1)^ 2

これは

c = 1 k = 2 / r s =(1 / r ^ 2)

http://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/を参照)。

私見では、この近似は、まったく延長のない無限小のポイントライトを使用するよりも優れています!


式1 /(d / r + 1)^ 2はどうやって来るのですか?元の記事は「一連のテストの結果を見た後、それが明らかになった」としか言っていませんが、物理的なモデリングについて質問しているという点では十分ではありません。
user1914692

0

フォーミュラについて異なる見解/回答があります。

たとえば、スポットライトを表示すると、実際には光の散乱が見られます。したがって、1 / d ^ 2の式は、そのピクセルの発光のみを対象としています。しかし、そのピクセルのカメラの明るさはより複雑な式を持ち、光散乱理論を使用します。論文を見る

「単一散乱による参加メディアでの影と薄明光線のエピポーラサンプリング」

トーマス・エンゲルハルト、カーステン・ダックスバッハーしかし、残念なことに、彼らは光散乱のための最終的な簡単な公式を持っていません。最終的なGPUの模倣効果は、線形および二次式に似ていると思います。

だから私は主張を考える:

「現実を模倣しようとする場合、逆二乗(およびガンマ補正)が必要です」は無効です。

実際、ガンマを使用しない線形および二次係数を含む式を使用すると、光る効果を非常によく模倣できます。リニアはできません。

要約すると、この式には光散乱の物理的な対応があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.