【问题标题】:OpenGL and X-Window system coordinate mappingOpenGL 和 X-Window 系统坐标映射
【发布时间】:2020-05-16 09:38:14
【问题描述】:

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

【问题讨论】:

    标签: opengl x11


    【解决方案1】:

    这只是关于约定。没有进行“花哨”的映射,它只是归结为用于将地址生成到帧缓冲区中的签名约定。大多数图形硬件,从左上角开始按像素行排列地址,快速运行的索引(通常表示为 x)向右,而慢速运行的索引(通常表示为 y)向下。

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

    使用 OpenGL 将原点放置在左下方,所发生的只是 y 坐标的符号被翻转,窗口高度被添加为偏移量。所以计算变成了(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 和正在使用的窗口系统的约定保持一致,由驱动程序在窗帘后面填写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2011-03-03
      相关资源
      最近更新 更多