【问题标题】:Why doesn't Vulkan use the "standard cartesian" coordinate system?为什么 Vulkan 不使用“标准笛卡尔”坐标系?
【发布时间】:2017-12-30 17:48:08
【问题描述】:

Vulkan 使用坐标系,其中 (-1, -1) 位于左上象限,而不是像在学校学习的标准笛卡尔坐标系中的左下象限。所以 (-1, 1) 位于 Vulkan 坐标系的左下象限。

(图片来自:http://vulkano.rs/guide/vertex-input

使用 Vulkan 的坐标系有什么好处?我可以看到的一个明显优势是教学法:它迫使人们意识到坐标系是任意的,并且可以轻松地在它们之间进行映射。但是,我怀疑这是设计原因。

那么选择这个设计的原因是什么?

【问题讨论】:

  • 我对 Vulkan 不太熟悉,但是屏幕坐标的原点通常是左上角。虽然 (-1, -1) 是不寻常的 (IMO),但看起来 Vulkan 正在使用类似于单位向量(或在本例中为单位矩形)的东西。为什么要这样做?这是一个很好的问题,这就是为什么这是评论而不是答案。 :)
  • @TriskalJM 我想我最初以一种令人困惑的方式写了这个问题,因为 (-1, 1) 不是左上角,而是在左上象限。这更有意义吗?
  • 好的,所以原点在中心,正x指向下,正y指向右?他们希望原点位于中心(这是有道理的),然后他们保留了传统的向下和向右方法对屏幕坐标为正。
  • @TriskalJM 实际上,现在我不确定,也许它是您首先描述的单位矩形系统。我仍然只是学习 Vulkan,所以我还不是很确定。无论如何,我提供了我正在阅读的指南中的图片。
  • 点赞,因为能抓住我典型的“陷阱”之一。

标签: coordinate-systems vulkan


【解决方案1】:

计算机图形学中的许多坐标系将原点放在左上角,并将 y 轴指向下方。

这是因为在早期的电视和显示器中,绘制图片的电子束从屏幕的左上角开始向下移动。

屏幕上的像素通常是通过在电子束沿屏幕向下移动时读取顺序地址中的内存,并根据顺序读取的每个字节调制该电子束来制作的。所以y轴对应时间,对应内存地址。

即使在今天,几乎所有位图在内存或位图文件中的表示都从左上角开始。

在这样的介质中绘制位图时,使用从左上角开始的坐标系也是很自然的。

当您使用左下角原点时,事情会变得有点复杂,因为找到对应于像素的字节需要更多的数学运算,并且需要考虑位图的高度。通常没有理由引入额外的复杂性。

但是,当您开始引入矩阵变换时,使用向上指向的 y 轴会变得更加方便,因为这样您就可以使用您在学校学习的所有向量代数,而无需反转 y 轴和所有在你的思想中旋转。

因此,您通常会发现,当您在一个允许您进行矩阵运算、平移、旋转等操作的系统中工作时,您将拥有一个向上的 y 轴。然而,在内部深处的某个点,计算会将坐标转换为向下指向的 y 轴以进行低级操作。

【讨论】:

  • 如果必须使用矩阵变换将 up-y 坐标转换为 down-y 坐标,那么速度不会有显着损失,只是为了在变换之后撤消(通过逆变换) ?一开始就不要转换成上-y坐标,并接受必须处理下-y坐标的教学不便,不是更好吗?
  • 矩阵变换的好处是你可以将任意数量的它们折叠成一个矩阵,并且总是有 some 矩阵,所以你可以应用任何变换完全不影响性能。
  • @user89 我使用了新的 OpenGL 4.5 功能,使左上角 (-1, -1) 像 Vulkan,而不是典型的 (-1, 1) OpenGL。这样做之后,一切都颠倒了,但如果你将投影矩阵中 Y 分量的第二个元素乘以 -1,一切都会变得正常。所以换句话说,性能方面应该是完全一样的。
  • 坐标系向上为 +y 并没有固有的优势。所有相同的向量/矩阵数学应用完全相同。重要的是它是否是“右手”坐标系(+z 相对于 +x 和 +y 的方向)。 OpenGL 和 Vulkan 都是右手坐标系,我倾向于认为 Vulkan 更有意义,因为它遵循图像存储和屏幕坐标的约定,并且 +z 进入屏幕。
【解决方案2】:

OpenGL 中常见的混淆和错误来源之一是 NDC 和窗口坐标的 y 向上增加,这与几乎所有窗口系统和许多(但不是全部)图像格式中使用的约定相反,其中 y 是[0..1] 向下增加。在许多情况下,开发人员最终不得不在他们的转换管道中插入一个 y-flip,而且并不总是很清楚他们什么时候做了,什么时候没有。

因此 Vulkan 决定这样做,以便您可以将图像从 y 向下的图像格式直接加载到内存中,并将其绘制到屏幕上,而无需任何显式的 y 翻转,以避免这种错误来源。

然后选择其他坐标系以与之保持一致,因为在标准 Vulkan 转换管道中 y 方向从不翻转方向。这意味着剪辑空间顶点坐标也有 y 向下增加。

这最终意味着 Vulkan 剪辑坐标与 D3D 剪辑坐标的方向不同,这对于同时支持这两种 API 的开发人员来说是一个烦恼。因此,VK_KHR_maintenance1 扩展增加了指定负视口高度的能力,这实质上将 y 翻转引入到剪辑空间到帧缓冲区坐标变换。 (D3D 在这里基本上总是有一个隐式的 y 翻转。)

无论如何,这就是我记得 Vulkan 工作组中的推理方式。我认为任何地方都没有权威的公共资源。

【讨论】:

  • 我不确定这是否是部分原因,但 OpenGL 默认采用右手世界坐标,但是一旦乘以投影矩阵,坐标就会变成左手(x 是对,z 进入屏幕,y 向上)。让 Y 下降会使坐标再次成为右手坐标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多