gl_Position的w分量是否需要大于零?因为当我将其设置为负数时,不会绘制任何内容,但正数是正常的。
gl_Position = vec4(vPos,0,-1);
未启用面部剔除btw。
答案 0 :(得分:7)
w
的{{1}}分量是否必须大于零?
否,但gl_Position
的结果必须在规范化设备空间的范围(-1,-1,-1)到(1,1,1)之内。这意味着结果的每个组件(gl_Position.xyz / gl_Position.w
,x
和y
)必须为z
和>= -1.0
。
但是,如果<= 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 coordinate的gl_Position
组件为1,则它等于组件w
构建的Cartesian coordinate。
Homogeneous coordinates用于透视投影的表示。
在渲染中,场景的每个网格通常由模型矩阵,视图矩阵和投影矩阵进行变换。
投影矩阵描述了从场景的3D点到视口的2D点的映射。投影矩阵从视图空间转换到剪辑空间,剪辑空间中的坐标转换为范围(-1,-1,-1)到(1,1,1)范围内的规范化设备坐标(NDC)通过使用剪辑坐标的xyz
分量进行划分。
在NDC之外的每个几何体都被剪裁。
在正交投影中,眼睛空间中的坐标线性映射到标准化设备坐标。 (TC w
组件是1.0)
在透视投影中,投影矩阵描述了从针孔相机到视口的2D点看世界中3D点的映射。
相机平截头体(截头金字塔)中的眼睛空间坐标被映射到立方体(标准化设备坐标)。