几何着色器中的 OpenGL gl_Postion

OpenGL gl_Postion in geometry shader

提问人:BENG 提问时间:9/21/2023 更新时间:9/21/2023 访问量:39

问:

我正在将顶点从顶点着色器传递到几何着色器。我正在几何着色器中进行透视投影。我知道在片段着色器之前,OpenGL 将矢量除以组件。这是在几何着色器之前还是之后发生?如果是在之后,有没有一种快速的方法可以在不手动除以顶点着色器之前完成?gl_Positionww

编辑:现在这是我的顶点着色器的结尾。

gl_Position = proj*view*model*vPos;
gl_Position = (1.0/gl_Position.w)*gl_Position;
opengl 顶点着色器 geometry-shader

评论


答:

2赞 Nicol Bolas 9/21/2023 #1

OpenGL 将向量除以分量。gl_Positionw

不,它没有。它将要栅格化的顶点的裁剪空间位置划分为裁剪空间位置的坐标。顶点的裁剪空间位置是栅格化前的最后一个顶点处理阶段为该顶点发出的值。光栅化之前的所有着色器阶段都是顶点处理阶段。wgl_Position

顶点处理阶段不是最后一个这样的阶段可以输出到,但这没有特殊意义。下一个顶点处理阶段可以将其作为输入,但该值将按原样传递。gl_Position

如果是在之后,有没有一种快速的方法可以在不手动除以顶点着色器之前完成?w

你真的不应该想要。将投影后空间中的顶点作为 4D 值进行处理是完全合理的。您可以根据需要对这些顶点应用旋转、平移等,如果您在正确的空间中执行此操作,结果仍然“有意义”。您甚至可以对它们应用第二个投影。

评论

1赞 BDL 9/21/2023
不要忘记,通过手动除以 w,透视校正插值不再起作用。
0赞 BENG 9/22/2023
我之所以要除以,是因为我使用几何着色器将屏幕空间中的线条转换为较粗的线条(或四边形)。原始顶点位于世界空间中并投影在屏幕上。但我希望得到的四边形具有均匀的厚度。如果我不除以 ,四边形的末端将具有不同的厚度,具体取决于它们在方向上的深度。wwz
0赞 BENG 9/22/2023
但是,我可以像你说的那样将它们视为 4D 向量,看看我是否可以优化数学,这样我就不必除以 。w
0赞 BENG 9/22/2023
实际上,我不知道这在4D空间中是否可能做到。我必须在 2D 中归一化垂直向量,这已经是一种非线性运算。因此,如果我保持分离,那将更加非线性的数学运算,我必须在剪辑空间归一化之前撤消。w