1

http://www.opengl.org/wiki/Rendering_Pipeline_Overview说在几何着色器运行之后和片段被光栅化之前,“位于观察体内部和外部之间边界上的图元被分成几个图元”。我读过的关于 OpenGL 的所有其他内容也以同样的方式描述了裁剪过程。但是,通过将片段着色器中的 gl_FragDepth 设置为比生成它的三角形上的点的实际深度更接近相机的值(以便片段通过深度测试,而如果我复制固定 -管道功能),我发现即使它部分与远视平面重叠,也会为整个原始三角形生成片段。另一方面,如果所有顶点都在平面后面,

这里发生了什么?我的几何着色器是否替换了一些默认功能?是否有我需要设置的标志/提示或需要写入的其他内置变量,以便渲染管道的下一步知道如何进行部分剪辑?

我在 NVIDIA GeForce 9400M 上使用带有 GL_EXT_geometry_shader4 扩展的 GLSL 1.2 版。

4

2 回答 2

1

这听起来像一个驱动程序错误。如果您可以看到应该在查看区域之外的片段的结果(即:如果关闭深度写入会导致片段完全消失),那么这违反了规范的行为。

当然,这是一个极端的案例,我怀疑有人会对此采取任何行动。

大多数图形硬件都尽可能避免实际剪裁三角形。裁剪三角形意味着可能从单个三角形生成 3 个以上的三角形。这往往会阻塞管道(无论如何都是预先镶嵌)。因此,除非三角形可以轻易拒绝(即:在剪辑框之外)或非常大,否则现代 GPU 只会忽略它。他们让片段剔除硬件来处理它。

在这种情况下,因为您的片段着色器是一个深度写入着色器,它认为它不能拒绝这些片段,直到您的片段着色器完成。


注意:我意识到,如果您打开深度钳制,则会完全关闭近处和远方裁剪。这可能是你想要的。从片段着色器写入的深度值被限制在当前的glDepthRange.

深度钳制是 OpenGL 3.2 的一项功能,但 NVIDIA 已通过 NV_depth_clamp 支持它近十年。如果您的驱动程序是最新的,即使您没有获得 3.2 兼容性上下文,您也应该能够使用 ARB_depth_clamp。

于 2011-08-02T00:48:19.720 回答
-1

如果我的理解正确,您会想知道您的三角形没有被剪裁在远平面上。
Afaik OpenGL 只是在顶点组装后对 4 个边界平面进行剪辑。在片段着色器之后完成远近剪辑(通过规范 afaik)。即,当您放大到极端并且多边形与近平面发生碰撞时,它们会被渲染到该点并且不会作为一个整体弹出。
而且我认为规范根本没有注意到分割基元(即使硬件可能会在屏幕空间中忽略碎片深度),它只是注意到作为一个整体跳过基元(在没有顶点位于视锥体中的情况下)。
同样依赖 wiki 来获取精确的单词规则总是一个坏主意。

PS: http: //fgiesen.wordpress.com/2011/07/05/a-trip-through-the-graphics-pipeline-2011-part-5/很好地解释了实际边界和近远剪辑。

于 2011-08-02T03:38:06.433 回答