为什么我们需要第四个坐标除以z?


12

我在这里阅读回复:

图形卡将向量的第四个元素作为最终位置怎么办?

“第四个组件是跟踪透视投影的技巧。进行透视投影时,您希望除以z:x'= x / z,y'= y / z,但这并不是可以通过对x,y,z的向量进行运算的3x3矩阵来实现。为此,标准的技巧是添加第四个坐标w,并声明x,y,z总是除以w在应用了所有转换之后以及在栅格化之前。”

但是我不明白为什么我们不能使用3x3矩阵除以z?

我们不能乘以

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

要得到 [x/z y/z 1]


尝试表达一个包括链中某处的翻译的转换(或转换的组成)。没有aw值,您将无法在单个矩阵中表达它。
DMGregory

我确实了解翻译部分,但我只是不明白添加第四个坐标将如何帮助或者是除以z的技巧

对于您值得的一切,您完全可以按照您所说的去做。将x和y除以z是一种有效的方法,可以通过投影将3d坐标转换为2d屏幕空间,其中远处的物体会变小。w是一个齐次坐标,可以将其带到第四维以进行平移。
艾伦·沃尔夫

Answers:


14

因为如果你只划分[x, y, z]z[x/z, y/z, 1]和你失去了实际价值z,如果你想要做的远/近平面裁剪或填充Z缓冲这实际上是有用的。

因此z,至少在GPU上保留一些信息的最好方法是使用4个组件而不是3个组件。实际上,在进行透视划分之前,最后两个向量组件中的实际内容取决于您的投影类型和效果想。

例如,在透视投影的情况下,这是所得的四分量向量:

| 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(一个除法),然后进行九次乘法和六次加法来获得最终顶点,或者
  • 您可以将其划分为三个部分,就像现代管道目前所做的那样

其中一个对我来说似乎更为理想,这不是第一个。即使存在矩阵乘法的优化硬件,正如它肯定会做到的那样,从概念上讲,它仍然比简单的除法复杂。

另外,一个3×3矩阵可以不编码翻译等4x4矩阵(以及因此的第四w坐标)被用于前面在管道无论如何。这意味着您已经有了第四个组成部分,因此您也可以使用它来传递有用的价值并进行细分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.