レイトレーサーに取り組んでいますが、ローカル ライティング (フォン) を反射と屈折と組み合わせる方法がわかりません。私が計算するTraceRay関数があります:localLighting、reflectColor、およびrefractor。
この時点で、私の最終的な色は単にこれら 3 つの合計です。しかし、この方法では1を超える値が得られ、これを処理する方法がわかりません。
助けてくれてありがとう
レイトレーサーに取り組んでいますが、ローカル ライティング (フォン) を反射と屈折と組み合わせる方法がわかりません。私が計算するTraceRay関数があります:localLighting、reflectColor、およびrefractor。
この時点で、私の最終的な色は単にこれら 3 つの合計です。しかし、この方法では1を超える値が得られ、これを処理する方法がわかりません。
助けてくれてありがとう
これは、反射/屈折を処理する方法と、1 より大きい色の値を処理する方法という 2 つの別個の問題です。
2 番目の質問の方が簡単なので、最初に 2 番目の質問に取り組みます。これはエラーではなく、彩度または露出オーバーと呼ばれる効果です。フィルムカメラやデジタルカメラ、そしてあなたの目にも起こります. 問題は、光受容体 (目、デジタル カメラの CCD、またはフィルム カメラの感光性化合物の場合) に到達する光エネルギーが多すぎて、受容体が最大出力値まで飽和してしまうことです。言い換えれば、より多くのエネルギーを放出し続けることができますが、受容体はより強い信号を出力することができないため、同じように見えます. したがって、単純な解決策は、すべてのカラー値を 1.0 で単純に飽和させることです。これは、実際の光受容体で起こることを模倣します。
もちろん、これが目の中で起こると、瞳孔が収縮して光があまり入らなくなります。写真家が露出オーバーの写真を撮ると、同じ理由で絞りまたは露出時間を減らす可能性があります. 各ピクセルのカラー値を固定量で割るだけで、レンダラーで同じことができます。これは、瞳孔を収縮させたり、露光時間を制限して各受容体に到達する光エネルギーの量を減らすことに似ています。
反射と屈折について、私が知っている唯一の方法は、パス トレーシングを使用することです。PDFはこちらのリンクでは、大都市光輸送と呼ばれる種類の関連する最適化だけでなく、一般的な考え方についても説明します。基本的に必要なのは、再帰的なレイ キャスティングです。目からピクセルを介してシーンにキャストするだけでなく、交点 (つまり、通常はそのピクセルでレンダリングするポイント) からレイをキャストし続ける必要があります。複数の線分で構成される光路を作成するために、ランダムにシーンに出て、各線分がシーン内の 2 つの交点を接続するか、交点と目または光源を接続します。次に、各ポイントで反射する光源からのパスをトレースし、パスに入る (各色の) 光が各ポイントで次のセグメントに反射される量を計算します。モデルの BSDF を使用してこれを計算します。これは、Phong またはその他の反射モデルを使用して概算できます。最終結果は、パスに入った光が現在のピクセルに到達する量を示します。
ピクセルごとに、そのようなライト パスを多数構築し、それらすべてがそのピクセルのレンダリング値に寄与するようにする必要があります。これもまた、実際の光学系をモデル化したものです。シーンからの光は、すべての点でさまざまな方向に反射し、シーン内で見つけられる可能性のあるすべてのパスから目に入ってきます。パス トレーシングの考え方は、セット全体からの寄与を概算するために、考えられるすべてのライト パスのセットをサンプリングすることです。
ここで重要なのは、実際に必要なのはセット内のすべてのパスの合計であり、実際にすべてのパスをトレースする必要がないことです (理論的にはパスは無限にあります)。したがって、実行できる統計的なトリックがあります。構築する各パスのライト値を、その特定のパスを構築した確率で割ると、その商の期待値は、実際にはパス全体のライト値の合計になります。あなたが望むように、パスのセット。もちろん、これはあくまでも期待値なので、単一のパスでそれが得られる可能性はわずかですが、ランダムに多数のパスを選択して同じ計算を実行し、すべてのパスについてこの商の平均を取ると、収束するはずです。望ましい解決に向けて。
これが一般的な考え方です。私がリンクしたドキュメントでは、光の値と各パスの確率を計算する方法と、構築するパスを選択する方法に関するいくつかのアイデアについて詳しく説明しています。混乱を招く可能性があるのは、確率論的にパスを構築する方法に基づいて、各パスを選択する確率を定義するのはあなただということです。