gl_Position.w的负值?

时间:2017-11-11 02:33:42

标签: opengl glsl

gl_Position的w分量是否需要大于零?因为当我将其设置为负数时,不会绘制任何内容,但正数是正常的。

gl_Position = vec4(vPos,0,-1);

未启用面部剔除btw。

1 个答案:

答案 0 :(得分:7)

  

w的{​​{1}}分量是否必须大于零?

否,但gl_Position的结果必须在规范化设备空间的范围(-1,-1,-1)到(1,1,1)之内。这意味着结果的每个组件(gl_Position.xyz / gl_Position.wxy)必须为z>= -1.0

enter image description here

但是,如果<= 1.0组件为负数,则无论如何都不会绘制。因为w定义了剪辑空间。齐次坐标在剪辑空间中的条件是

gl_Position

如果-w <= x, y, z <= w. 这意味着:

w = -1

并且永远无法实现。 (见Why does GL divide gl_Position by W for you rather than letting you do it yourself?

<强>解释

设置为 1 <= x, y, z <= -1. 的坐标为Homogeneous coordinates。如果Homogeneous coordinategl_Position组件为1,则它等于组件w构建的Cartesian coordinate

Homogeneous coordinates用于透视投影的表示。

在渲染中,场景的每个网格通常由模型矩阵,视图矩阵和投影矩阵进行变换。

投影矩阵描述了从场景的3D点到视口的2D点的映射。投影矩阵从视图空间转换到剪辑空间,剪辑空间中的坐标转换为范围(-1,-1,-1)到(1,1,1)范围内的规范化设备坐标(NDC)通过使用剪辑坐标的xyz分量进行划分。
在NDC之外的每个几何体都被剪裁。


在正交投影中,眼睛空间中的坐标线性映射到标准化设备坐标。 (TC w组件是1.0)

enter image description here


在透视投影中,投影矩阵描述了从针孔相机到视口的2D点看世界中3D点的映射。
相机平截头体(截头金字塔)中的眼睛空间坐标被映射到立方体(标准化设备坐标)。

enter image description here