gl_Position 的 w 分量是否需要大于零?因为当我将其设置为负数时,不会绘制任何内容,但正数就可以了。
gl_Position = vec4(vPos,0,-1);
顺便说一句,面部剔除未启用。
最佳答案
Has the
w
component ofgl_Position
required to be greater than zero?
不,但是 gl_Position.xyz / gl_Position.w
的结果必须在 (-1,-1,-1) 到 (1,1,1)(标准化设备空间)范围内。这意味着结果的每个分量( x
、 y
和 z
)必须是 >= -1.0
和<= 1.0
。
但是,如果w
分量为负,无论如何都不会绘制任何内容。因为gl_Position
定义剪辑空间。齐次坐标位于裁剪空间的条件是
-w <= x, y, z <= w.
如果w = -1
这意味着:
1 <= x, y, z <= -1.
这是永远无法实现的。
(参见Why does GL divide gl_Position
by W for you rather than letting you do it yourself?)
说明:
坐标设置为gl_Position
是Homogeneous coordinates 。如果w
Homogeneous coordinate 的组成部分为 1,则等于 Cartesian coordinate由组件构建xyz
.
Homogeneous coordinates用于透视投影的表示。
在渲染中,场景的每个网格通常由模型矩阵、 View 矩阵和投影矩阵进行变换。
投影矩阵描述了从场景的 3D 点到视口(viewport)的 2D 点的映射。投影矩阵从 View 空间变换到剪辑空间,并且剪辑空间中的坐标变换为范围为 (-1, -1, -1) 到 (1, 1, 1) 的归一化设备坐标 (NDC)除以w
剪辑坐标的组成部分。
超出 NDC 的每个几何体都会被剪裁。
在正交投影中,眼睛空间中的坐标被线性映射到标准化设备坐标。 (通常 w
分量为 1.0)
在透视投影中,投影矩阵描述了从针孔相机看到的世界上的 3D 点到视口(viewport)的 2D 点的映射。
相机视锥体(截棱锥体)中的眼睛空间坐标被映射到立方体(标准化设备坐标)。
关于opengl - gl_Position.w 的负值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233771/