当我绘制一个三角形并且该原语的一部分(或整个)被放置在查看体积之外时,OpenGL执行剪切(在光栅化之前)。例如,这里描述了这一点:link当窗口的一部分放在屏幕(监视器)外面时会发生什么?如果我使用合成窗口管理器(在Linux上,例如compiz)并且整个OpenGL窗口被放置在虚拟桌面(例如立方体的墙壁)上,这是不可见的,会发生什么? OpenGL应用程序中发生了什么?有没有GPU使用?如何将该窗口的内容重定向到屏幕外像素图?
答案 0 :(得分:2)
当我绘制一个三角形并且该原语的一部分(或整个)被放置在查看体积之外时,OpenGL执行剪切(在光栅化之前)。
剪切是一种几何操作。在光栅化方面,一切都发生在像素级别上。
这一切都取决于Pixel Ownership。
在普通的非合成窗口系统中,所有窗口共享同一个屏幕帧缓冲区。每个窗口都是一个窗口(偏移+大小)进入屏幕帧缓冲区。当事物被绘制到窗口时,是否使用OpenGL,对于每个像素,如果帧缓冲区的这个像素实际上属于窗口,则测试它;如果其他一些逻辑(和可见)窗口在前面,像素所有权测试将失败,这些像素并没有在那里被绘制(所以前面的窗口不会被透支)。这就是为什么在一个简单,没有复杂的环境中,你可以用glReadPixels“截取”覆盖你的OpenGL窗口的窗口,因为有效地传递给OpenGL的帧缓冲区实际上属于另一个窗口,但OpenGL不知道这一点。
同样,如果窗口部分或完全移出屏幕,屏幕外像素将无法通过像素所有权测试,并且不会在那里绘制任何内容。
如果我使用合成窗口管理器
会发生什么
然后每个窗口都有自己的帧缓冲区,它完全拥有它。 Pixel Ownership测试永远不会失败。你想到了其余部分。
OpenGL应用程序中发生了什么?
对于OpenGL,在栅格化时,所有像素都会通过所有权测试。就是这样。
有没有使用GPU?
像素所有权测试非常重要,即使在有GPU之前,第一代显卡确实具有实现像素所有权测试所需的功能。该功能易于实现和硬连线,因此在这方面没有区别。
然而,更多像素失败测试,即没有触摸,GPU在光栅化阶段工作的越少,如果窗口被遮挡或部分移动,渲染吞吐量实际上会增加 - 屏幕在非合成环境中。