裁剪与像素所有权测试 opengl

clipping vs pixel ownership test opengl

当顶点着色器完成它的工作后,就会进入图元组装阶段。在 Primitive Assembly 阶段进行裁剪。然后在几个阶段之后是 Fragment Shader,然后是 Per-Fragment 操作。第一个操作是像素所有权测试,如果我们已经根据视口裁剪了图元,我不明白为什么我们需要它。

图元及其所有点被裁剪在一起。因此,自然地,如果您的图元被裁剪,它甚至不会进入 Per-Fragment 处理器。如果一个图元只有一个点被剔除(例如因为它在屏幕外,或者在远 z 平面后面),这并不意味着整个图元都被剔除。您仍然可以观察到该图元的一部分,因此它仍然会被渲染。你可以观察到,如果你曾经对一个遥远的平面多边形玩过移动 z 剔除,几乎没有在边界上。旋转相机时,您可以看到并不是整个多边形都消失了 - 只有它的边缘在您移动相机时消失了。

另一方面,Pixel Ownership Test 是决定是否需要更改屏幕上给定像素组的测试。这是光栅化的第一步。

This test also allows the window system to control the GL's behavior, for instance, when a GL window is obscured.

阅读更多here

像素所有权的目的不是剪掉 window/viewport 之外的图元。根据管道定义,顶点和片段着色器之间确实发生了这种情况,大约在执行图元组装和光栅化的时候。

像素所有权测试用于消除基本上位于 window 矩形内但在屏幕上不可见的像素。可能发生这种情况的常见情况是,如果您的 window 被另一个 window 部分覆盖,或者您的 window 超出了显示屏的边缘。

只有当应用程序直接渲染到帧缓冲区时,像素所有权测试才会真正发挥作用。我认为这在现代 window 系统中不再常见。您的应用程序通常会渲染到屏幕外缓冲区,然后有一个合成步骤根据它们的相对位置、堆叠顺序等组合 windows。您仍然可以直接渲染到帧缓冲区的唯一时间是在全屏模式下。

要记住的另一个方面是规范描述了 OpenGL 实现的行为方式。这并不意味着每个实现实际上都必须完全按照规范中描述的顺序执行各个步骤。只要它 表现得好像 它按该顺序执行了这些步骤,它仍然是合规的。例如,如果一个实现可以在片段着色器之前执行像素所有权测试,那么只要最终结果不变,它就可以完全自由地这样做。实际上,在 "per-fragment operations" 部分 之前 片段着色器执行一些测试以提高效率是很常见的。