OpenGL 渲染 - window 超出屏幕

OpenGL rendering - a window out ot the screen

当我绘制一个三角形并且该图元的一部分(或全部)放置在查看体积之外时,OpenGL 执行裁剪(在光栅化之前)。例如,此处描述的是:link 当 window 的一部分放置在屏幕(监视器)之外时会发生什么情况?如果我使用合成 window 管理器(在 linux 上,例如 compiz)并且整个 OpenGL window 被放置在虚拟桌面(例如立方体的墙)上,会发生什么可见的 ?该 OpenGL 应用程序中发生了什么?有没有GPU使用?将 window 的内容重定向到屏幕外像素图怎么样?

When I draw a triangle and part (or whole) of that primitive is placed outside a viewing volume OpenGL performs clipping (before rasterization).

裁剪是一种几何操作。说到光栅化,一切都发生在像素级别。

这一切都归结为像素所有权。

在一个普通的、非复合的 windowing 系统中,所有 windows 共享同一个屏幕帧缓冲区。每个 window 是屏幕帧缓冲区中的 window(偏移量 + 大小)。当事物被绘制到 window 时,使用或不使用 OpenGL,对于每个像素,它都会测试帧缓冲区的这个像素是否实际上属于 window;如果其他一些逻辑(和可见)window 在前面,像素所有权测试将对这些像素失败并且不会在那里绘制任何内容(这样前面的 window 就不会被透支)。这就是为什么在一个普通的、未合成的环境中,你可以 "screenshot" windows 用 glReadPixels 覆盖你的 OpenGL window,因为实际上交给 OpenGL 的那部分帧缓冲区实际上属于另一个 window , 但 OpenGL 不知道这一点。

同样,如果 window 部分或完全移出屏幕,屏幕外的像素将无法通过像素所有权测试,并且不会在那里绘制任何内容。

What happens if I use compositing window manager

然后每个 window 都有自己的帧缓冲区,它完全拥有。像素所有权测试永远不会失败。剩下的你们自己想。

What happenns in that OpenGL application?

对于 OpenGL,光栅化时所有像素似乎都通过了所有权测试。就是这样。

Is there any GPU usage?

像素所有权测试非常重要,甚至在出现 GPU 之前很久,第一代显卡就具有实现像素所有权测试所需的功能。该功能易于实现和硬连线,因此在这方面没有区别。

然而,未通过测试的像素越多,即未被触摸,GPU 在光栅化阶段的工作就越少,渲染吞吐量实际上会增加,如果 window 在非合成环境中被遮挡或部分移出屏幕。