2013-01-10 33 views
1

我想了解屏幕和逻辑之间的关系OpenGL用来决定是否应该呈现一个原语,即它是否在屏幕上。glViewport,窗口大小和剪辑

例如,假设您将视口设置为大于屏幕(没有理由这么做,但举例来说)。 OpenGL不会“知道”屏幕尺寸,所以只要正投影将它们放置在视口内,它就会“画出”屏幕上的点,是否正确?

但是,如果我将顶点位置定义在投影所确定的视口之外,OpenGL是否将其包含在渲染中?

glViewport(0,0,100,100); 
    ApplyOrtho(50,50); // custom ES 2.0 utility to apply 2D orthographic projection 

现在位置顶点(75,75)不会被OpenGL渲染,对不对?

回答

2

逻辑OpenGL的使用,以决定如果一个图元是否应该呈现

只有一个的逻辑块使OpenGL使用,以决定如果一个原语应该呈现。如果原始图像没有被剪切/剔除,那么阻止其被光栅化的唯一方法是如果用户已经禁用全部原始光栅化与glEnable(GL_RASTERIZER_DISCARD)。否则,OpenGL规范将定义所有未被剔除的基元将作为剪切的一部分进行光栅化。

现在,他们是否会产生任何明显的影响是一个不同的问题。而且由于在屏幕外的图元不能产生可见的效果(除非你使用图像加载/存储),如果需要的话,符合OpenGL的实现可以自由地剔除这些三角形。但更有可能的是,它会对它们进行光栅化处理,并简单地检查片段是否落在窗外。如果是这样,它会放弃这些碎片。

一般来说,这不应该是你应该关心的事情。只要设置一个合理的视口,你就会好起来的。

+0

有关这方面的更多技术说明,要查找的术语是“像素所有权测试”,这甚至超出简单的“在窗口范围内”测试。例如,一个封闭渲染窗口的窗口也可能会使其下方的片段失效,从而失败窗口所有权测试,然后OpenGL将丢弃这些片段。这是您在渲染到要存储的纹理或图像时应始终使用正确的屏幕外缓冲区的原因之一。 – datenwolf

+0

@datenwolf:像素所有权测试(我在写这个答案时查找了它)并不适用于窗口以外的部分视口。它仅适用于操作系统特定的不可见部分窗口条件(窗口部分不在屏幕上,或者另一窗口部分遮挡窗口等)。请注意,在呈现给FBO时,所有片段*都会传递像素所有权测试。 –

+0

据我了解,负责放弃延伸到窗口限制之外的视口片段的代码路径与像素所有权测试代码共享很多。 – datenwolf