剪辑与像素所有权测试opengl

时间:2015-04-08 13:11:20

标签: opengl opengl-es

当顶点着色器完成它的工作时,然后是原始组装阶段。在原始组件阶段,正在进行剪切。然后在Fragment Shader的几个阶段之后来到Per-Fragment操作。第一个操作是像素所有权测试,如果我们已经基于视口剪切了图元,我无法理解为什么我们需要。

2 个答案:

答案 0 :(得分:6)

像素所有权的目的不是剪掉窗口/视口外的基元。根据管道定义,这确实发生在顶点和片段着色器之间,在时间原始组件和光栅化的周围进行。

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

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

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

答案 1 :(得分:0)

基元与其所有点一起被剪切。因此,当然,如果您的基元被剪切,它甚至不会进入Per-Fragment处理器。如果只剔除一个基元的一个点(例如因为它在屏幕外,或在远z平面后面),这并不意味着整个基元被剔除。您仍然可以观察该原语的一部分,因此它仍然会被渲染。您可以观察到,如果您曾经使用移动的z-culling对着一个遥远的扁平多边形,几乎不在边界上。旋转相机时,您可以看到整个多边形不会消失 - 只有在移动相机时才会消失。

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

  

此测试还允许窗口系统控制GL的行为,   例如,当GL窗口被遮挡时。

了解更多here