3

更新:どの照明モデルを使用するかについての質問に答えましたが、反射光線と透過光線のフレネル項を計算する方法を知る必要があります。

部分的に実装された C++ レイ トレーサーがあります。現在、シャドウ レイを使用した Phong ライティングは問題なく動作します。単一の色とスカラーのアンビエント/ディフューズ/スカラー係数を持つエンティティを持たないようにしました。3 つの係数にはそれぞれ RGB コンポーネントがあるため、これらのようなマテリアルを実装できます。一方、ライトは単一の RGB カラーに加えて、スカラーの拡散反射光と鏡面反射光の強度を持ちます。また、単一の RGB アンビエント ライトもあります。

この時点で、すべての光を反射または透過する完全に誘電体のエンティティを実装することもできます。反射光と屈折光の比率は、フレネル方程式によって決定されます。ただし、反射色と屈折色をフォンの色と現実的に組み合わせるにはどうすればよいでしょうか? わずかに反射する色のプラスチック、光沢のある金、完全な鏡面またはガラスの球体、ステンド グラス、正面が透明で端が緑色のガラス板などを用意したいと考えています。RGB の反射率と透過率の係数を各エンティティに追加し、エンティティの設計者に環境 + 拡散 + 鏡面反射 + 反射率 + 透過率が適切な範囲内にあることを確認させることを計画していましたが、これは恣意的なようです。物理ベースの方法はありますか?

4

1 に答える 1

3

.mtl ファイルのドキュメントで、適切な照明モデルを自分で見つけました。

color = KaIa
+ Kd { SUM j=1..ls, (N*Lj)Ij }
+ Ks ({ SUM j=1..ls, ((H*Hj)^Ns)Ij Fr(Lj*Hj,Ks,Ns)Ij} + 
Fr(N*V,Ks,Ns)Ir})
+ (1.0 - Kx)Ft (N*V,(1.0-Ks),Ns)TfIt

これは密度が高く、実際にはいくつかのタイプミス (Kxや などFt) があるため、修正しました。

I = Ka * Ia
+ Kd * [sum for each light: (N . L) * Il]
+ Ks * [sum for each light: ((R . V) ^ Ps) * Fl * Il]
+ Ks * Fr * Ir
+ Kt * (1 - Ks) * Ft * It

I := surface point's color
V := ray direction
P := surface point
N := surface normal
L := light's position - P
R := L - 2 * (N . L) * P
Ka := surface material's ambient coefficient
Kd := surface material's diffuse coefficient
Ks := surface material's specular coefficient
Ps := surface material's shininess
Kt := surface material's transmission coefficient
Ia := ambient light color
Il := light's color
Ir := reflected ray's color
It := transmitted ray's color
Fl := light's Fresnel coefficient
Fr := reflected Fresnel coefficient
Ft := transmitted Fresnel coefficient

このモデルは、特にLighting 101を読んだ後では理にかなっています-- フォン鏡面反射は、光源を反射するためのパフォーマンス重視のハックであるため、鏡面ハイライトと反射光線に同じ係数を使用するのは自然なことです。

まだわからないことが一つあります。フレネル項に煩わされたくない場合はFl、 、Fr、およびFtを 1 に設定できます。ただし、さらに精度が必要な場合は、定義済みの変数を使用してそれらをどのように計算すればよいでしょうか?

于 2012-03-28T05:32:39.707 に答える