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

问题描述 投票:6回答:2

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

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

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

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

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

coordinate-systems vulkan
2个回答
8
投票

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

这是因为在早期的电视和监视器中,绘制图像的电子束从屏幕的左上方开始并向下进行。

当光束向下移动到屏幕上时,屏幕上的像素通常是通过读取顺序地址中的存储器来制作的,并且根据按顺序读取的每个字节来调制该电子束。因此y轴对应于时间,其对应于存储器地址。

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

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

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

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

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


7
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.