なぜzで割るために4番目の座標が必要なのですか?


12

私はここで応答を読みました:

グラフィックスカードは、ベクトルの4番目の要素を最終位置として何をしますか?

「4番目のコンポーネントは、透視投影を追跡するためのトリックです。透視投影を行うとき、zで除算する必要があります。x '= x / z、y' = y / zですが、これは操作ではありませんx、y、zのベクトルで動作する3x3行列で実装できます。これを行うための標準になったトリックは、4番目の座標wを追加し、x、y、zが常にwで除算されることを宣言することですすべての変換が適用された後、ラスタライズ前。

しかし、3x3マトリックスを使用してzで除算できない理由を理解できませんでした。

ただ掛けることはできません

1/z 0 0
0 1/z 0
0 0 1/z

取得するため [x/z y/z 1]


チェーンのどこかに翻訳を含む変換(または変換の構成)を表現してみてください。w値がないと、単一の行列で表現できません。
DMGregory

翻訳部分は理解していますが、4番目の座標の追加がzで割る

あなたが言ったことを完全に行うことができるのはあなたにとって価値があることです。xとyをzで除算することは、遠くのオブジェクトが小さくなる投影を使用して、3D座標から2Dスクリーン空間に変換するための有効な方法です。wは、平行移動できるように4番目の次元まで取得するための同次座標です。
アランウルフ

回答:


14

あなただけ分けた場合ので[x, y, z]によってzあなたが得る[x/z, y/z, 1]、あなたが実際の値が失わzあなたが近い/遠い平面クリッピングを行うか、Zバッファを埋めるためにしたい場合は、実際に有用です。

そのためz、少なくともGPUでいくつかの情報を保持する最良の方法は、3ではなく4つのコンポーネントを使用することです。実際には、遠近法の分割前の最後の2つのベクトルコンポーネントに実際にあるものは、投影法と効果の種類によって異なります欲しいです。

たとえば、透視投影の場合、これは結果の4成分ベクトルです。

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

遠近分割後、ベクトルは次のようになります。

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

そして、このc + d/z部分はZバッファーを満たすのに十分な情報を残します。


XとYのみをZで除算して、[x / z、y / z、z]を生成できます。GPUはありません持っているベクトル部門を行うには、どんな計算を行うために設計されている可能性があります。
user253751

3

技術的には、あなたそれを行うことができます。しかし、なぜわざわざ?最終版が完成するまでにz、次のいずれかを実行できます。

  • 説明したように3x3行列を構築し、9 * sizeof(float)スペースのバイトを浪費し、計算にサイクルを費やして1/z(1除算)、9回の乗算と6回の加算を行って最終頂点を取得するまたは
  • 現在のパイプラインが現在行っているように、3つの部門を行うことができます

これらの1つは私にとってはるかに最適なようであり、最初のものではありません。マトリックス乗算用に最適化されたハードウェアが存在する場合でも、それは確かにそうですが、単純な除算よりも概念的に複雑です。

さらに、3x3マトリックスは変換をエンコードできないため、4x4マトリックス(したがって4番目のw座標)はパイプラインの初期段階で使用されます。つまり、その4番目のコンポーネントが既にそこにあるので、それを使用して有用な値を転送し、それを使用して分割を行うことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.