1

私はウェブ上でレイトレーサーアルゴリズムをたくさん読んだことがあります。しかし、私は陰影と影について明確に理解していません。以下の擬似コードは私の理解に従って正しく書かれていますか?

for each primitive 
    check for intersection
    if there is one 
         do color be half of the background color
         Ishadow = true
         break

for each ambient light in environment        
    calculate light contribution to the color

if ( Ishadow == false ) 
   for each point light 
     calculate diffuse shading
     calculate reflection direction
     calculate specular light


trace for reflection ray // (i)  
add color returned from i after multiplied by some coefficient

trace for refraction ray // (ii)
add color returned from ii after multiplied by some coefficient

return color value calculated until this point
4

2 に答える 2

0

擬似コードの問題は、「擬似」を簡単に取得できるため、自然言語から離れることで回避しようとしているのと同じあいまいさの井戸になることです。「色は背景色の半分ですか?」光源を反復処理する前にこの線が表示されるという事実は混乱を招きます。光源を反復処理する前に、どのようにIshadowを設定できますか?

たぶん、より良い説明は次のようになります。

given a ray in space
    find nearest object with which ray intersects
    for each point light
        if normal at surface of intersected object points toward light (use dot product for this)
            cast a ray into space from the surface toward the light
                if ray intersection is closer than light* light is shadowed at this point

*影に奇妙なアーティファクトが見られる場合は、最初のレイトレーサーを作成するときにすべてのプログラマーが犯す間違いがあります。浮動小数点(または倍精度)の計算は不正確であり、シャドウトレースを実行するときに頻繁に(約半分の時間)再交差します。ダイアグラムなしで説明するのは少し難しいですが、私に何ができるか見てみましょう。

球の表面に交点がある場合、ほとんどの場合、浮動小数点レジスタでのその点の表現は数学的に正確ではありません。球の少し内側か少し外側のどちらかにあります。それが球の内側にあり、光源に対して交差テストを実行しようとすると、最も近い交差は球自体になります。交差距離は非常に小さいため、たとえば.000001ユニットよりも近いシャドウレイ交差を単純に拒否できます。ジオメトリがすべて凸状であり、それ自体を合法的にシャドウイングできない場合は、シャドウテストを実行するときに球のテストをスキップできます。

于 2012-10-29T17:31:57.533 に答える
0

影を通常のレイ トレーシング パスと統合する必要があります。すべてのスクリーン ピクセルに対して、シーンを通してレイを送信し、最終的に最も近いオブジェクトの交差を決定します。最も近いオブジェクトの交差のポイントで、最初に読み取りますピクセル カラー (その時点でのオブジェクトのテクスチャ)、反射ベクトルなどの計算 (法線ベクトルを使用) は別として、その交点からシーン内の各光源にレイを追加でキャストします。これらの光線が光源に当たる前に他のオブジェクトと交差する場合、交点は影になり、それに応じてその点の最終的な色を適応させることができます。

于 2012-10-29T17:27:43.803 に答える