GLSL gl_Position 中的第四维是什么?

Jac*_*rby 4 opengl shader glsl perspectivecamera

我正在学习 OpenGL,目前我正在编写一个着色器,但我很困惑为什么gl_Position变量是 avec4而不是 a vec3,正如我所期望的。我当然希望这样做,因为它使用 3D 空间,而不是 4D。

我希望我至少正确地假设 的前三个字段gl_Position确实是位置的 x、y 和 z 坐标。

如果我的问题还不够清楚:gl_Position.的第四个字段是什么?

顺便说一下,我使用的是 OpenGL 3.2 和 GLSL 1.5。

Rab*_*d76 7

gl_Position齐次坐标。在正交投影中,第 4 个分量w是 1。作为透视投影的结果,该分量采用 1 以外的其他值。

gl_Position可以通过透视除法转换为归一化设备空间中的笛卡尔坐标

vec3 ndc = gl_Position.xyz / gl_Position.w;
Run Code Online (Sandbox Code Playgroud)

gl_Position是剪辑空间坐标。在剪辑空间中执行场景的剪辑。
如果xyz分量在由倒置w分量和w点的齐次坐标分量定义的范围内,则点在裁剪空间中:

-w <=  x, y, z  <= w.
Run Code Online (Sandbox Code Playgroud)

另见变换模型矩阵