Vulkan使用的坐标系将(-1,-1)放在左上象限,而不是学校里通常学习的标准笛卡尔坐标系中的左下象限。因此,在Vulkan的坐标系中,(-1,1)位于左下象限。
(图片来自:http://vulkano.rs/guide/vertex-input)
使用Vulkan的坐标系有哪些优势?其中一个明显的优点是教育意义上的:它迫使人们意识到坐标系是任意的,而且可以轻松地在它们之间进行映射。然而,我怀疑这不是设计原因。
那么为什么会选择这种设计呢?
Vulkan使用的坐标系将(-1,-1)放在左上象限,而不是学校里通常学习的标准笛卡尔坐标系中的左下象限。因此,在Vulkan的坐标系中,(-1,1)位于左下象限。
(图片来自:http://vulkano.rs/guide/vertex-input)
使用Vulkan的坐标系有哪些优势?其中一个明显的优点是教育意义上的:它迫使人们意识到坐标系是任意的,而且可以轻松地在它们之间进行映射。然而,我怀疑这不是设计原因。
那么为什么会选择这种设计呢?
在计算机图形学中,许多坐标系将原点放置在左上角,并将y轴指向下方。
这是因为早期的电视和监视器中,绘制图像的电子束从屏幕的左上角开始逐渐向下移动。
屏幕上的像素通常是通过按顺序读取内存地址来制作的,随着电子束向下移动,将每个顺序读取的字节调制电子束。 因此,y轴对应于时间,而时间对应于内存地址。
即使到今天,内存中或位图文件中的几乎所有位图表示都从左上角开始。
在这样的媒介中绘制位图时,使用从左上角开始的坐标系统是自然的选择。
当您使用底部左侧的原点时,查找与像素相对应的字节需要进行更多计算,并且需要考虑位图的高度。 通常没有理由引入额外的复杂性。
然而,当您开始引入矩阵变换时,使用朝上的y轴会更加方便,因为这样可以让您使用在学校里学到的所有向量代数,而无需反转y轴和思考中的所有旋转。
因此,通常情况下,当您在一个可以进行矩阵运算、平移、旋转等操作的系统中工作时,将会有一个朝上的y轴。 然而,在深层次的运算中,坐标将被转化为朝下的y轴。
OpenGL中一个常见的问题是NDC和窗口坐标系中y坐标向上增加,与几乎所有窗口系统和许多(但不是全部)图像格式使用的约定相反,其中y坐标在[0..1]范围内向下递增。开发人员最终不得不在许多情况下在其转换流水线中插入y翻转,并且并不总是清楚他们何时需要这样做。
因此,Vulkan决定使从y向下的图像格式直接加载到内存并将其绘制到屏幕上而无需任何显式y翻转,以避免此类错误。
其他坐标系也被选择为与之一致,即在标准Vulkan转换流水线中,y方向永远不会翻转方向。这意味着剪辑空间顶点坐标也具有向下增加的y。
这最终意味着Vulkan剪辑坐标具有与D3D剪辑坐标不同的方向,这对于支持两个API的开发人员来说是一个麻烦。因此,VK_KHR_maintenance1扩展添加了指定负视口高度的功能,这基本上引入了一个y翻转,将剪辑空间转换为帧缓冲区坐标。 (D3D在这里基本上总是有一个隐式的y翻转。)
无论如何,这就是我记得Vulkan工作组的推理方式。我不认为有任何权威的公开来源。