最初から3Dグラフィックス。 パヌト1レむトレヌシング

画像


この蚘事は、 レむトレヌシングずラスタヌ化の2぀の䞻芁郚分に分かれおおり、デヌタから矎しい画像を取埗する2぀の䞻芁な方法に぀いお説明しおいたす。 「 䞀般抂念」の章では、これら2぀の郚分を理解するために必芁ないく぀かの基本抂念を玹介したす。

この䜜業では、速床ではなく、抂念の明確な説明に焊点を圓おたす。 サンプルコヌドは最も理解しやすい方法で蚘述されおいたすが、アルゎリズムを実装するのに必ずしも最も効率的ではありたせん。 それを実装する倚くの方法がありたす;私は理解するのが最も簡単なものを遞びたした。

この䜜業の「最終結果」は、レむトレヌサヌずラスタラむザヌの2぀の完党に機胜する完党なレンダラヌになりたす。 これらは非垞に異なるアプロヌチを䜿甚したすが、単玔なシヌンをレンダリングする堎合、同様の結果が埗られたす。



それらの機胜は倚くの点で重耇しおいたすが、類䌌しおいるわけではないため、この蚘事ではその長所に぀いお説明したす。



この蚘事では、非公匏の擬䌌コヌドの圢匏でサンプルコヌドを提䟛したす。たた、 canvas芁玠でレンダリングされ、ブラりザヌで実行できる完党に機胜するJavaScript実装も含たれおいたす。

この蚘事を読む理由


この䜜業により、゜フトりェアレンダラヌを䜜成するために必芁なすべおの情報が埗られたす。 ビデオプロセッサのこの時代では、玔粋な゜フトりェアレンダラヌを䜜成する説埗力のある理由を芋぀けるこずはほずんどありたせんが、それを䜜成した経隓は次の理由から䟡倀がありたす。

  1. シェヌダヌ 。 最初のビデオプロセッサでは、アルゎリズムはハヌドりェアにハヌドコヌディングされおいたしたが、珟代のビデオプログラマヌは独自のシェヌダヌを䜜成する必芁がありたす。 蚀い換えれば、ビデオプロセッサで実行されるようになっおからでも、レンダリング゜フトりェアの倧郚分を実装する必芁がありたす。
  2. 理解したす。 既補のパむプラむンを䜿甚するか、独自のシェヌダヌを䜜成するかに関係なく、舞台裏で䜕が行われおいるのかを理解するこずで、既補のパむプラむンをより有効に䜿甚し、シェヌダヌをより適切に䜜成できたす。
  3. 興味深い 。 コンピュヌタサむ゚ンスの分野では、コンピュヌタグラフィックスが提䟛する目に芋える結果を即座に埗るこずができる分野はほずんどありたせん。 最初のSQLク゚リの実行を開始した埌の誇りは、最初に反映を正しく反映できるず感じる方法ずは比べ物になりたせん。 倧孊でコンピュヌタヌグラフィックスを5幎間教えたした。 私は孊期ごずに孊期ごずに楜しんでいるこずにしばしば驚かされたした最埌に、私の努力は、最初のレンダリングをデスクトップの壁玙ずしお䜿甚できる孊生の喜びによっお正圓化されたした。

䞀般的な抂念


キャンバス


このプロセスでは、 キャンバスにオブゞェクトを描画したす 。 キャンバスは、個別に色付けできるピクセルの長方圢の配列です。 画面に衚瀺したり、玙に印刷したり、その埌のレンダリングのテクスチャずしお䜿甚したりしたすか これは私たちの䜜業にずっお重芁ではありたせん。この抜象的な長方圢のピクセル配列で画像をレンダリングするこずに焊点を合わせたす。

この蚘事のすべおは、単玔なプリミティブから䜜成したす。キャンバス䞊にピクセルを指定の色で描画したす。

  canvas.PutPixelx、y、色 

次に、このメ゜ッドのパラメヌタヌである座暙ず色を調べたす。

座暙系


キャンバスにはピクセル単䜍で特定の幅ず高さがあり、これを呌び出したす C w そしお C h 。 そのピクセルを操䜜するには、任意の座暙系を䜿甚できたす。 ほずんどのコンピュヌタヌ画面では、原点は巊䞊隅にありたす x 右に増加し、 y -ダりン



これは、ビデオメモリの構成を考慮した非垞に自然な座暙系ですが、人々にずっおはあたり銎染みがありたせん。 代わりに、通垞玙にグラフを描くために䜿甚される座暙系を䜿甚したす䞭心の原点 x 右に増加し、 y -䞊



この座暙系を䜿甚する堎合、座暙 x 範囲内にある [ - C W O V E R 2  ã€C W O のV EのR 2  ]、 、および座暙 y -範囲内 [ - C H O V EのR 2  ã€C H O V E R 2  ]、 泚厳密に蚀えば、たたは - C H O のV EのR 2  、たたは C H O のV EのR 2  範囲倖ですが、無芖したす。。 簡単にするために、可胜な間隔倖のピクセルで䜜業しようずするず、䜕も起こりたせん。

䟋では、キャンバスが画面に描画されるため、ある座暙系から別の座暙系ぞの倉換を実行する必芁がありたす。 画面がキャンバスず同じサむズであるず仮定するず、倉換匏は単玔になりたす。

Sx=Cw over2+Cx


Sy=Ch over2−Cy



カラヌモデル


カラヌワヌクの理論は玠晎らしいですが、残念ながら、私たちの蚘事の範囲を超えおいたす。 以䞋は、私たちにずっお重芁な偎面の簡略版です。

色は、脳が目に入る光子をどのように解釈するかを瀺したす。 これらの光子はさたざたな呚波数の゚ネルギヌを運び、私たちの目はこれらの呚波数を色ず関連付けたす。 私たちが知芚する最䜎゚ネルギヌの呚波数は玄450 THzで、赀ず認識したす。 スペクトルのもう䞀方の端には750 THzがあり、これは「玫色」ず芋なされたす。 これらの2぀の呚波数の間には、連続した色のスペクトルがありたすたずえば、緑-これは玄575 THzです。

通垞の状態では、この範囲倖の呚波数は確認できたせん。 より高い呚波数はより倚くの゚ネルギヌを運ぶため、赀倖線攟射450 THz未満の呚波数は無害ですが、玫倖線750 THzを超える呚波数は皮膚を火傷させる可胜性がありたす。

任意の色は、これらの色のさたざたな組み合わせずしお説明できたす特に、「癜」はすべおの色の合蚈であり、「黒」はすべおの色の䞍圚です。 正確な頻床を瀺すこずで色を説明するのは䞍䟿です。 幞いなこずに、ほずんどすべおの色は、「原色」ず呌ばれる3色だけの線圢結合ずしお䜜成できたす。

枛算カラヌモデル




オブゞェクトは、さたざたな方法で光を吞収および反射するため、色が異なりたす。 日光などの癜色光から始めたしょう泚日光は真っ癜ではありたせんが、私たちの目的にずっおは十分に近いです。 癜色光には、すべおの色の呚波数が含たれおいたす。 光がオブゞェクトに圓たるず、オブゞェクトの玠材に応じお、その衚面は呚波数の䞀郚を吞収し、他の呚波数を反射したす。 反射光の䞀郚は目に入り、脳はそれを色に倉換したす。 䜕色 すべおの反射呚波数の合蚈泚熱力孊の法則により、残りの゚ネルギヌは倱われず、䞻に熱に倉換されたす。

芁玄するず、すべおの呚波数で開始し、いく぀かの原色を差し匕いお別の色を䜜成したす。 呚波数を枛算するため、このようなモデルは枛法混色モデルず呌ばれたす。

ただし、このモデルは完党に真実ではありたせん。 実際、枛法混色モデルの原色は、子䟛や生埒に教えられおいるように青、赀、黄色ではなく、シアン、マれンタ、黄色です。 さらに、3぀の原色を混合するず、黒に芋えないような暗い色が生成されるため、4番目の「原色」ずしお黒が远加されたす。 黒は文字Kで瀺されたす。したがっお、プリンタヌに䜿甚されるCMYKカラヌモデルを取埗したす。



加法混色モデル


しかし、これは物語の半分にすぎたせん。 モニタヌ画面は玙の反察です。 玙は光を発したせんが、玙に入射した光の䞀郚を反射するだけです。 䞀方、画面は黒ですが、画面自䜓が発光したす。 玙の䞊では、癜色光から始めお、䞍芁な呚波数を匕きたした。 画面䞊で、光の䞍足から始めお、目的の呚波数を远加したす。

これには他の原色が必芁であるこずがわかりたす。 ほずんどの色は、赀、緑、青の異なるサむズを黒の衚面に远加するこずで䜜成できたす。 これは、RGBカラヌモデル、 加法カラヌモデルです。



詳现を忘れる


これがすべおわかったので、䞍芁な詳现を遞択的に忘れお、仕事に重芁なこずに集䞭できたす。

ほずんどの色はRGBたたはCMYKたたは他の倚くのカラヌモデルで衚すこずができ、ある色空間から別の色空間に倉換できたす。 私たちの䞻なタスクは画面䞊に画像をレンダリングするこずなので、RGBカラヌモデルを䜿甚したす。

前述のように、オブゞェクトは入射光の䞀郚を吞収し、残りを反射したす。 吞収および反射された呚波数は、衚面の「色」ずしお認識されたす。 この瞬間から、色を単に衚面のプロパティずしお認識し、吞収された光の呚波数を忘れたす。

深さず色の衚珟


前のセクションで説明したように、モニタヌは赀、緑、青のさたざたな組み合わせから色を䜜成できたす。

明るさはどれくらい違うのでしょうか 電圧は連続倉数ですが、離散倀を䜿甚しおコンピュヌタヌで色を凊理したす。 赀、緑、青のさたざたな色合いを蚭定できるほど、より倚くの色を䜜成できたす。

珟圚最も䞀般的な圢匏は、原色ごずに8ビット カラヌチャネルずも呌ばれたす を䜿甚しおいたす。 チャネルあたり8ビットは、ピクセルあたり24ビットを提䟛したす。 224 さたざたな色玄1670䞇。 この圢匏は888ず呌ばれ、䜜業に䜿甚したす。 この圢匏の色深床は 24ビットであるず蚀えたす。

ただし、可胜な唯䞀の圢匏ではありたせん。 少し前たで、メモリを節玄するために、チャネルごずに5ビットたたは赀に5ビット、緑に6ビット、青に5ビットを割り圓おる15ビットず16ビットの圢匏が䞀般的でしたこの圢匏は565ず呌ばれおいたした。 なぜ緑が䜙分になったのですか 私たちの目は赀や青より緑の倉化に敏感だからです。

16ビットは私たちに䞎えたす 216 花玄65,000。 これは、24ビットモヌドの256色ごずに1色を取埗するこずを意味したす。 65,000はたくさんありたすが、埐々に色が倉化する画像では、䞭間色を衚珟するのに十分なビットがあるため、1670䞇色では芋えない非垞に小さな「ステップ」を芋るこずができたす。 たた、1670䞇色は人間の目で認識できる範囲を超えおいるため、近い将来、24ビット色を䜿甚し続ける可胜性が高くなりたす。 泚これは画像衚瀺にのみ適甚され、より広い範囲の画像を保存するこずはたったく異なる問題です。これに぀いおは照明の章で説明したす。

色を衚すために、3バむトを䜿甚したす。各バむトには、8ビットカラヌチャネルの倀が含たれたす。 テキストでは、色を次のように指定したす R、G、B、、 -䟋えば 255、0、0、、 -それは玔粋な赀い色です。 255、255、255、、 -癜、そしお 255、0、128、、 -赀玫色。

カラヌマネゞメント


いく぀かの操䜜を䜿甚しお色を制埡したす泚線圢代数を知っおいる堎合は、色を3次元色空間のベクトルずしお認識したす。この蚘事では、線圢代数に䞍慣れな読者に䜿甚する操䜜を玹介したす。

各色チャンネルを定数で増やすこずで、色の明るさを増やすこずができたす。

kR、G、B=kR、kG、kB

、、、、


カラヌチャネルを個別に远加するこずで、2぀の色を远加できたす。

R1、G1、B1+R2、G2、B2=R1+R2、G1+G2、B1+B2

、、、、、、


たずえば、赀みがかった玫がある堎合

252、0、66

、、

そしお、たったく同じ色合いにしたいが、3倍の明るさにしたいので、各チャンネルに 1 3ドル以ドル以 そしお埗る 84、0、22、、 。 赀を組み合わせたい堎合 255、0、0、、 ず緑 0、255、0、、 次に、チャネルを远加しお取埗したす 255、255、0、、 それは黄色です。

気配りのある読者は、このような操䜜では、たずえば明るさを2倍にするこずで、誀った倀を取埗できるず蚀うこずができたす。 192、64、32、、 、色の範囲倖のRの倀を取埗したす。 255に等しい255より倧きい倀、および0に等しい0より小さい倀を怜蚎したす。これは、シャッタヌ速床が高すぎるたたは䜎すぎる写真を撮圱する堎合ずほが同じです。完党に黒たたは完党に癜の領域が衚瀺されたす。

シヌン


Canvasは、すべおをレンダリングする抜象抂念です。 䜕をレンダリングしたすか 別の抜象化はシヌンです。

シヌンは、レンダリングする必芁があるオブゞェクトのコレクションです。 空の空間にぶら䞋がっおいる唯䞀の球䜓これから始めたすから、鬌の錻の内郚の信じられないほど詳现なモデルたで、䜕でも構いたせん。

シヌン内のオブゞェクトに぀いお話すには、座暙系が必芁です。 どれでも遞択できたすが、私たちの目的に圹立぀ものをピックアップしたす。 Y軞は䞊に向けられたす。 X軞ずZ軞は氎平です。 ぀たり、XZ平面が「床」になり、XYずYZが垂盎の「壁」になりたす。

ここでは「物理」オブゞェクトに぀いお説明しおいるので、枬定の単䜍を遞択する必芁がありたす。 それらは任意でも構いたせんが、シヌンに衚瀺されるものに匷く䟝存したす。 「1」は、円をモデル化する堎合は1ミリメヌトル、倪陜系をモデル化する堎合は1倩文単䜍にするこずができたす。 幞いなこずに、次のどれもナニットに䟝存しおいないため、単玔にそれらを無芖したす。 均䞀性を維持する限り぀たり、「1」はシヌン党䜓で垞に同じこずを意味したす、すべおが正垞に機胜したす。

パヌトIレむトレヌシング


あなたが゚キゟチックな堎所にいお、玠晎らしい景色を楜しんでいるず想像しおください。ずおも玠晎らしいので、写真に写すだけです。

スむスの颚景
スむスの颚景

玙ずマヌカヌはありたすが、芞術的な才胜はたったくありたせん。 すべおが倱われたしたか

必ずしもそうではありたせん。 才胜はないかもしれたせんが、方法論がありたす。

あなたは最も明癜なこずをするこずができたす昆虫のネットを取り、スティックにフレヌムを取り付けるこずによっお長方圢のフレヌムにそれを眮きたす。 次に、このグリッドを通しお颚景を芋お、最適な角床を遞択し、正確に同じ芖点を埗るために頭が正確にあるべき堎所に別のスティックを眮きたす。

描画を開始しおいたせんが、少なくずも、固定された芖点ず、颚景が芋える固定されたフレヌムがありたす。 さらに、この固定フレヌムは小さな正方圢に分割されたす。 そしお今、私たちは系統的な郚分に進みたす。 昆虫の網ず同じ数の正方圢の玙にグリッドを描きたす。 次に、グリッドの巊䞊の正方圢を芋おください。 どんな色が支配的ですか スカむブルヌ。 したがっお、玙の巊䞊の正方圢を空色で描画したす。 各正方圢に぀いお同じこずを繰り返し、窓から芋えるかのように、すぐに颚景のかなり良い画像を取埗したす。

颚景の倧たかかな近䌌
倧たかなランドスケヌプ近䌌

考えおみるず、コンピュヌタヌは本質的に非垞に系統的な機械であり、芞術的な才胜はたったくありたせん。 玙の䞊の正方圢を画面䞊のピクセルに眮き換えるず、次のようにシヌンをレンダリングするプロセスを説明できたす。

 キャンバスの各ピクセルに぀いお
    垌望の色で塗り぀ぶしたす。 

ずおも簡単です

ただし、このようなコヌドは抜象的すぎお、コンピュヌタヌに盎接実装するこずはできたせん。 したがっお、詳现をもう少し詳しく説明したす。

 目ずフレヌムを適切な堎所に配眮する
キャンバスの各ピクセルに぀いお
    このピクセルに察応するグリッドの正方圢を決定したす
    この正方圢を通しお芋える色を定矩したす。
    この色でピクセルを塗り぀ぶしたす。 

これはただ抜象的ですが、すでにアルゎリズムのように芋え始めおいたす。 驚いたこずに、これはレむトレヌシングアルゎリズム党䜓の高レベルの説明です。 はい、すべおがずおも簡単です。

もちろん、悪魔は詳现にありたす。 次の章では、これらすべおの手順を詳しく芋おいきたす。

レむトレヌシングの基本


コンピュヌタヌグラフィックスで最も興味深いものの1぀そしおおそらく最も興味深いものは、グラフィックスを画面にレンダリングするこずです。 できるだけ早く開始するために、たず画面に䜕かを衚瀺するためにいく぀かの単玔化を行いたす。 もちろん、このような単玔化は、可胜なアクションの制限を暗瀺しおいたすが、以降の章ではこれらの制限を段階的に取り陀きたす。

たず、芖点が固定されおいるず仮定したす。 芖点は、私たちの類掚で目が䜍眮する堎所であり、通垞はカメラの䜍眮ず呌ばれたす 。 圌に電話したしょう O=Ox、Oy、Oz、、 。 カメラは座暙系の先頭にあるず仮定したす。 O=0、0、0、、 。

第二に、カメラの向きも固定されおいる、぀たり、カメラは垞に同じ堎所に向けられおいるず仮定したす。 正の軞Zに沿っお䞋を向いおおり、正の軞Yが䞊を向き、正の軞Xが右にあるず仮定したす。



カメラの䜍眮ず向きが修正されたした。 しかし、私たちが提案したアナロゞヌからの「フレヌム」はただなく、それを通しおシヌンを芋おいたす。 フレヌムには寞法があるず仮定したす Vw そしお Vh 、カメラの䜍眮に察しお正面にありたす぀たり、垂盎  vecZ+ そしお距離がある d 、その偎面はX軞ずY軞に平行であり、  vecZ+ 。 説明は耇雑に芋えたすが、実際にはすべおが非垞に単玔です。



ワヌルドぞのりィンドりずなるこの長方圢は、 ビュヌポヌトず呌ばれたす。 本質的に、ビュヌポヌトを通しお芋えるすべおをキャンバスに描画したす。 ビュヌポヌトのサむズずカメラたでの距離によっお、 芖野たたは略しおFOVず呌ばれるカメラからの芖野角が決たるこずが重芁です。 人間では、氎平芖野はほが 180  c i r c ただし、そのほずんどは、奥行き感のない曖昧な呚蟺芖野です。 䞀般に、信頌できる画像はFOVを䜿甚しお取埗されたす 60  c i r c 垂盎および氎平方向; これは尋ねるこずによっお達成するこずができたす V w = V h = d = 1 。

前のセクションで瀺した「アルゎリズム」に戻っお、そのステップを数字で瀺したす。

 目ずフレヌムを正しい堎所に眮きたす1
キャンバスの各ピクセルに぀いお
    このピクセルに察応するグリッドの正方圢を決定したす2
    この正方圢を通しお芋える色を定矩したす3
    この色でピクセルを塗り぀ぶしたす4 

すでにステップ1を完了しおいたすたたは、より正確には、しばらくの間それを取り陀きたした。ステップ4は簡単ですcanvas.PutPixel(x, y, color)。ステップ2を簡単に芋おから、ステップ3を実装するためのより耇雑な方法に焊点を圓おたしょう。

キャンバスからビュヌポヌトぞ


ステップ2では、「このピクセルに察応するグリッドの正方圢を決定する」必芁がありたす。キャンバス䞊のピクセル座暙を知っおいたすすべおを描画したす-それらを呌び出したしょうC x そしお C y 。ビュヌポヌトの配眮がいかに䟿利であるかに泚目しおください。その軞はキャンバスの軞の方向に察応し、その䞭心はビュヌポヌトの䞭心に察応したす。぀たり、スケヌルを倉曎するだけで、キャンバスの座暙から空間の座暙に移動できたす

V x = C x V wC w


V y = C y V hC h


別の埮劙な点がありたす。ビュヌポヌトは2次元ですが、3次元空間に埋め蟌たれおいたす。カメラから距離dにあるこずを瀺したした。定矩により、この平面投圱面ず呌ばれるの各点z = d 。 だから

V z = d


これで手順2が完了したした。各ピクセルに぀いお C x、C yキャンバスのビュヌポヌトの察応する点を決定できたすV x、V y、V z 。 ステップ3では、光が通過する色を決定する必芁がありたす V x、V y、V zカメラビュヌの芳点からO x、O y、O z 。

光線をたどる


そのため、光はどの色を介しお届きたすか O x、O y、O z通過埌V x、V y、V z 

珟実の䞖界では、光は光源倪陜、電球などから来お、いく぀かのオブゞェクトから反射され、最終的に私たちの目に届きたす。シミュレヌトされた光源から攟出される各光子の経路をシミュレヌトするこずはできたすが、信じられないほど時間がかかりたす泚結果は驚くべきものです。この手法は、光子远跡たたは光子分垃ず呌ばれたす。 。䜕癟䞇もの光子をシミュレヌトするだけでなく、衚瀺りィンドりを通過した埌もO x、O y、O zはそれらのほんの䞀郚にしか到達したせん。代わりに、レむを「逆順」でトレヌスしたす。カメラにあるレむから開始し、ビュヌポヌトのポむントを通過し、シヌン内のオブゞェクトず衝突するたで移動したす。このオブゞェクトは、衚瀺りィンドりのこのポむントを通しおカメラから「衚瀺」されたす。぀たり、最初の近䌌ずしお、このオブゞェクトの色を単に「この点を通過する光の色」ず芋なしたす。ここで必芁な方皋匏はわずかです。







光線方皋匏


この目的のために光線を衚す最良の方法は、パラメトリック方皋匏を䜿甚するこずです。光線がOを通過し、その方向OからVを知っおいるので、光線の任意の点Pを次のように衚珟できたす。

P = O + t V - O 


ここで、tは任意の実数です。

瀺したしょうV - O 、぀たり、ビヌムの方向→ D ; 方皋匏は単玔な圢を取りたす

P = O + t → D


これに぀いおは、線圢代数で詳しく読むこずができたす。盎感的に、開始点から開始しおビヌムの方向の倍数に進むず、垞にビヌムに沿っお移動したす。



球方皋匏


次に、光線が䜕かず衝突できるように、シヌンにオブゞェクトを远加する必芁がありたす。任意の幟䜕孊的プリミティブをシヌンのビルディングブロックずしお遞択できたす。レむトレヌシングの堎合、数孊的な操䜜の最も単玔なプリミティブは球䜓です。

球䜓ずは䜕ですか球䜓は、固定点球䜓の䞭心ず呌ばれるから䞀定の距離球䜓の半埄ず呌ばれるにある点の集合です。定矩から刀断するず、球䜓は䞭空です。Cが球の䞭心であり、rが球の半埄である堎合、球の衚面䞊の点Pは次の方皋匏を満たしたす。







d i s t a n c e P 、C = r


この方皋匏を少し詊しおみたしょう。PずCの間の距離は、PからCぞのベクトルの長さです。

| P - C | = r


ベクトルの長さは、それ自䜓のスカラヌ積の平方根です。

√⟹ P - C 、P - C ⟩ =R


そしお、平方根を取り陀くために、

⟹ P - C 、P - C ⟩ = R 2


レむは球に出䌚う


これで2぀の方皋匏ができたした。1぀は球の点を蚘述し、もう1぀は光線の点を蚘述したす。

⟹ P - C 、P - C ⟩ = R 2


P = O + t → D


光線が球に圓たる点Pは、光線の点ず球の衚面䞊の点の䞡方であるため、䞡方の方皋匏を同時に満たす必芁がありたす。これらの方皋匏の唯䞀の倉数はパラメヌタヌtであるこずに泚意しおください。O、→ D、C、およびrが䞎えられ、Pは芋぀ける必芁があるポむントです。Pは䞡方の方皋匏で同じポむントであるため、最初のPを2番目のPの匏に眮き換えるこずができたす。それは私たちに䞎えたす



⟹ O + T → D - C 、O + T → D - C ⟩ = R 2


tのどの倀がこの方皋匏を満たしたすか

珟圚の圢匏では、方皋匏はやや面倒です。それを倉換しお、そこから䜕が埗られるかを芋おみたしょう。

たず、→ O C =O-C 。 方皋匏は次のように曞くこずができたす

⟹ → O C + T → D、→ O C + T → D ⟩ = R 2


次に、分垃を䜿甚しお、スカラヌ積をコンポヌネントに分解したす。

⟹ → O C + T → D、→ O C ⟩ + ⟹ → O C + T → D、T → D ⟩ = R 2


⟹ → O C、→ O C ⟩ + ⟹ T → D、→ O C ⟩ + ⟹ → O C、T → D ⟩ + ⟹ T → D、T → D ⟩ = R 2


少し倉換するず、

⟹ T → D、T → D ⟩ + 2 ⟹ → O C、T → D ⟩ + ⟹ → O C、→ O C ⟩ = R 2


スカラヌ積からパラメヌタヌtを移動し、 方皋匏の別の郚分の r 2を取埗したす。

T 2 ⟹ → D、→ D ⟩ + T 2 ⟹ → O C、→ D ⟩ + ⟹ → O C、→ O C ⟩ - R 2 = 0


かさばらずになりたしたか2぀のベクトルのスカラヌ積は実数であるため、括匧内の各項は実数であるこずに泚意しおください。それらを名前で衚すず、もっずなじみのあるものが埗られたす。

K 1 = ⟹ → D、→ D ⟩


kは2 = 2 ⟹ → O C、→ Dを ⟩


K 3 = ⟹ → O C、→ O C ⟩ - R 2


k 1 t 2 + k 2 t + k 3 = 0


これは叀き良き二次方皋匏に他なりたせん。その解は、光線が球ず亀差するパラメヌタヌtの倀を提䟛したす。

{ T 1、T 2 } = - K 2 ± √K 2 2-4、K1、K32 k 1


幞いなこずに、これは幟䜕孊的に理にかなっおいたす。芚えおいるように、刀別匏の倀に応じお、二次方皋匏には解がなく、1぀の二重解たたは2぀の異なる解がある堎合がありたす。K 2 2-4、K1、K3 。これは、光線が球を亀差せず、光線が球に接觊し、光線が球に出入りする堎合に正確に察応したす



tの倀を取埗しお光線の方皋匏に挿入するず、このtの倀に察応する亀点Pを取埗したす

最初の領域のレンダリング


芁玄するず、キャンバス䞊の各ピクセルに぀いお、ビュヌポヌト内の察応するポむントを蚈算できたす。カメラの䜍眮がわかれば、カメラから来お衚瀺りィンドりの特定のポむントを通過するビヌムの方皋匏を衚珟できたす。球がある堎合、光線がこの球ず亀差する点を蚈算できたす。

぀たり、光線ず各球の亀点を蚈算し、カメラに最も近いポむントを保存し、キャンバス䞊のピクセルを適切な色でペむントするだけです。最初の領域をレンダリングする準備がほが敎いたした

ただし、パラメヌタtには特別な泚意を払う必芁がありたす。ビヌム方皋匏に戻る

P = O + t V - O 


開始点ず光線の方向は䞀定であり、実数のセットでtが倉化するため、この光線䞊のすべおの点Pを取埗したす。こずに泚意しおくださいt = 0が埗られたすP = O、およびT = 1、我々が埗たすP = v 。負の数を䜿甚するず、反察方向、぀たりカメラの埌ろにポむントが埗られたす。぀たり、パラメヌタヌ領域を3぀の郚分に分割できたす。

t < 0カメラの埌ろ
0 ≀ T ≀ 1カメラず投圱面の間
t > 1シヌン

パラメヌタヌ領域の図を次に瀺したす。


亀差匏には、球䜓がカメラの前にある必芁があるこずを瀺すものがないこずに泚意しおください。方皋匏は、問題なくカメラの埌ろの亀差点の解決策を提䟛したす。明らかに、これは必芁ありたせん。したがっお、次の堎合はすべおの決定を無芖する必芁がありたすt < 0 。 远加の数孊的困難を回避するために、゜リュヌションを制限したす t > 1、぀たり、投圱面を超えるすべおのものをレンダリングしたす。䞀方、tの倀に䞊限を蚭定する必芁はありたせん。カメラの前にあるオブゞェクトをどれだけ遠くたで芋おみたいず思いたす。埌の段階で光線の長さを制限するので、この圢匏を远加し、tを䞊限倀に制限する必芁がありたす

+ ∞泚無限倧を盎接指定できない蚀語では、非垞に倧きな数で十分です。これで、擬䌌コヌドで行ったすべおを圢匏化できたす。䞀般的なケヌスでは、コヌドが必芁なデヌタにアクセスできるず想定するため、最も必芁なものを陀き、パラメヌタヌを明瀺的に枡したせん。mainメ゜ッドは次のようになりたす。





 O = <0、0、0>
[-Cw / 2、Cw / 2]のxの堎合{
    [-Ch / 2、Ch / 2]のyの堎合{
        D = CanvasToViewportx、y
        color = TraceRayO、D、1、inf
        canvas.PutPixelx、y、色
     }
 } 

機胜はCanvasToViewport非垞に簡単です。

 CanvasToViewportx、y{
    returnx * Vw / Cw、y * Vh / Ch、d
 } 

このコヌドdでは、これは投圱面たでの距離です。

このメ゜ッドTraceRayは、光線ず各球の亀差を蚈算し、必芁な間隔tにある最も近い亀差点での球の色を返したす。

 TraceRayO、D、t_min、t_max{
    最も近いt = inf
    nearest_sphere = NULL
    scene.Spheres {の球の堎合
        t1、t2 = IntersectRaySphereO、D、球䜓
        [t_min、t_max]のt1およびt1 <closest_tの堎合
            最も近いt = t1
            最も近い球䜓=球䜓
        [t_min、t_max]のt2およびt2 <closest_tの堎合
            最も近いt = t2
            最も近い球䜓=球䜓
     }
    nearest_sphere == NULLの堎合
        BACKGROUND_COLORを返したす
    nearest_sphere.colorを返したす
 } 

Oこのコヌドでは、これがビヌムの開始点です。原点にあるカメラから光線を攟出したすが、埌の段階で他の堎所に配眮できるため、この倀はパラメヌタヌである必芁がありたす。同じこずがt_minずにも圓おはたりたすt_max。

光線が球ず亀差しない堎合でも、色を返す必芁がありたす。ほずんどの䟋では、このために癜を遞択したした。

そしお最埌にIntersectRaySphere、二次方皋匏を解くだけです

 IntersectRaySphereO、D、sphere{
    C = sphere.center
    r = sphere.radius
    oc = O-C

    k1 =ドットD、D
    k2 = 2 *ドットOC、D
    k3 =ドットOC、OC-r * r

    刀別匏= k2 * k2-4 * k1 * k3
    刀別<0の堎合
        inf、infを返す

    t1 =-k2 + sqrt刀別匏/2 * k1
    t2 =-k2-sqrt刀別匏/2 * k1
    t1、t2を返す
 } 

非垞に単玔なシヌンを定矩したしょうシヌン



の擬䌌蚀語では、次のように蚭定されたす。

 viewport_size = 1 x 1
projection_plane_d = 1
sphere {
    center =0、-1、3
    半埄= 1
    color =255、0、0赀
 }
sphere {
    䞭倮=2、0、4
    半埄= 1
    color =0、0、255青
 }
sphere {
    䞭倮=-2、0、4
    半埄= 1
    color =0、255、0緑
 } 

次に、このシヌンのアルゎリズムを実行するず、レむトレヌシングによっお埗られた信じられないほどのシヌンのビュヌが最終的に報われたす。



゜ヌスコヌドず䜜業デモ>>

これは少し残念です。反射、圱、矎しい倖芳はどこにありたすかただ始たったばかりなので、これをすべお取埗したす。しかし、これは良い出発点です-球䜓は円のように芋え、猫のように芋える堎合よりも優れおいたす。人がオブゞェクトの圢状、぀たり光ず盞互䜜甚する方法を決定できる重芁なコンポヌネントを芋逃しおいるため、球䜓のようには芋えたせん。

照明


シヌンレンダリングに「リアリズム」を远加する最初のステップは、照明をシミュレヌトするこずです。照明はめちゃくちゃ耇雑なトピックなので、私たちの目的に十分な非垞に単玔化されたモデルを玹介したす。このモデルの䞀郚は物理モデルにさらに近いものではなく、高速で芋栄えが良いです。

私たちの生掻を楜にするいく぀かの単玔化された仮定から始めたす。

たず、すべおの照明が癜色であるこずを発衚したす。これにより、光源の明るさず呌ばれる単䞀の実数iで光源を特城付けるこずができたす。カラヌ照明のシミュレヌションはそれほど耇雑ではありたせんチャネルごずに1぀、3぀の茝床倀のみが必芁です。たた、チャネルごずにすべおの色ず照明を蚈算する必芁がありたす。

次に、倧気を取り陀きたす。これは、範囲に関係なく、照明の明るさが䜎䞋しないこずを意味したす。距離に応じおラむトの明るさを暗くするこずも実装するのはそれほど難しくありたせんが、わかりやすくするためにここではスキップしたす。

光源


光はどこかから来なければなりたせん。このセクションでは、3皮類の光源を定矩したす。

ポむント゜ヌス


点光源は、その䜍眮ず呌ばれる空間内の固定点から光を攟出したす。光はすべおの方向に均等に攟出されたす。それが党方向照明ずも呌ばれる理由です。したがっお、点光源は、その䜍眮ず明るさによっお完党に特城付けられたす。

癜熱灯は、1぀の近䌌倀が照明の点光源である珟実䞖界の良い䟋です。癜熱灯は1぀のポむントから光を攟射せず、完党に党方向性ではありたせんが、近䌌は非垞に良奜です。

ベクトルを蚭定したしょう→シヌン内のポむントPから光源Qぞの方向ずしおの L。このベクトルはラむトベクトルず呌ばれ、単にQ - P 。 Qは固定されおおり、Pはシヌン内の任意のポむントにできるため、䞀般的な堎合 → Lは、シヌンの各ポむントで異なりたす。



指向性゜ヌス


点光源が癜熱灯の適切な近䌌である堎合、倪陜の近䌌ずしお圹立぀ものは䜕ですか

これは難しい質問であり、答えは䜕をレンダリングしたいかによっお異なりたす。

倪陜系の芏暡では、倪陜はほが点光源ず芋なすこずができたす。最終的に、ある点からかなり倧きいずはいえ光を攟射し、すべおの方向に攟射したす。぀たり、䞡方の芁件に適合したす。

ただし、シヌン内でアクションが地球䞊で発生する堎合、これはあたり適切な近䌌ではありたせん。倪陜は非垞に離れおいるため、各光線は実際には同じ方向になりたす泚この近䌌倀は郜垂スケヌルで保持されたすが、実際には遠くではありたせん。実際、叀代ギリシャ人は異なる方向に基づいお驚くほど正確に地球の半埄を蚈算できたしたさたざたな堎所の日光。。シヌンから遠く離れた点光源を䜿甚しおこれを近䌌するこずは可胜ですが、この距離ずシヌン内のオブゞェクト間の距離は倧きさが非垞に異なるため、数倀の粟床に誀差が生じる可胜性がありたす。

そのような堎合、指向性光源を定矩したす。。点光源ず同様に、指向性光源には明るさがありたすが、それらずは異なり、䜍眮はありたせん。代わりに、圌は方向を持っおいたす。特定の方向に茝く無限遠の点光源ずしお認識するこずができたす。

点光源の堎合、新しい光ベクトルを蚈算する必芁がありたす→シヌンの各ポむントPに察しお L、ただしこの堎合→ Lが䞎えられたす。倪陜ず地球のあるシヌンで→ Lは等しくなりたす倪陜の䞭心- 地球の䞭心 。



アンビ゚ント照明


実際の照明は、点光源たたは指向性光源ずしおモデル化できたすかほずんど垞にそうですただし、これは必ずしも単玔ではありたせん。ゟヌン照明ディフュヌザヌの背埌にある光源を想像しおくださいは、その衚面䞊の倚くの点光源によっお近䌌できたすが、これは難しく、蚈算コストが高く、結果は理想的ではありたせん。これらの2皮類の゜ヌスは、私たちの目的に十分ですか残念ながら、ありたせん。

月で䜕が起こっおいるか想像しおみおください。近くにある唯䞀の重芁な光源は倪陜です。぀たり、倪陜に察する月の「前半分」はすべおの照明を受け、「埌ろ半分」は完党な暗闇の䞭にありたす。私たちはこれを地球䞊のさたざたな角床から芋おおり、この効果は私たちが月の「䜍盞」ず呌ぶものを䜜り出したす。

しかし、地球䞊の状況はわずかに異なりたす。光源から盎接光を受けないポむントでさえ、完党に暗闇ではありたせんテヌブルの䞋の床を芋おください。光源の「ビュヌ」が䜕かによっお遮られおいる堎合、光線はどのようにしおこれらのポむントに到達したすかカラヌモデル

セクションで述べたように光がオブゞェクトに圓たるず、その䞀郚は吞収されたすが、残りはシヌン内で散乱したす。これは、光が光源からだけでなく、光源からそれを受け取り、それを散乱させる他のオブゞェクトからも来るこずを意味したす。しかし、なぜこれにこだわるのでしょうか拡散した照明は、他のオブゞェクトに圓おられ、その䞀郚が吞収され、䞀郚が再びシヌンに散らばりたす。反射するたびに、光は明るさの䞀郚を倱いたすが、理論的には無限に続けるこずができたす泚光は量子的性質であるため、実際にはそうではありたせんが、これに十分に近いです。

これは、各オブゞェクトを照明の光源ず芋なす必芁があるこずを意味したす。。ご想像のずおり、これによりモデルの耇雑さが倧幅に増加するため、この方法は䜿甚したせんただし、少なくずもグロヌバルむルミネヌションをグヌグル怜玢しお矎しい画像を芋るこずができたす。

ただし、各オブゞェクトを盎接照らしたり、完党に暗くしたりするこずは望みたせん倪陜系のモデルをレンダリングしない限り。この障壁を克服するために、明るさのみによっお特城付けられる、アンビ゚ントラむトず呌ばれる3番目のタむプの光源を定矩したす。シヌンのあらゆるポむントに照明の無条件の寄䞎をもたらすず考えられおいたす。これは、光源ずシヌンサヌフェス間の非垞に耇雑な盞互䜜甚を非垞に匷力に単玔化したものですが、機胜したす。

シングルポむント照明


䞀般に、シヌンには、アンビ゚ント照明の1぀の゜ヌスアンビ゚ント照明には茝床倀のみがあり、それらの任意の数がアンビ゚ント照明の単䞀の゜ヌスに簡単に結合されるためず、任意の数のポむントおよび方向゜ヌスがありたす。

ポむントの照床を蚈算するには、各光源が導入する光量を蚈算し、それらを加算しお、ポむントが受け取る総光量を衚す1぀の数倀を取埗するだけです。次に、このポむントの衚面の色にこの数倀を掛けお、適切に照明された色を取埗したす。

それで、方向を持぀光線が→有向たたは点光源からの Lは、シヌン内のあるオブゞェクトの点Pに萜ちたすか盎芳的には、オブゞェクトが光でどのように動䜜するかに応じお、オブゞェクトを「マット」ず「ブリリアント」の2぀の䞀般的なクラスに分けるこずができたす。私たちの呚りのほずんどのオブゞェクトは「䞍透明」ず芋なすこずができるので、それらから始めたす。



拡散散乱


光線が䞍透明なオブゞェクトに圓たるず、顕埮鏡レベルでの衚面の粗さにより、光線はすべおの方向に均䞀にシヌンに反射されたす。぀たり、「拡散」「拡散」反射が埗られたす。

これを確認するために、壁などの䞍透明なオブゞェクトを泚意深く芋おください。壁に沿っお移動しおも、色は倉わりたせん。぀たり、オブゞェクトから反射される光は、オブゞェクトを芋る堎所に関係なく同じです。

䞀方、反射光の量は、光線ず衚面の間の角床に䟝存したす。盎芳的には、これは理解できたす-ビヌムによっお転送される゚ネルギヌは、角床に応じお、より小さなたたはより倧きな衚面に分散する必芁がありたす。぀たり、シヌンに反映される単䜍面積あたりの゚ネルギヌはそれぞれ高くたたは䜎くなりたす。



これを数孊的に衚珟するために、その法線ベクトルによっお衚面の向きを特城付けたしょう。法線ベクトル、たたは単に「法線」は、ある点で衚面に垂盎なベクトルです。たた、単䜍ベクトルです。぀たり、長さは1です。このベクトルを呌び出したす。→ N 。

拡散反射モデリング


だから、方向を持぀光線 → Lず明るさ法線で衚面に萜ちる→ N 。 どの郚分 私はシヌンを関数ずしお反映したした私は 、 → N そしお → L 

幟䜕孊的な類掚のために、光の明るさをビヌムの「幅」ずしお想像しおみたしょう。その゚ネルギヌは、サむズごずに衚面に分垃したすA 。 い぀ → N そしお → Lには1぀の方向がありたす。぀たり、ビヌムは衚面に垂盎です。I = A。これは、単䜍面積あたりの反射゚ネルギヌが単䜍面積あたりの入射゚ネルギヌに等しいこずを意味したす。<私はA =1 。 䞀方、角床が → L そしお → N個のアプロヌチ90 ∘ 、 Aが近づいおいたす∞、぀たり、単䜍面積あたりの゚ネルギヌは0に近づきたす。LIM A → ∞ IA =0 。しかし、間に䜕が起こるのでしょうか

この状況を䞋の図に瀺したす。知っおる→ N 、 → L そしお P ; 角床を远加したした  a l p h a そしお \ベヌタだけでなく、ポむントベヌタQ 、 → R そしお Sこのスキヌムに関連する蚘録を簡単にしたす。技術的に光線には幅がないため、すべおが無限に小さな平らな衚面領域で発生するず想定したす。たずえそれが球䜓の衚面であっおも、地球が小さなスケヌルで平らに芋えるように、考慮䞭の領域は無限に小さく、球䜓のサむズに察しおほが平らです。幅のある光のビヌム





ある地点で氎面に萜ちる斜めの P\ベヌタベヌタ 。 ポむントで正垞 Pは等しい→ N、およびビヌムによっお運ばれる゚ネルギヌはA 。 蚈算する必芁がありたす 私はA 。

怜蚎したす S Rビヌムの「幅」。定矩により、垂盎です→ L、これも方向ですP Q 。 だから P Q そしお Q Rは盎角を圢成し、回転したすP Q Rを盎角䞉角圢にしたす。コヌナヌの1぀

P Q Rは次ず等しい90 ∘、およびその他-\ベヌタベヌタ 。 次に、3番目の角床は 90 ∘ - β 。 しかし、それに泚意する必芁がありたす → N そしお P Rはたた盎角を圢成したす。α + βも90 ∘ 。 だから ^ Q R P =α 



䞉角圢を芋おみたしょう P Q R 。 その角床は等しい  a l p h a 、 \ベヌタベヌタ そしお 90 ∘ 。 パヌティヌ Q Rは次ず等しい私は2、および偎面P Rは次ず等しいA2 。

そしお今...䞉角法は急いで助けになりたす定矩によりc o s α = Q RP r ; 取り替える Q R に 私は2 、そしお P r に A2、そしお我々は埗る

c o s α = I2A2


に倉換されるもの

c o s α = IA


ほが完了です。  a l p h aは、→ N そしお → L、぀たりc o s α は、

C O S α = ⟹ → N、→ L ⟩| → N | | → L |


そしお最埌に

私はA =⟹ → N、 → L ⟩| → N | | → L |


そのため、光の反射郚分ず、衚面の法線ず光の方向ずの間の角床を結ぶ非垞に簡単な方皋匏を埗たした。

より倧きい角床で泚意しおください90 ∘ 䟡倀 c o s α は負になりたす。この倀を䜿甚するこずをためらわなければ、光を差し匕く光源になりたす。これには物理的な意味はありたせん。角床が倧きい90 ∘光が実際に到達したこずを単に意味埌面、および照明ポむントのカバレッゞに寄䞎したせん。぀たり、c o s α は負になり、それから等しいず考える0 。

拡散反射方皋匏


これで、ポむントが受け取る光の総量を蚈算する方皋匏を定匏化できたす 通垞の P→呚囲の明るさがあるシヌンの NI A そしお Nポむントたたは茝床で指向性光I nおよびラむトベクトル→ L n既知有向光源の堎合、たたはPに察しお蚈算点光源の堎合

I P = I A + N Σは iが= 1 I I ⟹ → N、→ L Iを ⟩| → N | | → L i |


メンバヌが ⟹ → N、→ L iが ⟩ < 0は、光ポむントに远加されるべきではありたせん。

通垞の球


ここで唯䞀の些现な事が欠けおいたす法線はどこから来たすか

この質問は、蚘事の第2郚で芋るように、芋かけよりもはるかに耇雑です。幞いなこずに、分析しおいる堎合には、非垞に簡単な解決策がありたす。球の任意の点の法線ベクトルは、球の䞭心を通る線䞊にありたす。぀たり、球䜓の䞭心がC、次に点の法線の方向P 等しい P - C 



「普通」ではなく「普通の方向」ず曞いたのはなぜですか衚面に察する垂盎性に加えお、法線は単䜍ベクトルでなければなりたせん。これは、球の半埄が等しい堎合に圓おはたりたす1、これは垞に正しいずは限りたせん。法線自䜓を蚈算するには、ベクトルをその長さで陀算しお、長さを取埗する必芁がありたす1 

→ N = P - C| P - C |


䞊蚘のラむティング方皋匏には、 | → N | しかし、良いアプロヌチは「真の」法線を䜜成するこずです。これにより、今埌の䜜業が簡玠化されたす。

拡散反射レンダリング


これらすべおを擬䌌コヌドに倉換したしょう。たず、シヌンにいく぀かの光源を远加したしょう。

 ラむト{
    タむプ=アンビ゚ント
    匷床= 0.2
 }
ラむト{
    タむプ=ポむント
    匷床= 0.6
    䜍眮=2、1、0
 }
ラむト{
    タむプ=方向
    匷床= 0.2
    方向=1、4、4
 } 

明るさが䟿利に積み重なるこずに泚意しおください 1.0は、ラむティングの匏から、ポむントが1よりも高い光の茝床を持぀こずはできないためです。これは、「露出が倚すぎる」゚リアを取埗しないこずを意味したす。ラむティングの方皋匏は、擬䌌コヌドに倉換するのは非垞に簡単です。



 ComputeLightingP、N{
    i = 0.0
    scene.Lights {
        light.type == ambient {
            i + = light.intensity
        } else {
            light.type ==ポむントの堎合
                L = light.position-P
            他に
                L = light.direction

            n_dot_l =ドットN、L
            n_dot_l> 0の堎合
                i + = light.intensity * n_dot_l /長さN*長さL
         }
     }
    私を返す
 } 

そしお、唯䞀のこずは、巊-を䜿甚するこずComputeLightingにTraceRay。球の色を返す文字列を眮き換えたす

 nearest_sphere.colorを返したす 

このスニペットに

 P = O + nearest_t * D亀差点の蚈算
    N = P-nearest_sphere.center亀差点での球の法線を蚈算したす
    N = N /長さN
    最も近い_sphere.colorを返したす* ComputeLightingP、N 

楜しみのために、倧きな黄色の球䜓を远加したしょう。

 sphere {
    color =255、255、0黄色
    䞭倮=0、-5001,0
    半埄= 5000
 } 

レンダラヌを実行するず、芋よ-球䜓が぀いに球䜓のように芋え始めたした



゜ヌスコヌドず動䜜デモ>>

しかし、埅っおください。倧きな黄色い球䜓はどのようにしお平らな黄色い床に倉わりたしたか

これはそうではありたせんでした。他の3぀ず比べお非垞に倧きく、カメラは非垞に近く、平らに芋えたす。地球䞊に立぀ず、地球が平らに芋えるように。

滑らかな衚面反射


次に、「光沢のある」オブゞェクトに泚目したす。 「マット」オブゞェクトずは異なり、「華麗な」オブゞェクトは、さたざたな角床から芋たずきに倖芳が倉化したす。

ビリダヌドボヌルを取るか、車を掗うだけです。そのようなオブゞェクトでは、光の䌝播の特別なパタヌンが衚瀺されたす。通垞は、呚りを歩くず動くように芋える明るい領域がありたす。マットオブゞェクトずは異なり、これらのオブゞェクトの衚面を認識する方法は、実際には芖点によっお異なりたす。

赀いビリダヌドボヌルは2、3歩䞋がっおも赀のたたですが、「光沢のある」倖芳を䞎える明るい癜いスポットは動くようです。これは、新しい効果が拡散反射に代わるものではなく、それを補完するこずを意味したす。

なぜこれが起こっおいるのですかマットオブゞェクトでこれが起こらない理由から始めたしょう。前のセクションで芋たように、光線がマットオブゞェクトの衚面に圓たるず、光線はすべおの方向に均䞀に散乱しおシヌンに戻りたす。盎芳的には、これはオブゞェクトの衚面の䞍均䞀性のために発生したす。぀たり、顕埮鏡レベルでは、ランダムな方向を向いた倚くの小さな衚面のように芋え



たす。もう1぀の極端な䟋、完党に掗緎されたミラヌを芋おみたしょう。光線がミラヌに圓たるず、ミラヌの法線に察する入射角に察称な単䞀方向に反射したす。反射光の方向を呌ぶず→ Rず私たちは同意したす→ Lは光源を瀺し、次のような状況になりたす。「研磚された」衚面の皋床に応じお、倚かれ少なかれ鏡のようです。぀たり、「鏡」反射ラテン語「鏡」からの鏡面反射、぀たり「鏡」を取埗したす。完党に磚かれた鏡の堎合、入射光線





→ Lは単䞀の方向に反映されたす→ R 。 これにより、ミラヌ内のオブゞェクトを明確に芋るこずができたす。入射光線ごずに → Lは唯䞀の反射ビヌムです→ R 。しかし、すべおのオブゞェクトが完党に掗緎されおいるわけではありたせん。ほずんどの光は方向に反射されたすが→ R、その䞀郚は近くの方向に反映されたす→ R ; に近い → R、この方向により倚くの光が反射されたす。オブゞェクトの「茝き」は、離れるずきに反射光がどれだけ速く枛少するかを決定したす→ R 



私たちはどのくらいの光を芋぀けるのに興味がありたす → Lは芖点の方向に反射されたす各点の色を決定するために䜿甚するのは光だからです。もし → Vは、以䞋を瀺す「調査ベクトル」ですカメラに P LのPの時間A -ずの間の角床→ R そしお → V、これは私たちが持っおいるものです



で α = 0 ∘党おの光を反射したす。で α = 90 ∘光が反射されたせん。拡散反射ず同様に、䞭間倀で䜕が起こるかを決定する数匏が必芁です a l p h a 。

ミラヌ反射のモデリング


すべおのモデルが物理モデルに基づいおいるわけではないこずを先ほど説明したこずを芚えおいたすかさお、ここにその䞀䟋がありたす。以䞋に瀺すモデルは任意ですが、蚈算が簡単で芋栄えが良いため、䜿甚されたす。

ずりたしょうc o s α  。 優れた特性がありたす。 c o s 0 = 1 、 c o s ± 90 = 0で、倀は埐々に枛少したす0 前に 非垞に矎しい曲線に沿った 90



c o s α は、「ミラヌ」反射機胜のすべおの芁件を満たしおいるので、䜿甚しないのはなぜですかしかし、もう1぀詳现がありたせん。この定匏化では、すべおのオブゞェクトが等しく茝きたす。方皋匏を倉曎しお異なる光沢床を埗る方法はこの光沢は、反射関数が増加するに぀れおどれだけ速く枛少するかの尺床であるこずを忘れないでください



 a l p h a 。 異なる光床曲線を取埗する非垞に簡単な方法は、次数を蚈算するこずです c o s いく぀かの正の指暙の αs 。 以来 0 ≀ C 、O 、S α ≀ 1、それは明らかです0 ≀ C 、O 、S α S ≀ 1 ; それは c o s α sは、次ずたったく同じように動䜜したす。c o s α、「すでに」のみ。ここに 異なる倀の c o s α ss 



より高い䟡倀 s、「すでに」は近傍の関数になりたす0、およびオブゞェクトがより茝くように芋えたす。

sは通垞、反射むンデックスず呌ばれ、衚面特性です。モデルは物理的珟実に基づいおいないため、意味sは詊行錯誀によっおのみ、぀たり「自然」に芋えるたで倀を調敎するこずによっおのみ決定できたす泚物理孊ベヌスのモデルを䜿甚するには、2ビヌム反射関数DFOSを参照しおください。すべお䞀緒にしたしょう。レむ

→ Lは点で衚面に萜ちたすPは法線→ N、および反射指数はs 。 芖線方向に反射される光の量 → V 

この倀は、 c o s α s どこで  a l p h aは、→ V そしお → R順番にあり、→ Lは、比范的反射したした→ N 。 ぀たり、最初のステップは蚈算するこずです → R から → N そしお → L 。

分解できたす → Lから2぀のベクトル→ L P そしお → L Nように、→ L = → L P + → L N どこで → L Nは平行→ N 、そしお → L Pは垂盎→ N 



→ L Nは投圱→ L に → N ; スカラヌ積の特性に埓い、次の事実に基づいお | → N | = 1、この投圱の長さは⟚ → N、→ L ⟩ 。 私たちはそれを決定したした → L Nは平行になりたす→ N、そう→ L N = → N ⟹ → N、 → L ⟩ 。

以来 → L = → L P + → L N、すぐに取埗できたす→ L P = → L - → L N = → L - → N ⟹ → N、 → L ⟩ 。

今芋お → R ; 察称的だから → L盞察→ N、そのコンポヌネント、䞊列→ N、同じ→ L、および垂盎成分は成分の反察です→ L ; それは → R = → L N - → L P 



前に取埗した匏を代入するず、次のようになりたす

→ R = → N ⟹ → N、 → L ⟩- → L + → N ⟹ → N、 → L ⟩


少し簡略化するず、

→ R =2 → N ⟹ → N、 → L ⟩- → L


「鏡」反射の䟡倀


これで、「鏡」反射の方皋匏を曞く準備ができたした。

→ R =2 → N ⟹ → N、 → L ⟩- → L


I S = I L ⟚ → R、→ V ⟩| → R | | → V | s


拡散照明ず同様に、 c o s α は負の倀になる可胜性があるため、再床無芖しなければなりたせん。さらに、すべおのオブゞェクトが玠晎らしいわけではありたせん。そのようなオブゞェクトこれは、S = - 1䞀般に「ミラヌ」の倀が算出されたせん。

鏡像レンダリング


珟圚䜜業䞭の「ミラヌ」反射をシヌンに远加したしょう。たず、シヌン自䜓にいく぀かの倉曎を加えたす。

 sphere {
    center =0、-1、3
    半埄= 1
    color =255、0、0赀
    鏡面反射= 500ブリリアント
 }
sphere {
    䞭倮=-2、1、3
    半埄= 1
    color =0、0、255青
    鏡面反射= 500ブリリアント
 }
sphere {
    䞭倮=2、1、3
    半埄= 1
    color =0、255、0緑
    鏡面反射= 10少し華麗
 }
sphere {
    color =255、255、0黄色
    䞭倮=0、-5001,0
    半埄= 5000
    鏡面反射= 1000非垞に玠晎らしい
 } 

コヌドでは、必芁にComputeLighting応じお「ミラヌリング」の倀を蚈算し、䞀般的な照明に远加するように倉曎する必芁がありたす。今圌が必芁ずするこずに泚意しおください→ V そしお s 

 ComputeLightingP、N、V、s{
    i = 0.0
    scene.Lights {
        light.type == ambient {
            i + = light.intensity
        } else {
            light.type ==ポむントの堎合
                L = light.position-P
            他に
                L = light.direction

            拡散
            n_dot_l =ドットN、L
            n_dot_l> 0の堎合
                i + = light.intensity * n_dot_l /長さN*長さL

            ミラヌリング
            if s= -1 {
                R = 2 * N *ドットN、L-L
                r_dot_v =ドットR、V
                r_dot_v> 0の堎合
                    i + = light.intensity * powr_dot_v /長さR*長さV、s
             }
         }
     }
    私を返す
 } 

最埌に、TraceRay新しいパラメヌタを枡すように倉曎する必芁がありたすComputeLighting。sは明らかです。球䜓のデヌタから取埗されたす。しかし、どうですか→ V  → Vは、オブゞェクトからカメラを指すベクトルです。幞いなこずに、カメラからオブゞェクトに向けられたベクトルが既にありたす-これTraceRay→ D、トレヌスされた光線の方向それは → Vはただ- → D 。

TraceRay「ミラヌ」リフレクションを䜿甚した新しいコヌドを次に瀺したす。

 TraceRayO、D、t_min、t_max{
    最も近いt = inf
    nearest_sphere = NULL
    scene.Spheres {の球の堎合
        t1、t2 = IntersectRaySphereO、D、球䜓
        [t_min、t_max]のt1およびt1 <closest_tの堎合
            最も近いt = t1
            最も近い球䜓=球䜓
        [t_min、t_max]のt2およびt2 <closest_tの堎合
            最も近いt = t2
            最も近い球䜓=球䜓
     }
    nearest_sphere == NULLの堎合
        BACKGROUND_COLORを返したす

    P = O + nearest_t * D亀差点の蚈算
    N = P-nearest_sphere.center亀差点での球の法線を蚈算したす
    N = N /長さN
    最も近い_sphere.colorを返す* ComputeLightingP、N、-D、sphere.specular
 } 

そしお、すべおこのゞャグリングベクトルに぀いお、圓瀟の報酬



゜ヌスコヌドず䜜業のデモ>>

圱


光ず物䜓があるずころには、圱がなければなりたせん。それで私たちの圱はどこにあるのでしょうか

より基本的な質問から始めたしょう。なぜべきで圱も圱は光があるずころに珟れたすが、その光線はオブゞェクトに到達できたせん。パスに別のオブゞェクトがあるためです。

前のセクションでは角床ずベクトルに関心がありたしたが、光源ず色付けする必芁がある点のみを考慮し、シヌンで発生する他のすべおを完党に無芖したした-たずえば、邪魔になったオブゞェクト。

代わりに、「ポむントず゜ヌスの間にオブゞェクトがある堎合、この゜ヌスからの照明を远加する必芁はありたせん」ずいう小さなロゞックを远加する必芁がありたす。

次の2぀のケヌスを匷調したす。



これに必芁なツヌルはすべお揃っおいるようです。

指向性゜ヌスから始めたしょう。知っおるP ;これが私たちの興味を匕くポむントです。知っおる→ L ;これは光源の定矩の䞀郚です。持っおいるP そしお → L、぀たり光線を蚭定できたす。P + t → L。ある点から無限遠の光源たで通過したす。この光線は別のオブゞェクトず亀差したすかそうでない堎合は、ポむントず゜ヌスの間に䜕もありたせん。぀たり、この゜ヌスから照明を蚈算し、それを合蚈照明に远加できたす。亀差する堎合、この゜ヌスを無芖したす。光線ず球䜓の間の最も近い亀差点を蚈算する方法はすでに知っおいたす。カメラからの光線を远跡するために䜿甚したす。再び䜿甚しお、光線ずシヌンの残りの郚分ずの間の最も近い亀差を蚈算できたす。ただし、オプションはわずかに異なりたす。カメラから開始する代わりに、



P 。 方向が等しくない V - O  、そしお → L 。 そしお、私たちはすべおの埌ず亀差するこずに興味がありたす Pから無限の距離。ずいうこずですt m i n = 0 そしお t m a x = + ∞ 。



ポむント゜ヌスは非垞に䌌た方法で凊理できたすが、2぀の䟋倖がありたす。たず、蚭定されおいたせん→ Lですが、゜ヌスの䜍眮から蚈算するのは非垞に簡単です。P 。 第二に、以䞋から始たる亀差点に興味がありたす P、ただしたでLそれ以倖の堎合、光源の背埌にあるオブゞェクトが圱を䜜成する可胜性がありたす; ぀たり、この堎合t m i n = 0 そしお t m a x = 1 。



考慮すべき境界線のケヌスが1぀ありたす。光線を取るP + t → L 。 で始たる亀差点を探すず t m i n = 0の堎合、P で t = 0の理由Pは実際に球䜓䞊にあり、P + 0 → L = P ;蚀い換えれば、各オブゞェクトはそれ自身に圱を萜ずしたす泚より正確には、オブゞェクト党䜓ではなく、ポむントがそれ自䜓に圱を萜ずす状況を避けたいです;球䜓よりも耇雑な圢状のオブゞェクト぀たり、凹面オブゞェクト自䜓に真の圱を萜ずすこずができたす

これを凊理する最も簡単な方法は、倀の䞋限を䜿甚するこずですt の代わりに 0䜎い倀\むスヌプシロン 。 幟䜕孊的に、衚面から少し離れたずころ、぀たり、 Pではなく正確にP 。 ぀たり、有向゜ヌスの堎合、間隔は [ ϵ 、+ ∞ ]および点-[ ϵ 、1 ] 。

圱付きのレンダリング


これを擬䌌コヌドに倉えたしょう。

前のバヌゞョンでTraceRayは、ビヌムず球䜓の最も近い亀差点を蚈算し、次に亀差点の照明を蚈算したした。圱を蚈算するために再び䜿甚するため、最も近い亀差点のコヌドを抜出する必芁がありたす。

 ClosestIntersectionO、D、t_min、t_max{
    最も近いt = inf
    nearest_sphere = NULL
    scene.Spheres {の球の堎合
        t1、t2 = IntersectRaySphereO、D、球䜓
        [t_min、t_max]のt1およびt1 <closest_tの堎合
            最も近いt = t1
            最も近い球䜓=球䜓
        [t_min、t_max]のt2およびt2 <closest_tの堎合
            最も近いt = t2
            最も近い球䜓=球䜓
     }
    最も近い_sphere、最も近い_tを返す
 } 

結果TraceRayははるかに簡単です

 TraceRayO、D、t_min、t_max{
    nearest_sphere、closest_t = ClosestIntersectionO、D、t_min、t_max

    nearest_sphere == NULLの堎合
        BACKGROUND_COLORを返したす

    P = O + nearest_t * D亀差点の蚈算
    N = P-nearest_sphere.center亀差点での球の法線を蚈算したす
    N = N /長さN
    最も近い_sphere.colorを返す* ComputeLightingP、N、-D、sphere.specular
 } 

次にComputeLighting、シャドりチェックを远加する必芁がありたす。

 ComputeLightingP、N、V、s{
    i = 0.0
    scene.Lights {
        light.type == ambient {
            i + = light.intensity
        } else {
            light.type == point {
                L = light.position-P
                t_max = 1
            } else {
                L = light.direction
                t_max = inf
             }

            シャドりチェック
            shadow_sphere、shadow_t = ClosestIntersectionP、L、0.001、t_max
            shadow_sphere= NULLの堎合
                続ける

            拡散
            n_dot_l =ドットN、L
            n_dot_l> 0の堎合
                i + = light.intensity * n_dot_l /長さN*長さL

            ミラヌリング
            if s= -1 {
                R = 2 * N *ドットN、L-L
                r_dot_v =ドットR、V
                r_dot_v> 0の堎合
                    i + = light.intensity * powr_dot_v /長さR*長さV、s
             }
         }
     }
    私を返す
 } 

新しくレンダリングされたシヌンは次のようになりたす。


゜ヌスコヌドず動䜜デモ>>

これで、すでに䜕かを取埗しおいたす。

リフレクション


光沢のあるオブゞェクトが埗られたした。しかし、実際にミラヌのように動䜜するオブゞェクトを䜜成するこずは可胜ですかもちろん、実際には、レむトレヌサヌでの実装は非垞に単玔ですが、最初はわかりにくいかもしれたせん。

ミラヌの仕組みを芋おみたしょう。鏡を芋るず、鏡から反射する光線が芋えたす。光線は、衚面の法線に察しお察称に反射され



たす。光線をトレヌスし、ミラヌが最も近い亀差点であるずしたす。光線は䜕色ですか明らかに、これはミラヌの色ではなく、反射ビヌムを持぀任意の色です。必芁なのは、反射光線の方向を蚈算し、この方向から萜ちおくる光の色が䜕であるかを調べるこずです。䞎えられた光線に察しおこの方向から萜ちる光の色を返す関数があれば...

ああ、埅っお、私たちはそれを持っおいたすそれは呌ばれTraceRayたす。

そこで、メむンルヌプTraceRayから始めお、カメラから攟出される「光線」が「芋る」ものを確認したす。TraceRay光線が反射オブゞェクトを認識しおいるず刀断した堎合、反射光線の方向を蚈算しお...を呌び出すだけで枈みたす。

この時点で、最埌の3぀の段萜を理解するたで読み盎すこずをお勧めしたす。再垰的なレむトレヌシングに぀いお初めお読む堎合は、数回読み盎しお、実際に理解する前に少し考える必芁がありたす。

時間をかけお、お埅ちください。

...

ナヌレカのこの玠晎らしい瞬間からの幞犏感少し寝お、これを少し圢匏化したしょう。

すべおの再垰アルゎリズムで最も重芁なこずは、無限ルヌプを防ぐこずです。このアルゎリズムには明らかな終了条件がありたす。光線が非反射オブゞェクトに圓たるか、䜕にも圓たらない堎合です。しかし、無限のサむクルに陥るこずができる単玔なケヌスがありたす。無限の廊䞋の効果です。鏡を別の鏡の反察偎に眮いお、自分の䞭の無限のコピヌを芋るず珟れたす

この問題を防ぐには倚くの方法がありたす。アルゎリズムの再垰制限を導入したす。圌は圌が行くこずができる「深さ」を制埡したす。圌に電話したしょうr 。 で r = 0、オブゞェクトが衚瀺されたすが、反射はありたせん。で r = 1いく぀かのオブゞェクトずいく぀かのオブゞェクトの反射が衚瀺されたす。で r = 2いく぀かのオブゞェクト、いく぀かのオブゞェクトの反射、およびいく぀かのオブゞェクトの反射の反射が衚瀺されたす。などなど。䞀般的な堎合、この段階ではすでに違いがほずんど目立たないため、2〜3レベル以䞊に深く行くこずはほずんど意味がありたせん。

別の区別を䜜成したす。「反射率」には「かどうか」ずいう意味がありたせん。オブゞェクトは郚分的に反射し、郚分的に色付けするこずができたす。各面に番号を割り圓おたす0 前に 1、その反射率を決定したす。その埌、この数倀に比䟋しお、ロヌカルに点灯した色ず反射した色を混合したす。そしお最埌に、再垰呌び出しが受け取るパラメヌタヌを決定する必芁がありたすか光線はオブゞェクトの衚面、぀たり点から始たりたす

TraceRayP 。 ビヌムの方向は、反射する光の方向です P ;でTraceRay我々が持っおいたす→ D、぀たりカメラからの方向P、光の動きずは反察、぀たり反射ビヌムの方向は→ - Dの反射に察しお、→ N 。 圱で起こるこずず同様に、オブゞェクトに自分自身を反映させたくないので、 t m i n = ϵ 。 オブゞェクトの距離に関係なく、オブゞェクトが反映されるのを確認したいので、 t m a x = + ∞ 。 そしお最埌-再垰制限は、珟圚の再垰制限よりも1぀少ないです。

反射レンダリング


レむトレヌサヌコヌドに反射を远加したしょう。

前ず同様に、たず、シヌンを倉曎したす。

 sphere {
    center =0、-1、3
    半埄= 1
    color =255、0、0赀
    鏡面反射= 500ブリリアント
    反射= 0.2わずかに反射
 }
sphere {
    䞭倮=-2、1、3
    半埄= 1
    color =0、0、255青
    鏡面反射= 500ブリリアント
    反射= 0.3もう少し反射
 }
sphere {
    䞭倮=2、1、3
    半埄= 1
    color =0、255、0緑
    鏡面反射= 10少し華麗
    反射= 0.4さらに反射
 }
sphere {
    color =255、255、0黄色
    䞭倮=0、-5001,0
    半埄= 5000
    鏡面反射= 1000非垞に玠晎らしい
    反射= 0.5半反射
 } 

いく぀かの堎所で「反射ビヌム」匏を䜿甚しおいるので、それを取り陀くこずができたす。圌女はビヌムを取埗したす→ Rおよび通垞→ N、戻る→ R、比范的反射→ N 

 ReflectRayR、N{
    return 2 * N * dotN、R-R;
 } 

唯䞀の倉曎ComputeLightingは、反射方皋匏をこの新しい方皋匏に眮き換えるこずReflectRayです。

mainメ゜ッドにわずかな倉曎が加えられたした- TraceRay再垰制限を䞊䜍レベルに枡す必芁がありたす。

 color = TraceRayO、D、1、inf、recursion_depth 

定数recursion_depthは、3たたは5などの劥圓な倀に蚭定できたす。

重芁な倉曎TraceRayは、反射を再垰的に蚈算する最埌の近くでのみ発生したす。

 TraceRayO、D、t_min、t_max、深床{
    closest_sphere, closest_t = ClosestIntersection(O, D, t_min, t_max)

    if closest_sphere == NULL
        return BACKGROUND_COLOR

    #   
    P = O + closest_t*D #   
    N = P - closest_sphere.center #       
    N = N / length(N)
    local_color = closest_sphere.color*ComputeLighting(P, N, -D, sphere.specular)

    #         ,   
    r = closest_sphere.reflective
    if depth <= 0 or r <= 0:
        return local_color

    #   
    R = ReflectRay(-D, N)
    reflected_color = TraceRay(P, R, 0.001, inf, depth - 1)

    return local_color*(1 - r) + reflected_color*r
 } 

結果がわかる



゜ヌスコヌドず䜜業デモ>>

再垰の深さの制限をよりよく理解するために、次のようにレンダリングを詳しく芋おみたしょう。r = 1 



そしお、これは同じシヌンの同じ拡倧図で、今回は r = 3 



ご芧のずおり、違いは、オブゞェクトの反射の反射の反射を芋るのか、オブゞェクトの反射だけを芋るのかです。

任意のカメラ


レむトレヌシングの説明の最初に、2぀の重芁な仮定を立おたした。カメラは 0 、0 、0 ず方向付け→ Z +、䞊方向は→ Y + 。このセクションでは、これらの制限を取り陀き、シヌン内の任意の堎所にカメラを配眮し、任意の方向に向けるこずができるようにしたす。

状況から始めたしょう。おそらく気づいたでしょうOは、擬䌌コヌド党䜓で1回だけ䜿甚されたす。トップレベルメ゜ッドでカメラから発せられる光線の開始点ずしお。カメラの䜍眮を倉曎したい堎合。する唯䞀のこずは、異なる倀を䜿甚するこずですO 。

䜍眮を倉曎するず、光線の方向に圱響したすか決しお。光線の方向は、カメラから投圱面に通過するベクトルです。カメラを移動するず、投圱面はカメラずずもに移動したす。぀たり、それらの盞察䜍眮は倉化したせん。

次に、方向に泚目したしょう。回転する回転行列があるずしたしょう0 、0 、1 ビュヌの所望の方向に、および0 、1 、0  -右方向に「アップ」及びずしお、次に定矩するこずによっお、それを行うために必芁ずされるべきである回転行列でありたす1 、0 、0   カメラを単玔に回転させおも、カメラの䜍眮は倉わりたせん。しかし、方向は倉化しおおり、カメラ党䜓ず同じ回転だけを受けたす。぀たり、方向性があれば→ Dず回転行列Rを回転させたDはただ→ D R 。

トップレベルの機胜のみが倉曎されたす

 [-Cw / 2、Cw / 2]のxの堎合{
    [-Ch / 2、Ch / 2]のyの堎合{
        D = camera.rotation * CanvasToViewportx、y
        color = TraceRaycamera.position、D、1、inf
        canvas.PutPixelx、y、色
     }
 } 

別の䜍眮から別の向きで芳察するず、シヌンは次のようになりたす。



゜ヌスコヌドず䜜業デモ>>

次に行く堎所


ただ調査しおいないいく぀かの興味深いトピックの簡単な抂芁で、䜜業の最初の郚分を終了したす。

最適化


はじめに述べたように、さたざたな可胜性を説明し、実装する最も理解しやすい方法を怜蚎したした。したがっお、レむトレヌサヌは完党に機胜したすが、特に高速ではありたせん。以䞋に、トレヌサヌを高速化するために独自に調査できるアむデアをいく぀か瀺したす。ちょっずした楜しみのために、実装の前埌にランタむムを枬定しおみおください。あなたは非垞に驚くでしょう

䞊列化


レむトレヌサヌを高速化する最も明癜な方法は、耇数のレむを同時にトレヌスするこずです。カメラからの各ビヌムは他のすべおのビヌムから独立しおおり、ほずんどの構造は読み取り専甚であるため、同期の問題による困難や困難を䌎うこずなく、䞭倮凊理装眮のコアごずに1぀のビヌムをトレヌスできたす。

実際、レむトレヌサヌは、その性質䞊、非垞に簡単に䞊列化できるため、非垞に䞊列化可胜ず呌ばれるアルゎリズムのクラスに属したす。

倀のキャッシュ


IntersectRaySphereレむトレヌサヌが通垞ほずんどの時間を費やす蚈算倀を怜蚎しおください。

 k1 =ドットD、D
    k2 = 2 *ドットOC、D
    k3 =ドットOC、OC-r * r 

これらの倀の䞀郚は、シヌン党䜓で䞀定です-球䜓がどのように配眮されおいるかを知るずすぐに、r*rそれらdot(OC, OC)はもはや倉化したせん。シヌンのロヌド䞭にそれらを䞀床蚈算し、レルム自䜓に保存できたす。球䜓が次のフレヌムで移動する必芁がある堎合は、それらを再カりントする必芁がありたす。dot(D, D)䞎えられた光線の定数ですので、それを蚈算しClosestIntersectionお枡すこずができたすIntersectRaySphere。

シャドりの最適化


途䞭で別のオブゞェクトを芋぀けたのでオブゞェクトは、光源に圱の盞察的に䜍眮されおいる堎合は、原因同じオブゞェクトぞの圌女のポむントずの隣人は、あたりにも、これが呌び出された光源に察する圱になっおいるこずを高い確率があり、圱の䞀貫性



぀たりは、ポむントず光源の間のオブゞェクトを探すずき、最初に、同じ光源に関連しお前のポむントにシャドりを適甚した最埌のオブゞェクトが珟圚のポむントをシャドりしないかどうかを確認できたす。もしそうなら、我々は終了するこずができたす。そうでない堎合は、通垞の方法で他のオブゞェクトのチェックを続けたす。

同様に、光線ずシヌン内のオブゞェクトずの亀差を蚈算する堎合、実際には最も近い亀差は必芁ありたせん。少なくずも1぀の亀差があるこずを知っおいるだけです。ClosestIntersection最初の亀差点が芋぀かるずすぐに結果を返す特別なバヌゞョンを䜿甚できたすこのためにclosest_t、ではなくブヌル倀を蚈算しお返す必芁がありたす。

空間構造


光線ず各球の亀差を蚈算するこずは、リ゜ヌスのかなりの無駄です。個々の亀差を蚈算する必芁なく、オブゞェクトのグルヌプ党䜓を䞀気にドロップできる倚くのデヌタ構造がありたす。

このような構造の詳现な怜蚎は、この蚘事のトピックには関係ありたせんが、䞀般的な考え方は次のずおりです。互いに近い耇数の領域があるずしたす。これらすべおの球を含む最小の球の䞭心ず半埄を蚈算できたす。光線がこの境界球ず亀差しない堎合は、光線が含たれる球ず亀差しないこずを確認でき、亀差の1回のチェックでこれを行うこずができたす。もちろん、球䜓ず亀差する堎合、その球䜓に含たれる球䜓ず亀差するかどうかを確認する必芁がありたす。

これに぀いおは、バりンディングボリュヌムの階局に぀いお読むこずで孊習できたす。

ダりンサンプリング


以䞋にレむトレヌサヌを䜜成する簡単な方法を瀺したす。 N倍高速で蚈算N倍少ないピクセルピクセルの光線をトレヌスするずしたす

10 、100  そしお 12 、100 、及びそれらが同じオブゞェクトに萜ちたす。論理的には、ピクセルの光線は11 、100 も、同じ目的に入るすべおのステヌゞ䞊から亀差点の初期サヌチをスキップしお、その時点での色の蚈算に盎接行きたす。氎平方向ず垂盎方向にこれを行うず、ビヌムシヌンの亀差の䞻芁な蚈算よりも最倧75少ない実行が可胜です。もちろん、この方法で非垞に薄いオブゞェクトを簡単にスキップできたす。以前に怜蚎したものずは異なり、これは「間違った」最適化です。その䜿甚結果は、それなしで埗たものず同䞀ではないためです。ある意味、この節玄をごたかしおいたす。トリックは、正しく保存するこずを掚枬し、満足のいく結果を提䟛するこずです。





その他のプリミティブ


前のセクションでは、球䜓を数孊的な芳点から簡単に操䜜できるため、球䜓をプリミティブずしお䜿甚したした。しかし、これを達成したら、他のプリミティブを簡単に远加できたす。

ビュヌの芳点からTraceRay、任意のオブゞェクトが適切である可胜性があるこずに泚意しおください。そのためには、2぀の倀のみを蚈算する必芁がありたす。ビヌムずオブゞェクト間の最も近い亀点、および亀点での法線の t。レむトレヌサヌの他のすべおは、オブゞェクトのタむプに䟝存したせん。䞉角圢は良い遞択です。たず、光線ず䞉角圢を含む平面ずの亀差を蚈算する必芁がありたす。亀差がある堎合は、ポむントが䞉角圢の内偎にあるかどうかを刀断したす。



構造ブロック圢状


実装が比范的簡単な非垞に興味深いタむプのオブゞェクトがありたす。他のオブゞェクト間のブヌル挔算です。たずえば、2぀の球䜓の亀点はレンズに䌌たものを䜜成でき、倧きな球䜓から小さな球䜓を差し匕くず、デススタヌに䌌たものを埗るこずができたす。

どのように機胜したすかオブゞェクトごずに、光線がオブゞェクトに出入りする堎所を蚈算できたす。たずえば、球の堎合、光線はm i n t 1、t 2およびm a x t 1、t 2 。2぀の球の亀差を蚈算する必芁があるずしたす。光線は、䞡方の球の内偎にある堎合は亀差の内偎にあり、反察の堎合には倖偎にありたす。枛算の堎合、光線は最初のオブゞェクトの内偎にあるずきに内偎にありたすが、2番目のオブゞェクトの内偎にはありたせん。

より䞀般的には、光線ずA ⹀ B どこ ⚀はブヌル挔算子です、最初に光線の亀差を個別に蚈算する必芁がありたすAずビヌムB、各オブゞェクトの「内郚」間隔を提䟛したすR A そしお R B 。 次に蚈算する R A ⹀ R Bの「内偎」の範囲内に䜍眮し、A ⹀ B 。 最初の倀を芋぀けるだけです tは、「内郚」間隔ず間隔の䞡方にありたす[ t m i n、t m a x ]亀差点での法線は、亀差点を䜜成するオブゞェクトの法線、たたは元のオブゞェクトの「倖偎から」たたは「内偎から」のどちらに芋えるかに応じお、その反察です。もちろん





A そしお Bはプリミティブである必芁はありたせん。それら自䜓がブヌル挔算の結果になる可胜性がありたすこれを玔粋に実装する堎合、それらから亀差点ず法線を取埗できる限り、それらが䜕であるかを知る必芁さえありたせん。したがっお、3぀の球䜓を䜿甚しお、たずえば次のように蚈算できたす。A ∪ B ∩ C 。

透明性


すべおのオブゞェクトが䞍透明である必芁はなく、䞀郚は透明である堎合がありたす。

透明床の実装は、反射の実装に非垞に䌌おいたす。ビヌムが郚分的に透明な衚面に圓たるず、以前ず同様に、ロヌカル色ず反射色を蚈算したすが、远加の色- 別の呌び出しで受信したオブゞェクトを通過する光の色も蚈算したすTraceRay。次に、オブゞェクトの透明床を考慮しお、この色ずロヌカル色および反射色を混ぜる必芁がありたす。それだけです。

屈折


実際には、光線が透明なオブゞェクトを通過するず、方向が倉わりたすしたがっお、ストロヌがコップ䞀杯の氎に浞されるず、「壊れた」ように芋えたす。方向の倉化は、次の匏に埓っお各材料の屈折率に䟝存したす。

sのI N α 1sのI N α 2 =N2n 1


どこで α 1 そしお α 2 -亀差点の前埌の面の光線ず法線ずの間の角床であり、そしおn 1 そしお n 2は、物䜓の倖偎ず内偎の材料の屈折率です。

䟋えば n はx で玄z d で、ほが等しい1.0 、そしお N におけるD Sにほが等しいです。1.33 。 ぀たり、ある角床で氎に入るビヌムの堎合 60 ∘ GET

sのI N 60 sのI N α 2 =1.331.0


sのI N α 2 = sのI N 60 1.33


α 2 = A R C S I N sのI N 60 1.33=40.628∘




少しの間停止しおください建蚭的なブロックゞオメトリず透明床を実装するず、物理的に正しい虫県鏡のように動䜜する虫県鏡2぀の球の亀点をシミュレヌトできたす

スヌパヌサンプリング


スヌパヌサンプリングは、速床ではなく粟床を远求するずきのサブサンプリングの倧たかな反察です。 2぀の隣接するピクセルに察応する光線が2぀の異なるオブゞェクトに圓たるずしたす。各ピクセルを察応する色で着色する必芁がありたす。

ただし、最初に行ったアナロゞヌを忘れないでください。各光線は、「グリッド」の各正方圢の「定矩」色を指定する必芁がありたす。曞き蟌みごずに1぀の光線を䜿甚しお、正方圢の䞭倮を通過する光線の色が正方圢党䜓を決定するこずを条件付きで決定したすが、そうでない堎合がありたす。

この問題を解決するには、ピクセルごずに耇数の光線4、9、16などをトレヌスし、それらを平均しおピクセルの色を取埗したす。

もちろん、この堎合、レむトレヌサヌは4倍、9倍、たたは16倍遅くなりたす。これは、ダりンサンプリングがそれを行うのず同じ理由です。 N倍高速。幞いなこずに、劥協点がありたす。衚面に沿ったオブゞェクトのプロパティは滑らかに倉化したす。぀たり、ピクセルごずに4぀の光線が攟出され、わずかに異なるポむントで1぀のオブゞェクトに圓たるず、シヌンの倖芳は倧きく改善されたせん。したがっお、ピクセルごずに1぀のレむから開始し、隣接するレむを比范できたす。他のオブゞェクトに圓たるか、倉換されたしきい倀よりも色が異なる堎合は、䞡方にピクセル分割を適甚したす。

レむトレヌサヌの擬䌌コヌド


以䞋は、レむトレヌシングの章で䜜成した擬䌌コヌドの完党版です。

 CanvasToViewportx、y{
    returnx * Vw / Cw、y * Vh / Ch、d
 }


ReflectRayR、N{
    return 2 * N * dotN、R-R;
 }


ComputeLightingP、N、V、s{
    i = 0.0
    scene.Lights {
        light.type == ambient {
            i + = light.intensity
        } else {
            light.type == point {
                L = light.position-P
                t_max = 1
            } else {
                L = light.direction
                t_max = inf
             }

            圱を確認する
            shadow_sphere、shadow_t = ClosestIntersectionP、L、0.001、t_max
            shadow_sphere= NULLの堎合
                続ける

            拡散
            n_dot_l =ドットN、L
            n_dot_l> 0の堎合
                i + = light.intensity * n_dot_l /長さN*長さL

            シャむン
            if s= -1 {
                R = ReflectRayL、N
                r_dot_v =ドットR、V
                r_dot_v> 0の堎合
                    i + = light.intensity * powr_dot_v /長さR*長さV、s
             }
         }
     }
    私を返す
 }


ClosestIntersectionO、D、t_min、t_max{
    最も近いt = inf
    nearest_sphere = NULL
    scene.Spheres {の球の堎合
        t1、t2 = IntersectRaySphereO、D、球䜓
        [t_min、t_max]のt1およびt1 <closest_tの堎合
            最も近いt = t1
            最も近い球䜓=球䜓
        [t_min、t_max]のt2およびt2 <closest_tの堎合
            最も近いt = t2
            最も近い球䜓=球䜓
     }
    最も近い_sphere、最も近い_tを返す
 }


TraceRayO、D、t_min、t_max、深床{
    nearest_sphere、closest_t = ClosestIntersectionO、D、t_min、t_max

    nearest_sphere == NULLの堎合
        BACKGROUND_COLORを返したす

    ロヌカルカラヌの蚈算
    P = O +最も近い_t * D亀点の蚈算
    N = P-nearest_sphere.center亀差点での球の法線を蚈算したす
    N = N /長さN
    local_color = nearest_sphere.color * ComputeLightingP、N、-D、sphere.specular

    再垰制限に到達した堎合、たたはオブゞェクトが反射しおいない堎合、完了です
    r = nearest_sphere.reflective
    深さ<= 0たたはr <= 0の堎合
        local_colorを返したす

    反射色の蚈算
    R = ReflectRay-D、N
    reflected_color = TraceRayP、R、0.001、inf、depth-1

    local_color *1-r+反射色* rを返したす
 }


[-Cw / 2、Cw / 2]のxの堎合{
    [-Ch / 2、Ch / 2]のyの堎合{
        D = camera.rotation * CanvasToViewportx、y
        color = TraceRaycamera.position、D、1、inf
        canvas.PutPixelx、y、色
     }
 } 

そしお、䟋をレンダリングするために䜿甚されるシヌンは次のずおりです。

 viewport_size = 1 x 1
projection_plane_d = 1

sphere {
    center =0、-1、3
    半埄= 1
    color =255、0、0赀
    鏡面反射= 500ブリリアント
    反射= 0.2わずかに反射
 }
sphere {
    䞭倮=-2、1、3
    半埄= 1
    color =0、0、255青
    鏡面反射= 500ブリリアント
    反射= 0.3もう少し反射
 }
sphere {
    䞭倮=2、1、3
    半埄= 1
    color =0、255、0緑
    鏡面反射= 10少し華麗
    反射= 0.4さらに反射
 }
sphere {
    color =255、255、0黄色
    䞭倮=0、-5001,0
    半埄= 5000
    鏡面反射= 1000非垞に玠晎らしい
    反射= 0.5半反射
 }


ラむト{
    タむプ=アンビ゚ント
    匷床= 0.2
 }
ラむト{
    タむプ=ポむント
    匷床= 0.6
    䜍眮=2、1、0
 }
ラむト{
    タむプ=方向
    匷床= 0.2
    方向=1、4、4
 } 

Source: https://habr.com/ru/post/J342510/


All Articles