OpenGL和X-Window系统坐标映射

问题描述 投票:0回答:1

OpenGL的“屏幕空间坐标系”的原点在左下方(这也是opengl内存中像素的第0个索引)。根据https://tronche.com/gui/x/xlib/introduction/overview.html,在Linux中渲染为默认帧缓冲区时,原点位于左上方。映射如何工作?是opengl屏幕空间的0,0映射到X窗口系统的0,0(不需要翻转吗?)还是0,opengl屏幕空间的高度映射到x窗口系统的0,0(这意味着需要y-flip发生)?在整个提示线上发生翻转的位置(如果实际上发生了翻转)

opengl x11
1个回答
0
投票

仅涉及约定。没有正在进行的“花哨”映射,只是归结为对用于在帧缓冲区中生成地址的约定进行签名。大多数图形硬件在那里,地址从左上角开始在像素行中,快速运行索引(通常表示为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和Windowing System的约定保持一致,由驾驶员填写在窗帘的后面。

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