opengl - 裁剪与像素所有权测试 opengl

标签 opengl opengl-es

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

最佳答案

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

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

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

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

关于opengl - 裁剪与像素所有权测试 opengl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29515629/

相关文章:

c - 正确使用 gluLookAt()?

java - OpenGL Z 索引问题?

python - 如何使用 opengl 和 pyglet 设置裁剪平面

android - 如何在 Android 上使用基于 GLES30 的 glreadpixels 从特定缓冲区读取数据

android - 如何学习和使用OpenGL ES 2.0?我只是不明白-严重的Qn。

opengl - 这些 ' undefined reference to __glut*WithExit ' OpenGL 链接器错误的含义是什么?

c++ - 带有 GLUT 的 OpenGL。不是绘图?

iPhone 游戏开发者 - 你们的工具链是什么样的?

c++ - 使用客户端顶点数组在没有 VBO 的情况下在 opengl 3.1+ 中呈现

opengl-es - 无法让 OpenGL 代码正常工作