直角光栅化中的近/远平面和z



我编写了大量的着色器,但我无意中发现了一些我以前从未意识到的东西。

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

相机与原点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;1],或分割前的大小为[-W;W]),则该片段将被剪切。

如果你不关心Z,真的不想设置正确的正射影(例如,你不知道Z值的范围,因此无法设置适当的剪辑平面),你可以通过将顶点着色器中的Z夹紧到(-W;

相关内容

  • 没有找到相关文章