为什么Vulkan不使用“标准笛卡尔”坐标系?

9

Vulkan使用的坐标系将(-1,-1)放在左上象限,而不是学校里通常学习的标准笛卡尔坐标系中的左下象限。因此,在Vulkan的坐标系中,(-1,1)位于左下象限。

Image from: http://vulkano.rs/guide/vertex-input

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

使用Vulkan的坐标系有哪些优势?其中一个明显的优点是教育意义上的:它迫使人们意识到坐标系是任意的,而且可以轻松地在它们之间进行映射。然而,我怀疑这不是设计原因。

那么为什么会选择这种设计呢?


我对Vulkan不是很熟悉,但屏幕坐标的原点通常在左上角。虽然(-1,-1)这个值比较不寻常(在我看来),但看起来Vulkan使用了类似于单位向量(或在这种情况下,单位矩形)的东西。为什么这样做?这是一个好问题,这也是为什么这是一条评论而不是答案的原因。 :) - TriskalJM
@TriskalJM 我觉得我最初的问题表述有点混乱,因为(-1,1)不是左上角,而是在左上象限。这样更有意义吗? - bzm3r
1
好的,所以原点在中心,正x指向下,正y指向右边?他们希望原点位于中心(这很有道理),然后保留了屏幕坐标中向下和向右为正的传统方法。 - TriskalJM
@TriskalJM,其实现在我也不确定,也许是你最先描述的单位矩形系统。我仍在学习Vulkan,所以还不是很确定。无论如何,我提供了一张我正在阅读指南的图片。 - bzm3r
点赞因为好抓住了我的一个典型“陷阱”。 - Bobbi Bennett
显示剩余4条评论
2个回答

16

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

这是因为早期的电视和监视器中,绘制图像的电子束从屏幕的左上角开始逐渐向下移动。

屏幕上的像素通常是通过按顺序读取内存地址来制作的,随着电子束向下移动,将每个顺序读取的字节调制电子束。 因此,y轴对应于时间,而时间对应于内存地址。

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

在这样的媒介中绘制位图时,使用从左上角开始的坐标系统是自然的选择。

当您使用底部左侧的原点时,查找与像素相对应的字节需要进行更多计算,并且需要考虑位图的高度。 通常没有理由引入额外的复杂性。

然而,当您开始引入矩阵变换时,使用朝上的y轴会更加方便,因为这样可以让您使用在学校里学到的所有向量代数,而无需反转y轴和思考中的所有旋转。

因此,通常情况下,当您在一个可以进行矩阵运算、平移、旋转等操作的系统中工作时,将会有一个朝上的y轴。 然而,在深层次的运算中,坐标将被转化为朝下的y轴。


如果必须使用矩阵变换将上Y坐标转换为下Y坐标,然后再通过逆变换撤销该变换,那么速度会大大降低,这是不是很明显呢?在第一次转换时不将坐标转换为上Y坐标,而接受处理下Y坐标的教学不便,这样做是否更好呢? - bzm3r
4
矩阵变换的好处在于,您可以将任意数量的它们折叠成一个单独的矩阵,并且总是有某个矩阵存在,因此您可以应用任何所需的变换而不会影响性能。 - Matt Timmermans
@user89 我使用了新的OpenGL 4.5功能,使左上角(-1, -1)像Vulkan一样,而不是典型的OpenGL (-1, 1)。这样做后,所有东西都出现了颠倒,但如果你将投影矩阵中Y分量的第二个元素乘以-1,一切就会变得正常。因此,从性能上讲,它应该完全相同。 - Zebrafish
1
一个将上方作为+y轴的坐标系统并没有固有的优势。所有的向量/矩阵数学都完全适用。真正有影响的是它是否是“右手”坐标系(+z相对于+x和+y的方向)。OpenGL和Vulkan都是右手坐标系,我倾向于认为Vulkan更有道理,因为它遵循图像存储和屏幕坐标的惯例,并将+z指向屏幕内部。 - Jonathan Olson

12

OpenGL中一个常见的问题是NDC和窗口坐标系中y坐标向上增加,与几乎所有窗口系统和许多(但不是全部)图像格式使用的约定相反,其中y坐标在[0..1]范围内向下递增。开发人员最终不得不在许多情况下在其转换流水线中插入y翻转,并且并不总是清楚他们何时需要这样做。

因此,Vulkan决定使从y向下的图像格式直接加载到内存并将其绘制到屏幕上而无需任何显式y翻转,以避免此类错误。

其他坐标系也被选择为与之一致,即在标准Vulkan转换流水线中,y方向永远不会翻转方向。这意味着剪辑空间顶点坐标也具有向下增加的y。

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

无论如何,这就是我记得Vulkan工作组的推理方式。我不认为有任何权威的公开来源。


我不确定这是否是原因的一部分,但是OpenGL默认假定右手世界坐标,但是一旦乘以投影矩阵,坐标就变成了左手坐标系(x为右,z进入屏幕,y为上),将Y向下使坐标再次成为右手坐标系。 - Zebrafish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接