opengl - gl_Position.w 的负值?

标签 opengl glsl shader

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

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

顺便说一句,面部剔除未启用。

最佳答案

Has the w component of gl_Position required to be greater than zero?

不,但是 gl_Position.xyz / gl_Position.w 的结果必须在 (-1,-1,-1) 到 (1,1,1)(标准化设备空间)范围内。这意味着结果的每个分量( xyz )必须是 >= -1.0<= 1.0

enter image description here

但是,如果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_PositionHomogeneous 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)

enter image description here


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

enter image description here

关于opengl - gl_Position.w 的负值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233771/

相关文章:

使用 glOrtho 进行 OpenGL 光照

c++ - gluPerspective()/glm::perspective() 中的近/远剪裁平面如何工作?

glsl - 如何在 GLSL 结构体中初始化数组

opengl - (OpenGL 3.1 - 4.2) (GLSL) 高效的统一变量?

c++ - 检索现有着色器属性时,glGetAttribLocation 返回 -1

c++ - OpenGL 变换反馈不返回任何东西

opengl - 我需要在片段着色器中进行输出 Gamma 校正吗?

opengl - (GLSL)同时从不同角度渲染多个 channel

c++ - 着色器中的多个 [in] 属性 - OpenGL

THREE.js:寻找 MeshFaceMaterial 的替代品