我正在将顶点从顶点着色器传递到几何着色器。我在几何着色器中做透视投影。我知道在片段着色器之前,OpenGL将gl_Position向量除以w分量。这是发生在几何着色器之前还是之后?如果是在之后,有没有一种快速的方法可以在之前做,而不用在顶点着色器中手动除以w?编辑:现在这是我的顶点着色器的结束。
gl_Position
w
gl_Position = proj*view*model*vPos; gl_Position = (1.0/gl_Position.w)*gl_Position;
8i9zcol21#
OpenGL将gl_Position矢量除以w分量。不,不是的。它通过裁剪空间位置的w坐标划分要光栅化的顶点的裁剪空间位置。顶点的裁剪空间位置是从光栅化之前的最后一个vertex processing stage为该顶点发出的gl_Position的值。光栅化之前的所有着色器阶段都是顶点处理阶段。不是最后这样的阶段的顶点处理阶段可以输出到gl_Position,但是这没有特殊意义。下一个顶点处理阶段可以将其作为输入,但值按原样传递。如果它是在之后,有没有一种快速的方法可以在之前完成它,而不用在顶点着色器中手动除以w?你真的不应该 * 想 *。将后投影空间中的顶点作为4D值进行处理是完全合理的。你可以在这些顶点上应用旋转、平移等你认为合适的方法,如果你在正确的空间中这样做,结果仍然是有意义的。您甚至可以对它们应用第二个投影。
1条答案
按热度按时间8i9zcol21#
OpenGL将
gl_Position
矢量除以w
分量。不,不是的。它通过裁剪空间位置的
w
坐标划分要光栅化的顶点的裁剪空间位置。顶点的裁剪空间位置是从光栅化之前的最后一个vertex processing stage为该顶点发出的gl_Position
的值。光栅化之前的所有着色器阶段都是顶点处理阶段。不是最后这样的阶段的顶点处理阶段可以输出到
gl_Position
,但是这没有特殊意义。下一个顶点处理阶段可以将其作为输入,但值按原样传递。如果它是在之后,有没有一种快速的方法可以在之前完成它,而不用在顶点着色器中手动除以
w
?你真的不应该 * 想 *。将后投影空间中的顶点作为4D值进行处理是完全合理的。你可以在这些顶点上应用旋转、平移等你认为合适的方法,如果你在正确的空间中这样做,结果仍然是有意义的。您甚至可以对它们应用第二个投影。