正交光栅化中的近/远平面和z

时间:2015-10-26 09:15:11

标签: opengl opengl-3 opengl-4

我编写了很多着色器,但我偶然发现了以前从未意识到的东西。

我需要一个带有简单正投影的顶点+片段着色器,没有深度测试。

相机与原点Z对齐。

我禁用了GL_DEPTH_TEST,并屏蔽了深度写入。这很简单,我决定我甚至不需要投影矩阵。在我的完全无知和独创性中,我认为对于任何三角形顶点,顶点着色器只会将x,y(,z = <whatever>,w = 1)传递给片段着色器。

我实际上认为片段着色器只需要x,y坐标,因为我们正在谈论正交投影,w = 1(没有透视分割),并且由于深度缓冲是无用的,并且深度写入被禁用,z可以字面上是任何,无所谓。

当然我错了。我很快发现光栅化器使用了z组件,事实上,我有很多三角形,根本就没有光栅化。

我还发现调整z组件会大大改变渲染的三角形。所以我实现了一个常规的正交投影矩阵,这当然解决了这个问题,现在一切都被光栅化了。

现在,出于纯粹的好奇心,我开始玩一个正交投影矩阵,看看真正为不同输入向量产生了什么,对于近和远剪裁平面有不同的值,我真的无法理解。好的,x,y和w都是预期的,但是根据我的近/远剪裁平面得到了完全不同的z值。

问题是:片段着色器对剪辑平面和投影矩阵一无所知,它只是获得了一堆x,y,z,w ...... z组件在光栅化过程中的作用是什么?怎么知道是否有东西在观看的截头体内?

我的意思是,对于正交投影矩阵中任何给定的近/远平面,我得到的z值对给定的投影矩阵有效,对其他投影矩阵无效。由于片段着色器无法知道矩阵中使用了哪些平面,它如何丢弃片段?同一个原语的每个顶点之间是否存在关系?

PS:我知道甚至没有调用片段着色器,因为我设置了一个SSBO +原子计数器并检查了它们都没有改变。

1 个答案:

答案 0 :(得分:2)

顶点着色器将顶点从模型局部坐标系转换为剪辑空间。如果您的坐标在透视分割后超过单位立方体(每个维度的[-1; 1]大小的立方体,或者分割前的[-W; W]),则会剪切此片段。

如果您不关心Z并且真的不想设置正确的正投影(例如,您不知道Z值范围,因此无法设置合适的剪裁平面),您可以更正顶点着色器中的Z通过将其钳制到(-W; W)范围(或仅将其设置为0)。