標準のラスタライズパイプラインを使用して、無限平面を描画できます。使用する同次座標は、通常のユークリッド点と同じように「理想的な」点(消失点または無限遠点とも呼ばれます)を表すことができます。同様に、遠方平面を無限遠点に配置する射影行列を設定することは完全に実用的です。
これを行う簡単な方法は、次のように、象限ごとに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ポイントに基づいて(つまり、ワールドスペース座標を使用して)色を決定するピクセルシェーダーを作成できますx
。y
(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)。