14

平面をレンダリングして、すべての方向で無限大になるように見せたいと思います。距離の平面境界を地平線にしたいと思います。

単純なメッシュを使用しても機能しません。コンピューターは、無限に多くの三角形をレンダリングすることはできません。これが可能であったとしても、カメラの錐台は遠くのポリゴンを切り取り、平面の境界と地平線の間にギャップを作成します。

回避策は、地平線を数学的に計算することです。つまり、平面上の点を見つけます。これも、無限遠の平面上にあります。これらのポイントとビューポートの2つのコーナーを接続すると、求められている平面を表す台形が作成されます。ただし、この方法では、平面を適切に照らしたり、テクスチャを適用したり、細かい三角測量を必要とするその他のものを適用したりすることはできません...

4

2 に答える 2

21

標準のラスタライズパイプラインを使用して、無限平面を描画できます。使用する同次座標は、通常のユークリッド点と同じように「理想的な」点(消失点または無限遠点とも呼ばれます)を表すことができます。同様に、遠方平面を無限遠点に配置する射影行列を設定することは完全に実用的です。

これを行う簡単な方法は、次のように、象限ごとに1つの三角形を使用することです。

vertices [x,y,z,w], for drawing an (x,y) coordinate plane, at (z==0):
  0: [ 0, 0, 0, 1 ]
  1: [ 1, 0, 0, 0 ]
  2: [ 0, 1, 0, 0 ]
  3: [-1, 0, 0, 0 ]
  4: [ 0,-1, 0, 0 ]

draw 4 triangles using indices:
  (0,1,2); (0,2,3); (0,3,4); (0,4,1)

テストパターン(無限のチェッカーボードなど)が必要な場合は、三角形を無限に伸ばすと標準のテクスチャが歪むという事実に対処する必要があります。ただし、 (歪んだ)テクスチャ座標を完全に無視して、実際の3Dポイントに基づいて(つまり、ワールドスペース座標を使用して)色を決定するピクセルシェーダーを作成できますxy(x,y,z)

(チェッカーボードの場合)パリティに基づいて2つの一定の色から選択するか、選択した座標の小数部分に基づいてテクスチャをサンプリングしてテクスチャを並べて表示することができます。


OpenGLのクリップスペースは、x、y、zのそれぞれで[-1..1]であることに注意してください。クリップ距離が際限なく増加する限り、限界を評価することにより、適切な投影行列を計算できます。f

clip coords: [x]  =  [ n/r             ]  * view coords [x]
             [y]     [     n/t         ]                [y]
             [z]     [          -1 -2n ]                [z]
             [w]     [          -1   0 ]                [w]

ここで(リンクのように): nはニアクリップ平面であり、ニアクリップ平面でrの錐台幅の半分であり、ニアクリップ平面でtの錐台高さの半分です。

私は上記のマトリックスをテストしていないので、あなたがそれに対して支払った価値があります。また、無限大に近づくと、深度値の精度が失われることに注意してください...

ただし、近距離での精度は問題ない可能性があります。たとえば、任意の距離で、(近:無限)の場合の深度分解能は、(近:遠)比が(1:10)。

于 2012-10-19T00:24:29.117 に答える
3

側面と上下、および近距離と遠距離の4つのクリップ平面から構築されたキャップ付きピラミッドである表示錐台は「無限」です(無限ではありませんが、外側には何も見えないため)錐台、それは可能な限り無限です)。

したがって、キャップされたピラミッド(4つまたは2つの三角形)の下側を描画すると、地平線に向かって「無限」の平面になります。または、そのことについては、コーナーポイントがニアプレーンとファープレーンにあるクワッド

于 2012-10-18T23:44:49.900 に答える