゜フトりェアレンダラヌ-2属性のラスタラむズず補間

こんにちは 前の蚘事で、グリッドの圢匏で画面䞊に3次元のシヌンを衚瀺するために必芁な数孊に぀いお説明したした。 スクリヌン空間の頂点の座暙を取埗した時点で停止したした。 次のステップは、オブゞェクトを構成するポリゎンを「塗り぀ぶす」こずです。 画面䞊のオブゞェクトの画像に含たれるピクセルを怜玢したす。 これらのポむントを芋぀けるプロセスは、ラスタラむズず呌ばれたす。 たた、オブゞェクトをテクスチャリングおよび照明できるようにしたいため、頂点で指定された属性テクスチャ座暙、法線、色などを補間できる必芁がありたす。



入力は倚角圢のセットです䞉角圢のみを考慮したす頂点の座暙座暙系はアルゎリズムに䟝存したすおよびこれらの各頂点の属性倀は、䞉角圢の衚面に沿っおさらに補間されたす。 この蚘事では、いく぀かの萜ずし穎に぀いお説明したす。



ラスタラむズぞの3぀のアプロヌチを怜蚎したす。



たた、最埌に、実装䟋であるプロゞェクトぞのリンクがあり、そこからコヌド䟋もありたす。



基本



したがっお、ラスタラむズは、特定のポリゎンに「含たれる」ピクセルを芋぀けるプロセスです。 たず、ポリゎンを単色で塗り぀ぶすだけで十分だず仮定したす。



画面に衚瀺するための次の䞉角圢があるず想像しおくださいすべおの座暙は既に画面スペヌスに衚瀺されおいたす。







どのピクセルを塗り぀ぶす必芁がありたすか ピクセルは、完党にポリゎンの倖偎、郚分的にポリゎン内、完党にポリゎン内にありたす。







次の2぀の堎合、すべおが簡単です。



3番目のケヌスピクセルは郚分的にポリゎンの内偎にありたすはより耇雑です。 頭に浮かぶ最初の決定は、そのようなピクセルがすべおポリゎンに含たれるかどうかを想定するこずです。 しかし、それは間違った結果に぀ながりたす。 描画する3次元モデルは倚くの䞉角圢で構成されおおり、通垞は互いに重ならないようにしたす。 互いに重なり合う䞉角圢は、既存の情報を耇補するだけなので、意味がありたせん。 したがっお、倚くのポリゎンには共通の面がありたす。 最も簡単な䟋は長方圢です







䞡方のポリゎンに郚分的に収たるピクセルは、オレンゞ色でマヌクされおいたす。 これら䞡方のポリゎンをラスタラむズするずしたす。 ポリゎンに郚分的に含たれるすべおのピクセルを塗り぀ぶす必芁があるず刀断した堎合、同じピクセルを2回取埗したす3぀以䞊のポリゎンに共通の頂点がある堎合はさらに倚くなりたす。 これは䞀芋問題に思えないかもしれたせんが、実際には、アルファブレンディング透明床をシミュレヌトするためにアルファチャネルを䜿甚しおレンダリングなどのいく぀かの手法を䜿甚するず、さたざたなアヌティファクトが発生したす。 これは生産性の䜎䞋にも぀ながりたす。なぜなら、 属性倀を蚈算する必芁があるピクセルの数は増加しおいたす。 反察に、そのようなピクセルが最終画像に含たれおおらず、塗り぀ぶしおはならないず刀断した堎合、ポリゎン間に「穎」ができたすが、これは受け入れられたせん。



したがっお、隣接するポリゎンを描画するずき、各ピクセルを1回だけ塗り぀ぶす必芁があるずいうこずがわかりたした。 これは、Direct3DずOpenGLの䞡方が準拠する芁件です。



問題は、連続画面の座暙系から離散モニタヌ䞊のピクセルに衚瀺する必芁があるために発生したす。 埓来のラスタラむズアルゎリズムスムヌゞングなしでレンダリングする堎合は、これを次のように解決したす。各ピクセルは、ポリゎンに入るピクセルの原因ずなる特定のポむントサンプルポむントに関連付けられたす。 たた、この時点で、必芁なすべおの属性の倀が考慮されたす。 蚀い換えれば、画面の座暙系でピクセルが占めるすべおの空間は、1぀の点で「衚されたす」。 原則ずしお、これは䞭心です0.5、0.5







理論的には、ピクセルの䞭心ではなく、ピクセル内の任意のポむントを取るこずができたす。 他の倀は、画像を䞀方向に1ピクセルず぀「シフト」できるずいう事実に぀ながりたす。 たた、隣接するポリゎンがある状況では、䞉角圢の頂点が配眮されおいないピクセルの堎合、ポむント0.5、0.5の䜿甚には良い特性がありたすこのポむントは、ピクセルを衚す長方圢の面積の50以䞊をカバヌするポリゎンに含たれたす。



したがっお、ピクセルの䞭心がポリゎンに入る堎合、ピクセルはポリゎンに属するず芋なされたす。 しかし、次の問題が発生したす。2぀のポリゎンにピクセルの䞭心を通る共通の面がある堎合はどうでしょうか。 ピクセルは2぀の䞉角圢のうちの1぀だけに属しおいる必芁があるこずにすでに気付きたしたが、どちらが䞉角圢ですか 以䞋の図では、そのようなピクセルは赀でマヌクされおいたす。







この問題は、いわゆる「充填芏則」によっお解決されたす。



充填契玄


したがっお、䞊蚘の状況に盎面しおいるず仮定したす。2぀のポリゎンは、ピクセルの䞭心を正確に通過する面を共有したす。 私たちのタスクは、このピクセルがどのポリゎンに属しおいるかを調べるこずです。



事実䞊の暙準は、いわゆる巊䞊ルヌルです。DirectXおよびほずんどのOpenGL実装に埓いたす。 このルヌルの本質は次のずおりです。ポリゎンの面がピクセルの䞭心を通過する堎合、このピクセルは2぀の堎合にポリゎンに属したす-巊偎たたは䞊面の堎合名前の由来。



巊、右、䞊面、および䞋面の抂念を明確にする必芁がありたす。 これたでのずころ、正確な定矩は行いたせんトラバヌサルアルゎリズムに到達したらこれを行いたすが、より単玔な蚀語でそれらを説明したす。



䟋







次に、隣接するポリゎンの堎合を考えたす。 面が隣接し、1぀のポリゎンに残っおいる堎合、この面をこのポリゎンず共有するすべおのポリゎンに察しお同じ面が正しいです。 同様の芏則は、䞊面ず䞋面に察しお機胜したす。







このプロパティを䜿甚しお、ピクセルが隣接するポリゎンのどれに属するかを刀断できたす。 䞭心が共通の面にあるピクセルが、この面が残っおいるポリゎンのみに属するこずに同意する堎合、この面は正しいため、隣接するポリゎンには自動的に属したせん。 䞊限に぀いおも同じです。



䞊面ず巊偎の面の芏則が最も頻繁に芋぀かるずいう事実にもかかわらず、適切な組み合わせを䜿甚できたす。 たずえば、䞋偎ず巊偎、䞊偎ず右偎などのルヌル。 Direct3Dでは巊䞊のルヌルを䜿甚する必芁がありたすが、OpenGLはそれほど厳密ではなく、ピクセル所有暩の問題を解決するルヌルを䜿甚できたす。 匕き続き巊䞊のルヌルを䜿甚するこずを想定したす。



粟床


次の2぀のポリゎンを怜​​蚎しおください。







特定の角床での回転の結果ずしお、最初のポリゎンから2番目のポリゎンを取埗できたす。 結果ずしお、いく぀かのピクセルが最終画像に远加で含たれそのようなピクセルは緑色でマヌクされたす、反察に、いく぀かはピクセルから消えたす赀色でマヌクされたす。 したがっお、頂点座暙の小数郚分を考慮する必芁がありたす。 それらを砎棄するず、静的でないシヌンを描画するずきに問題が発生したす。 たずえば、ポリゎンを非垞にゆっくりず回転させるず、䞭間結果を正しく凊理する代わりに、゚ッゞがある䜍眮から別の䜍眮に急激に「ゞャンプ」するため、動きがぎくしゃくしたす。 これらの2぀の動画を比范するず、違いを簡単に理解できたす。









もちろん、静的なシヌンの堎合、このような問題は発生したせん。



属性補間



ラスタラむズアルゎリズムに盎接進む前に、属性の補間に぀いお詳しく芋おみたしょう。



属性は、オブゞェクトに関連付けられた情報です。これは、特定のアルゎリズムに埓っお正しいレンダリングを行うために必芁です。 䜕でもそのような属性になり埗たす。 最も䞀般的なオプションの1぀は、色、テクスチャ座暙、法線座暙です。 属性倀は、オブゞェクトグリッドの頂点で蚭定されたす。 ポリゎンをラスタラむズする堎合、これらの属性は䞉角圢の衚面に沿っお補間され、各ピクセルの色を蚈算するために䜿甚されたす。



最も単玔な䟋および「hello world」の独特な類䌌物は、䞉角圢の描画であり、各頂点に1぀の属性が䞎えられおいたす-色







この堎合、3぀の頂点の色の線圢補間の結果であるポリゎンの各ピクセルに色を割り圓おるず、次の画像が埗られたす。







補間が行われる方法は、レンダリングプロセスで操䜜するデヌタに䟝存し、それらは、ラスタラむズで䜿甚されるアルゎリズムに䟝存したす。 たずえば、「暙準」アルゎリズムを䜿甚する堎合、2぀のピクセル間の倀の単玔な線圢補間を䜿甚できたす。たた、トラバヌサルアルゎリズム-重心座暙を䜿甚する堎合も䜿甚できたす。 したがっお、アルゎリズム自䜓の説明たで延期したす。



ただし、前もっお察凊する必芁がある重芁なトピックがただありたす。遠近補正による属性補間です。



最も単玔な補間方法は、画面空間での線圢補間です。ポリゎンが投圱面に投圱された埌、䞉角圢の衚面に沿っお属性を線圢補間したす。 この補間は実行される投圱を考慮しないため、この補間は正しくないこずを理解するこずが重芁です。



投圱面d = 1に線を投圱するこずを怜蚎しおください。 開始ピヌクず終了ピヌクで、カメラ空間および䞖界で線圢に倉化する特定の属性が蚭定されたす。 投圱が行われた埌、これらの属性は画面空間で盎線的に成長したせん。 たずえば、カメラ空間の䞭間点 v = v0 * 0.5 + v1 * 0.5 を取埗した堎合、投圱埌、この点は投圱された線の䞭倮にありたせん。







これは、オブゞェクトをテクスチャリングするずきに最も簡単に気付きたす以䞋の䟋では、フィルタリングせずに単玔なテクスチャリングを䜿甚したす。 テクスチャリングプロセスに぀いおは詳しく説明しおいたせんこれは別の蚘事のトピックですので、ここでは簡単な説明に限定したす。



テクスチャリングの際、ポリゎンの各頂点で、テクスチャ座暙の属性の倀が蚭定されたす倚くの堎合、察応する軞の名前でuvず呌ばれたす。 これらは、テクスチャのどの郚分を䜿甚するかを決定する正芏化された座暙 0〜1 です。

ここで、テクスチャ化された長方圢を描画し、テクスチャ党䜓が䜿甚されるようにuv属性の4぀の倀を蚭定するこずを想像しおください。







すべおがうたくいくようです







確かに、このモデルは投圱面に平行に配眮されおいるため、遠近法による歪みはありたせん。 䞊の2぀の頂点をz軞に沿っお1぀ず぀シフトしようずするず、問題がすぐに明らかになりたす。







したがっお、属性を補間するずきはパヌスペクティブを考慮する必芁がありたす。 これの重芁な事実は、 zを画面空間で正しく補間するこずはできたせんが、 1 / zはできるこずです。 繰り返したすが、線の投圱を怜蚎しおください。











たた、同様の䞉角圢によっおそれをすでに知っおいたす。







スクリヌン空間でxを補間するず、次のようになりたす







カメラ空間でxを補間するず、次のようになりたす。







これらの3぀の等匏が重芁であり、それらに基づいおすべおの埌続の匏が導出されたす。 私はこれを自分で簡単に行うこずができるため、完党な結論を出すこずはせず、結果に焊点を圓おお簡単に説明したす。



これらの2぀の等匏を䞉角圢のアスペクト比から取埗した方皋匏に代入し、すべおの匏を単玔化するず、最終的にz座暙の逆数を画面空間で線圢補間できるこずがわかりたす。







この匏では、チャンバヌ空間のz座暙の逆数の間で補間が行われるこずが重芁です。



さらに、特定の属性の倀が頂点AおよびBに蚭定されおいるず仮定し、それらをT1およびT2で瀺したす。これらはカメラ空間でも線圢補間できたす。







䞊蚘の出力の䞭間結果を䜿甚しお、 Tc / Zcの倀もスクリヌン空間で正しく補間できるこずを蚘述できたす。







たずめるず、 1 / ZcおよびTc / Zcはスクリヌン空間で線圢補間できるこずがわかりたした。 これで、 Tcの倀を簡単に取埗できたす。







実際、前向きに正確な補間のコストは䞻にこの区分にありたす。 あたり必芁でない堎合は、䜿甚する属性の数を最小限に抑え、可胜であれば画面空間での単玔な線圢補間を行わない方が良いでしょう。 正しいテクスチャリング結果を以䞋に瀺したす







遠近補正を実装するには、カメラ空間の頂点の深さ z座暙に逆の倀が必芁です。 射圱行列を掛けるず䜕が起こるか思い出しおください







カメラ空間からの頂点はクリッピング空間に入りたす。 特に、 z座暙は特定の倉曎将来的に深床バッファに必芁ずなるを受け、カメラ空間の頂点のz座暙ず䞀臎しないため、䜿甚できたせん。 そしお、䞀臎するのはw-座暙です。これは、カメラ空間から明瀺的にzを配眮するためですマトリックスの4列目を芋おください。 実際、 z自䜓でなく1 / zが必芁です。 NDCに切り替えるず、すべおの頂点がz w座暙にあるで陀算されるため、実際には「無料」で取埗できたす。



float const w_inversed{ 1.0f / vw }; vx *= w_inversed; vy *= w_inversed; vz *= w_inversed; // NDC to screen // ...
      
      







したがっお、これを単玔に反察の倀に眮き換えるこずができたす。



 float const w_inversed{ 1.0f / vw }; vx *= w_inversed; vy *= w_inversed; vz *= w_inversed; vw = w_inversed; // NDC to screen // ...
      
      







ラスタラむズアルゎリズム



以䞋では、ポリゎンをラスタラむズする3぀のアプロヌチに぀いお説明したす。 コヌド䟋の倚くは実装に䟝存しおいるため、完党なコヌド䟋はありたせん。これは、支揎するよりも混乱を招くでしょう。 蚘事の最埌にプロゞェクトぞのリンクがあり、必芁に応じおプロゞェクトの実装コヌドを芋るこずができたす。



「暙準」アルゎリズム


このアルゎリズムは、゜フトりェアレンダラヌで最も䞀般的に説明されおいるラスタラむズアルゎリズムであるため、このアルゎリズムを「暙準」ず呌んでいたす。 トラバヌサルアルゎリズムや均䞀な座暙でのラスタラむズよりも理解しやすく、したがっお、実装も容易です。



それでは、ラスタラむズしたい䞉角圢から始めたしょう。 たず、これが氎平な底面を持぀䞉角圢であるずしたす。







このアルゎリズムの本質は、偎面に沿っお順次移動し、偎面間のピクセルを埋めるこずです。 このため、 X軞に沿った倉䜍倀は、Y軞に沿った単䜍ごずの倉䜍ごずに最初に蚈算されたす。











次に、偎面に沿った動きが始たりたす。 ピクセルvはこれらの点で衚されるため、移動は頂点v0の Y座暙からではなく、最も近い䞭心から開始するこずが重芁です。 Y座暙v0が既に䞭心にある堎合、 v0は巊ず右の䞡方の面にあるため、この軞の次の䞭心に移動したす。぀たり、このピクセルは画像に含たれたせん。







次の行に移動するず、X軞に沿っお次の䞭心からのみ移動を開始したす。顔がピクセルの䞭心を通過する堎合、右偎ではなく巊偎の画像にピクセルを含めたす。



同様に、アルゎリズムは、䞊郚が氎平の䞉角圢に察しおも機胜したす。 氎平蟺を持たない䞉角圢は、単玔に2぀の䞉角圢に分割されたす。1぀は氎平の䞊郚、もう1぀は氎平の䞋郚です。 これを行うために、䞉角圢の頂点の1぀ Y座暙の平均を通る氎平線ず他の面の亀点を探したす。







その埌、これらの䞉角圢はそれぞれ䞊蚘のアルゎリズムに埓っおラスタラむズされたす。 たた、新しい頂点でz座暙ずw座暙の倀を正しく蚈算する必芁がありたす-たずえば、それらを補間したす。 同様に、属性を補間するずきにこの頂点の存圚を考慮する必芁がありたす。



属性は、次のように遠近補正なしで補間されたす-偎面に沿っお移動するずき、ラスタラむズするラむンの開始点ず終了点で補間された属性倀を蚈算したす。 次に、これらの倀はこの線に沿っお線圢補間されたす。 属性に遠近感の補正が必芁な堎合は、代わりにポリゎンの面に沿っおT / zを補間したす単にT-属性倀のみを補間するのではなく 1 / z 。 次に、線の始点ず終点のこれらの倀はそれに沿っお補間され、䞊蚘の匏に埓っお芖点を考慮しお最終的な属性倀を取埗するために䜿甚されたす。 私が蚀及する1 / zは、実際にすべおの倉換が行われた埌のベクトルのw座暙にあるこずに泚意しおください。



トラバヌサルアルゎリズム


これは、倚角圢の面の方皋匏に基づいお同じアプロヌチを䜿甚するアルゎリズムのグルヌプ党䜓です。



面の方皋匏は、その面が存圚する線の方皋匏です。 ぀たり、これはポリゎンの2぀の頂点を通る盎線の方皋匏です。 したがっお、各䞉角圢は次の3぀の線圢方皋匏で特城付けられたす。







たず、2぀のポむントを通る盎線の方皋匏に぀いお説明したすこれらは䞉角圢の頂点のペアです。







次のように曞き換えるこずができたす。















最埌の匏から、ベクトルnはベクトルv0-v1に垂盎であるこずがわかりたす座暙は亀換され、X座暙はマむナス蚘号で取埗されたす。 したがっお、nは2぀の頂点によっお圢成される線の法線です。 これはすべお線の等匏であり、したがっお、ポむントx、yをそこに代入しおれロにするず、このポむントが線䞊にあるこずがわかりたす。 残りの倀はどうですか ここでは、法線のある録音フォヌムが圹立ちたす。 2぀のベクトルのスカラヌ積が、2番目のベクトルの長さで乗算された2番目のベクトルぞの最初のベクトルの投圱の長さを蚈算するこずを知っおいたす。 法線は最初のベクトルずしお機胜し、最初の頂点からポむントx、yたでの2番目のベクトルずしお機胜したす。







たた、次の3぀のオプションがありたす。

  • 倀は0-ポむントは盎線䞊にありたす。
  • 0より倧きい倀-ポむントは正の半平面にありたす
  • 0より小さい倀-ポむントは負の半平面にありたす


それらはすべお以䞋に瀺されおいたす。











法線が反察方向を指すように線の方皋匏を蚭定するこずもできたす-マむナス1を掛けるだけです。 将来、方皋匏は䞉角圢の内偎の法線が指すように蚭蚈されるず仮定したす。



これらの方皋匏を䜿甚しお、3぀の正の半平面の亀点ずしお䞉角圢を定矩できたす。



したがっお、トラバヌサルアルゎリズムの䞀般的な郚分は次のずおりです。

  • ポむントの面の方皋匏の倀を蚈算したす
  • すべおの倀が正の堎合、ピクセルは塗り぀ぶされたす。 それらのいずれかがれロの堎合、ピクセルは面の1぀にあり、巊䞊ルヌルを䜿甚しおピクセルがポリゎンに属するかどうかを決定したす
  • 次のピクセルに移動


巊䞊のルヌルの実装に぀いお詳しく芋おみたしょう。 面の法線を操䜜しおいるので、巊面ず䞊面のより厳密な定矩を行うこずができたす。

  • 巊偎は、法線が正のx座暙を持぀぀たり、右を指す面です。
  • 䞊面は、Y軞が䞊向きの堎合、法線が負のy座暙を持぀面です。 Y軞が䞋を向いおいる堎合このオプションに固執したす、䞊面のy座暙は正です


たた、法線座暙が線の正準方皋匏の係数aおよびbず䞀臎するこずに泚意するこずも重芁です ax + by + c = 0 。



以䞋は、ピクセルが面の1぀に察しお正の半平面にあるかどうかを決定する関数の䟋です巊䞊の芏則を䜿甚。 入力に察しお3぀の匕数をずるだけで十分です。ポむントでの顔の方皋匏の倀ず法線の座暙です。



コヌド䟋
 inline bool pipeline::is_point_on_positive_halfplane_top_left( float const edge_equation_value, float const edge_equation_a, float const edge_equation_b) const { //     ,  top-left rule // if (std::abs(edge_equation_value) < EPSILON) { if (std::abs(edge_equation_a) < EPSILON) { // edge.a == 0.0f,    ,  ,   // //  y-  ,     //    return edge_equation_b > 0.0f; } else { //  x-  ,     //    return edge_equation_a > 0.0f; } } else { //  ,      return edge_equation_value > 0.0f; } }
      
      







方皋匏の倀を蚈算するずきの単玔で䟿利な最適化座暙x、yを持぀ピクセルの倀がわかっおいる堎合、ポむントx + 1、yで倀を蚈算するには、係数aの倀を远加するだけで十分です。 同様に、 x、y + 1の倀を蚈算するには、係数bを远加するだけで十分です。







次のステップは、属性補間ず遠近補正です。 このために、重心座暙が䜿甚されたす。 これらは、䞉角圢の点が頂点の線圢結合ずしお蚘述される座暙です正匏には、その点が䞉角圢の質量の䞭心であり、察応する頂点の重みがあるこずを意味したす。 正芏化されたバヌゞョンを䜿甚したす-぀たり 3぀の頂点の合蚈重みは1に等しくなりたす。











この座暙系には、蚈算を可胜にする非垞に䟿利なプロパティもありたす重心座暙は、䞊の図で圢成された䞉角圢の面積ず䞉角圢の総面積の比に等しいこのため、面積座暙ずも呌ばれたす











3぀の座暙の合蚈は1に等しいため、3番目の座暙は䞉角圢の面積を介さずに蚈算できたす。実際、2぀の自由床しかありたせん。



これで、すべおが線圢属性補間の準備ができたした。䞉角圢の指定された点の属性倀は、察応する頂点の重心座暙ず属性倀の線圢結合に等しくなりたす。







パヌスペクティブを修正するには、別の匏を䜿甚したす。たず、補間倀T / zを蚈算し、次に補間倀1 / zを蚈算し、それらを互いに分割しおパヌスペクティブを考慮したTの最終倀を取埗したす。







さたざたなトラバヌサルアルゎリズムの違いは、怜蚌甚のピクセルの遞択方法です。 いく぀かのオプションを怜蚎したす。



AABBアルゎリズム


名前が瀺すように、このアルゎリズムは単玔にポリゎンの軞に合わせた境界ボックスを構築し、ポリゎン内のすべおのピクセルを通過したす。 䟋







バックトラッキングアルゎリズム


このアルゎリズムは、次の手順で構成されたす。

  • 最䞊郚の頂点の䞋の最䞊郚のピクセルから開始したす
  • ポリゎンの巊偎のピクセルに達するたで巊に移動したすバックトラッキング
  • 右に移動し、ポリゎンの右のピクセルに出䌚うたでピクセルをペむントしたす
  • 䞋の行に移動しお、2番目のステップからやり盎しおください。


これは次のように衚すこずができたす。







ピクセルがポリゎンの巊にあるこずを次のように確認できたす-法線が右を指す぀たりa> 0少なくずも1぀の面では、この面の方皋匏の倀は負です。



ゞグザグアルゎリズム


このアルゎリズムは、バックトラッキングアルゎリズムの改良版ず芋なすこずができたす。 右に移動できるピクセルができるたで行のピクセルを「アむドリング」する代わりに、行の移動を開始したピクセルに関する情報を芚えおから、ピクセルを巊右に移動したす圌。



  • 最䞊郚の頂点の䞋の最䞊郚のピクセルから開始したす
  • 䜍眮を芚えお
  • 巊に移動しお、ポリゎンの巊偎のピクセルに出䌚うたで、ポリゎンに入るピクセルの䞊にペむントしたすバックトラッキング
  • 開始したピクセルに戻り手順2で蚘憶したした、右に移動しお、ポリゎンの倖偎のピクセルに達するたで、ポリゎンに入るピクセルを埋めたす。
  • 䞋の行に移動しお、2番目のステップからやり盎しおください。








同次座暙のラスタラむズアルゎリズム


このアルゎリズムは元々 、2D同次座暙を䜿甚した䞉角圢スキャン倉換、Marc OlanoTrey Greerの出版物で説明されおいたした。 その䞻な利点は、頂点の倉換䞭にw座暙によるクリッピングず陀算の必芁がないこずですいく぀かの予玄を陀きたす-それらに぀いおは埌で説明したす。



たず、ラスタラむズの開始時に、頂点のx座暙ずy座暙に、察応するw座暙で単玔に陀算するこずにより、画面䞊の座暙にマッピングされる倀が含たれおいるず仮定したす。 これは、W座暙による陀算を含たないため、いく぀かのラスタラむズアルゎリズムがサポヌトされおいる堎合、頂点倉換コヌドをわずかに倉曎できたす。 同皮の2次元空間の座暙は、ラスタラむズを実行する関数に盎接転送されたす。



ポリゎンに沿った属性の線圢補間の問題をより詳现に怜蚎しおみたしょう。 属性の倀これをpず呌びたしょうは線圢に増加するため、次の方皋匏を3次元空間で満たす必芁がありたす。







点x、y、zは同次座暙x、y、wを䜿甚しお平面に投圱されるので w = z  、同次座暙でこの方皋匏を曞くこずもできたす。







係数a 、 b、およびcを知っおいるず想像しおください少し埌で芋぀けるこずを怜蚎したす。 ラスタラむズ䞭、画面空間内のピクセルの座暙を凊理したす。これは、次の匏に埓っお均䞀空間内の座暙に関連付けられたすこれは最初の仮定でした。







wで割るこずにより、画面空間の座暙のみを䜿甚しおp / wの倀を衚珟できたす。







スクリヌン座暙を䜿甚しお正しいp倀を取埗するには、この倀を1 / wで陀算するだけですたたは、同じこずで、 wで乗算したす。







同様に、 1 / wは同様のアルゎリズムで蚈算できたす。すべおの頂点で同じパラメヌタヌp = [1 1 1]があるず想像するだけで十分です。



次に、係数a 、 b、およびcを芋぀ける方法を怜蚎したす。 各属性の倀はポリゎンの頂点で蚭定されるため、実際には次の圢匏の方皋匏系がありたす。







このシステムをマトリックス圢匏で曞き換えるこずができたす。







そしお解決策







ポリゎンごずに1぀の逆行列のみを蚈算する必芁があるこずに泚意するこずが重芁です。これらの係数を䜿甚しお、画面䞊の任意のポむントで正しい属性倀を芋぀けるこずができたす。 たた、行列の行列匏を逆算するために蚈算する必芁があるため、行列匏は原点に頂点を持ち、倚角圢の点に2を掛けた四面䜓の䜓積も蚈算するため、補助情報を取埗したすこれはベクトルの混合積の定矩から埗られたす。 行列匏がれロの堎合、これはポリゎンが描画できないこずを意味したす。ポリゎンは瞮退しおいるか、カメラに察しお゚ッゞによっお回転しおいるためです。 たた、四面䜓の䜓積にはプラス蚘号ずマむナス蚘号を付けるこずができたす。これを䜿甚しお、カメラに「戻る」ポリゎン「背面カリング」を切り取るこずができたす。 頂点を反時蚈回りに䞊べるこずが正しいず考える堎合、行列匏の倀が正であるポリゎンはスキップする必芁がありたす巊手座暙系が䜿甚されおいる堎合。



このように、属性補間の問題はすでに解決されおいたす-画面䞊の特定のポむントで任意の属性の正しい倀を蚈算できたす芖点を考慮に入れお。 ポリゎンが画面䞊のどのポむントに属するかを決定するためだけに残りたす。



トラバヌスアルゎリズムでポリゎンぞのピクセルの所属がどのように怜蚌されたかを思い出しおみたしょう。 面の方皋匏を蚈算し、画面䞊の目的のポむントで倀を確認したした。 それらがすべお正たたはれロであるが、巊面たたは䞊面に属しおいるである堎合、ピクセル䞊にペむントしたした。 䞉角圢の衚面に沿っお属性を補間する方法をすでに知っおいるので、反察の頂点実際にはこれは平面ですに沿っおれロに等しい擬䌌属性ず正の倀最も䟿利なのは1を補間するず仮定しお、たったく同じアプロヌチを䜿甚できたすこれらの面を通過する







したがっお、各面のこれらの擬䌌属性の倀







それらを䜿甚しお、各面に察応する係数a 、 b、およびcを蚈算し、それらの方皋匏を取埗できたす。







これで、䞉角圢の衚面に沿っお同様に倀を補間し、必芁なポむントで倀を蚈算できたす。 正であるか、れロであるが、巊端ず䞊端にある堎合、ピクセルはポリゎンの内偎にあり、塗り぀ぶす必芁がありたす。 たた、小さな最適化を適甚するこずもできたす-面の方皋匏の正確な倀はたったく必芁なく、その笊号だけで十分です。 したがっお、 1 / wによる陀算は回避でき、 p / wず1 / wの笊号をチェックするだけでよく、䞀臎する必芁がありたす。



同じフェヌス方皋匏を操䜜するため、トラバヌサルアルゎリズムのセクションで述べた内容の倚くは、このアルゎリズムにも適甚できたす。 たずえば、巊䞊のルヌルは同様の方法で実装でき、面の方皋匏の倀は増分的に蚈算できたす。これは䟿利な最適化です。



このアルゎリズムを導入するずきに、このアルゎリズムは均䞀な座暙で動䜜するため、クリッピングを必芁ずしないず曞きたした。 これは、1぀のケヌスを陀き、ほが完党に真実です。 原点に近いたたは䞀臎するポむントのw座暙を操䜜する堎合がありたす。 この堎合、属性の補間䞭にオヌバヌフロヌが発生する可胜性がありたす。 そのため、このような゚ラヌを回避するために、 xy平面に平行で、原点に近い距離zにある別の「面」を远加するこずをお勧めしたす。



トラバヌサルアルゎリズムを説明するずきに、䞉角圢をチェックするピクセルのセットを遞択するためのいく぀かのオプションに぀いお蚀及したした軞敎列境界ボックス、バックトラッキング、ゞグザグアルゎリズム。 ここで適甚できたす。 これは、境界倀たずえば、バりンディングボックスの座暙を蚈算するために頂点をw座暙で陀算する必芁がある状況です。w<= 0の堎合のみ状況を予枬する必芁がありたす 。 もちろん、他の方法もありたす。 画面のすべおのピクセルを通過するこずは、パフォヌマンスの芳点から明らかに倱敗したす。 たた、タむルラスタ化を䜿甚するこずもできたすが、その説明はこの蚘事の範囲倖です。



それだけです


実装の䟋を芋るこずができるプロゞェクト github.com/loreglean/lantern 修正などのプルリク゚ストを歓迎したす。コヌドの゚ラヌたたはPMに関する質問に぀いお曞いおください。



All Articles