opengl - GLSL gl_Position 中的第四维是什么?

标签 opengl glsl shader perspectivecamera

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

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

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

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

最佳答案

gl_PositionHomogeneous coordinates .在 orthographic projection第四部分 w是 1。由于 perspective projection ,该分量采用 1 以外的其他值。
gl_Position可以转换为Cartesian coordinate在标准化设备空间中由 Perspective divide .

vec3 ndc = gl_Position.xyz / gl_Position.w;
gl_Position是剪辑空间坐标。在剪辑空间中执行场景的剪辑。
如果 x,一个点在裁剪空间中, yz组件在倒置 w 定义的范围内组件和 w点齐次坐标的分量:
-w <=  x, y, z  <= w.

另见 Transform the modelMatrix

关于opengl - GLSL gl_Position 中的第四维是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49782148/

相关文章:

c++ - 具有常量法线的 glDrawElements

c - 将 3d 模型文件(3ds/obj/任何开放格式)转换为 C 数组的工具

Python 模块 'shader' : from shader import ShaderProgram, 着色器代码

opengl - GLSL 物体发光

C++/OpenGL : How does Tesselation work?

opengl - 在我的代码 : Whats the licensing model? 中使用 NVidia FxAA

c++ gluLookAt的OpenGL显示问题

opengl-es - OpenGL ES 2.0 : Attribute vs Layout?

opengl - 如何将大型四边形基元数组转换为三角形基元?

libgdx - GLSL ES - 使用重复将纹理从直角坐标映射到极坐标