私はレイトレーサーに取り組んでおり、ライト、反射光、屈折光などのさまざまな色を追加すると、1を超える値が得られ、クランプする必要があります。しかし、クランプはおそらく正しくありませんか?多分私はこれを他の方法で処理する必要がありますか?
2 に答える
いいえ、いいえ、いいえ、クランプしないでください。現実の世界には、最大の光の強度や放射輝度の値はありません。正確にどのような物理的プロセスが光の値をクランプすることに対応すると思いますか?
クランプが機能するのは、最終的なピクセルを非HDR画像形式(8ビット整数ピクセルなど)に保存する場合、またはモニターに表示する場合のみです。そして、ハードクランプではなく、フィルムの応答をシミュレートするために、ある種のトーンマッピングまたはスムーズなロールオフを検討する必要があります。ただし、画像をHDR形式(つまり、16ビットまたは32ビットのfloat OpenEXRファイルなどの浮動小数点)で保存し、トーンマッピング(限られたダイナミックレンジへの縮小)を表示プログラムに任せることをお勧めします。
これはエラーではなく、彩度または露出オーバーと呼ばれる効果です。フィルムカメラやデジタルカメラ、そしてあなたの目にも起こります. 問題は、光受容体 (目、デジタル カメラの CCD、またはフィルム カメラの感光性化合物の場合) に到達する光エネルギーが多すぎて、受容体が最大出力値まで飽和してしまうことです。言い換えれば、より多くのエネルギーを放出し続けることができますが、受容体はより強い信号を出力することができないため、同じように見えます. したがって、単純な解決策は、すべてのカラー値を 1.0 で単純に飽和させることです。これは、実際の光受容体で起こることを模倣します。
もちろん、これが目の中で起こると、瞳孔が収縮して光があまり入らなくなります。写真家が露出オーバーの写真を撮ると、同じ理由で絞りまたは露出時間を減らす可能性があります. 各ピクセルのカラー値を固定量で割るだけで、レンダラーで同じことができます。これは、瞳孔を収縮させたり、露光時間を制限して各受容体に到達する光エネルギーの量を減らすことに似ています。これを行った後も、1 より大きいままの値 (または最大カラー値が何であれ) をクランプする必要があります。
もちろん、倍精度浮動小数点を使用して非常に大きな数値のカラー値を格納したり、BigInts を使用して任意の大きな数値を格納したりできます。しかし、遅かれ早かれ、実際にこの画像を「現実の世界」で作成する必要があります。つまり、プリンターやモニターを使用するか、PNG などの標準的な画像形式で保存する必要があります。どのメカニズムを使用しても、生成できる出力値の範囲は限られているため、色をその範囲に合わせる必要があります。これを行うには、私が説明したいずれかの手法を使用できます。使用可能な範囲外のものを単純にクランプするか、すべての値が範囲に収まるように固定量ですべての値をスケーリングできます。前者の場合、画像にクリッピングが発生します。つまり、光が非常に明るい場所ではディテールが失われます。後者の場合、カラー値がすでに接近している場合は、コントラストが失われます。これは、それらを縮小するとさらに接近するためです。一般に、2 つの異なる問題を制限するために、両方の手法を適用する必要があります。画像の統計を分析して、画像を調整する方法をアルゴリズムで決定することもできますが、それがどのようになるかはよくわかりません。別の方法は、試行錯誤を繰り返して手動で調整することです (おそらくレンダリングの品質が低いため、各試行にそれほど時間がかかりません)。画像の統計を分析して、画像を調整する方法をアルゴリズムで決定することもできますが、それがどのようになるかはよくわかりません。別の方法は、試行錯誤を繰り返して手動で調整することです (おそらくレンダリングの品質が低いため、各試行にそれほど時間がかかりません)。画像の統計を分析して、画像を調整する方法をアルゴリズムで決定することもできますが、それがどのようになるかはよくわかりません。別の方法は、試行錯誤を繰り返して手動で調整することです (おそらくレンダリングの品質が低いため、各試行にそれほど時間がかかりません)。