サーフェスが別のサーフェスと正確に重なる原因は何ですか?


10

あるサーフェスが別のサーフェスとオーバーラップする原因を実際には理解できません。私が作成している3Dエンジンで、私のテクニックはエッジケースで失敗しています。

私の方法は、ペイントするサーフェスを最も遠いものから最も近いものに並べ替えます。近さを判断するために、平均z値を比較しています。ただし、場合によっては、オーバーラップしているサーフェスの平均z値が、オーバーラップしているものよりも高くなることがあります。したがって、より遠い表面が近い表面の上にペイントされます-このような奇妙なレンダリングになります:

側面に赤のセクションがある大きな紫色の正方形

見ようとしているのは、立方体の紫色の前面のみですが、赤い側面は紫色のものの上に描かれています。紫色の表面の平均Z値は高く、したがって「遠く」にあります。だから私はこのテクニックが正しいかどうかについていくつかの疑問を持っています。

また、カメラ(原点)から表面までの距離を取得することも試みましたが、ポイントが必要でした。各サーフェスの中央を選択しましたが、すべてのサーフェスが互いに同じ大きさではないため、これが常に機能するとは限りません。

したがって、原点に向かう表面の近さの順序を決定する信頼できる方法は何ですか?

回答:


11

Painters Algorithmを実装しようとしているようです。ほとんどの最新の3Dハードウェアはバートが言及したもの(Z /デプスバッファー)を使用しているため、学習課題としてラスタライザーをゼロから作成しようとしていると思います。ペインターアルゴリズムがすべてのケースで機能するためには、可能性のあるシナリオ(Wikipediaページに示されているポリゴンのオーバーラップの問題など)を解決するために、レンダリング時にサーフェスを細分割する準備をする必要があります。

最も遠いものから最も近いものにレンダリングすることで、ピクセルのレンダリングにも時間を費やすことになります。ピクセルは後で他のポリゴンによって遮られる可能性があり、テクスチャと複雑なシェーダーをポリゴンに配置し始めると、貴重なサイクルが無駄になります。これが、最新のハードウェアが前面から背面へのレンダリングを好む理由であり、深度バッファーを使用して、レンダリングされるピクセルが画面上のピクセルよりも離れているかどうかを判断します(したがって破棄できます)。

最近のほとんどのアクセラレーションハードウェアでも、半透明のポリゴンを並べ替えてレンダリングする必要があります。これは、すべての不透明なポリゴンがレンダリングされた後にのみレンダリングされます。


私は単純なレンダラーを作成していると言って間違いありません。ポイントは、私が3Dライブラリを使用していないことです。すべての投影計算を自分で行ってから、2D描画ライブラリを使用して線を描画します。これは最速ではなく、ピクセル単位で何もしていません。各面に4点があり、長方形を色で塗りつぶします。一度に完全なサーフェスを描画しているので、前から後ろに描画する必要があると言っても正しいですか?
pimvdb 2011

とても楽しく、学ぶための素晴らしい方法のように思えます。深度バッファなしでこれを行う場合は、前から前に戻るのが唯一の方法です。ポリゴンのすべての画面座標を計算し、重複がないか確認する必要があると思います。実際に並べ替えを正しく解決できるように、ポリゴンが細かく重なり合っている場合は、ポリゴンを切り刻んでレンダリングする必要がある可能性があります。また、必ずしも見えてはならないポリゴンを削除する方法として、バックフェースカリングに見たいと思うかもしれません
ロジャー・パーキンス

ロジャー・パーキンスは正しいです。ポリゴンをチョップしない限り、正しい方法でzソートを実行することはできません(つまり、常にいくつかのエッジケースが存在することになります)。しかし、それはかなり遅くなる可能性があります。
bummzack

うまくいきました!私が行ったのは、裏面カリングと並べ替えの組み合わせでした。固体の立方体では、一部の面が表示されず、他の面が表示されません(最大3)。そこで、見えない部分を先に描き、その上に見える部分を描きました。これはチャームのように機能します。1つ以上の辺を削除すると、それらは重なっていますが、正しい順序で描画されます。ありがとう!
pimvdb

1
これは、立方体のような単純な凸型の形状でのみ機能します。現在問題なく機能していますが、一般的な解決策ではありません。
リチャードファビアン

3

あなたが持っているのは可視性の問題です。1つの解決策は、Zバッファーを使用することです。


おかげで、私が誤解していない限り、z-バッファリングはピクセルごとのレンダリングを必要とします。私はそうしていません-立方体の投影された点の間に直線を描画しています。Zバッファリングはまだ可能ですか?
pimvdb

直線を描画している場合でも、画像が画面(またはビットマップファイル)に到達する前のある時点では、ピクセル形式になります。
Bart van Heukelom

それは正しいですが、私の描画ライブラリは20fpsでピクセルレンダリングを行うには遅すぎます。ありがとう。
pimvdb

2

平均Z値による面のソートは機能しません。平均Z値は、頂点の実際のZ値またはサーフェスピクセルさえも提供しないためです。

例(警告、ASCIIアートの先行):

          /
         /
cam     /
-->    / 
      /
     /--       <--B
    /
    ^--A

AとBの2つの面があります。カメラから見ると、AはBの前にありますが、Bの平均Z値は小さくなっています。他のZ値を見てみましょう:

  • Aの最小Z値は4
  • Aの最大Z値は11
  • したがって、Aの平均Z値は7.5です。
  • Bの最小Z値は6
  • Bの最大Z値は8
  • したがって、Bの平均Z値は7です。

最小のZ値で並べ替えることもできますが、それでもうまくいかない場合があります。Z値を1つだけ使用して任意の面を正しくソートする方法はありません。

Newellのアルゴリズムhttp://en.wikipedia.org/wiki/Newell 's_algorithmでは、Z値の最小/最大範囲を並べ替えます。2つの面の範囲が重なっていない場合は、どちらが前にあるかを確実に知ることができます。もしそうなら、時にはあなたは絶対に顔を分割する必要があります。場合によっては、オクルージョンやその他の手法のためにすべての頂点をレイトレースするだけで十分です。


この図は、彼のスクリーンショットで私が推測していることの俯瞰図です。
2011年

1

レンダリングについて学ぶことは良いことです。称賛。この例では、並べ替えによって修正しようとするのではなく、「ペインタアルゴリズム」ソリューションはありません。PS1では、ポリゴンが互いに隣接している場合に、ポリゴンを同じサイズに保つようにしていただけです(これは、私の知る限り)、そして裏面カリング(あなたはやっていない)

背面カリングは、スクリーンスペースの表面法線の方向をチェックしています(スクリーンスペースに変換された法線(この場合は法線のzでした)から深度要素の符号を取得するだけです)、またはの2つのベクトルの外積三角形、つまりcross(v1-v0、v2-v0))

裏面カリングを実装すると、ラスター化の量も減ります。


ご返信ありがとうございます。裏面カリングについては読みましたが、要点は、片側を削除できるようにしたいということです。固体の立方体の場合、これでうまくいくかもしれませんが、片側を削除すると、オクルージョンが発生しているので、並べ替える必要があると思います。とにかく、原点からサーフェスの中点まで光線を発射するというアイデアを思いつきました。その光線が後で別のサーフェスと交差する場合、最初のサーフェスは2番目のサーフェスと重なっています。その考えが正しいかどうか教えてもらえますか?ありがとう!
pimvdb 2011

あなたのアイデアはあなたの例のケースでうまくいくでしょうが、それがうまくいかない他の多くのケースがあります。たとえば、同じシーンがありますが、カメラが傾いていて、正しくないレンダリングクワッドの中心が重なっていません。プリミティブを細かく分割する必要があると思います。
Richard Fabian、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.