OpenGL和X-Window系统坐标映射

OpenGL and X-Window system coordinate mapping

OpenGL 的 "screen space coordinate system" 原点在左下方(这也是 opengl 内存中像素的第 0 个索引)。当渲染到 linux 中的默认帧缓冲区时,根据 https://tronche.com/gui/x/xlib/introduction/overview.html,原点在左上角。映射如何工作?是 0,0 的 opengl 屏幕 space 映射到 0,0 的 X window 系统(不需要翻转?)或者是 0,opengl 屏幕的高度 space 映射到 0,0 的x-window 系统(这意味着需要在某处进行 y 翻转)?沿着整个管道发生翻转的地方(如果它真的发生了)

一切都是为了约定俗成。没有进行 "fancy" 映射,它只是归结为用于将地址生成到帧缓冲区中的符号约定。大多数图形硬件,从左上角开始按像素行排列,快速 运行 索引(通常表示为 x)向右移动,而慢速 运行 索引(通常表示为 y)向下。

所以位置 (x,y) 处的像素地址是 y*row_stride + x

OpenGL 将原点置于左下方,所发生的只是翻转 y 坐标的符号,并添加 window 高度作为偏移量。所以计算就变成了(height - y)*row_stride + x.

一般来说,地址生成电路将其概括为

 address = (off_y + sign_y*y)*row_stride + off_x + sign_x*x

然后由图形驱动程序在绘图操作开始之前将配置寄存器设置为正确的值。

或者更确切地说,对于现代 GPU,这些设置是视口和剪刀矩形配置命令的一部分,它们是命令缓冲区中命令流的一部分。您在 OpenGL 中看不到这一点,但是如果您对 Vulkan(或 Metal 或 DX12)有点熟悉,这会使这些东西变得明确,当您使用 vkCmdBeginRenderPass 开始渲染过程时,命令的一部分是添加到命令缓冲区的是设置那些寻址参数; 偏移量和符号的正确值,以便 Vulkan 和正在使用的窗口系统的约定保持一致,由驱动程序在幕后填写。