OpenGL 在哪个阶段使用左手?
At which stage OpenGL goes left-handed?
我知道 OpenGL 在用户 space 中以右手模式运行(实际上它不关心我们在哪个系统中工作)并且只有在每个用户阶段完成后才进入左手模式。
learnopengl 说(强调我的)
Note that in normalized device coordinates OpenGL actually uses a left-handed system (the projection matrix switches the handedness).
但是,我不明白这种说法怎么可能是真的。在这个简单的例子中:假设 ModelViewProjection = Identity,投影矩阵什么都不做,所以最终的顶点仍然是右手的。
如果我们测试它,我们可以看到在 z = -0.5 处渲染的一个对象将被另一个在 z = -0.1 处的对象隐藏,这应该意味着剪辑 space 仍然是正确的-交了,对吧?
归一化设备 space 和剪辑 space 是左撇子。裁剪规则是-w <= x, y, z <= w。模型和视图坐标系通常是 right-handed 只是普通对流。但是“OpenGL”既不是 left- 也不是 right-handed(遗留 OpenGL 矩阵函数生成 right-handed 矩阵除外)。即使是 OpenGL 也不会改变系统。
使用 glm::ortho
or glm::perspective
(or glOrtho
, glFrustum
) 生成的常用正交或透视投影矩阵会反转 z-axis。也就是说,它将 right-handed 系统变成 left-handed 系统,将 left-handed 系统变成 right-handed 系统。使用投影矩阵的单位矩阵不会反转 z-axis 并且不会更改系统。
然而,一个物体是否被另一个物体遮挡取决于Depth Test和深度函数。
我知道 OpenGL 在用户 space 中以右手模式运行(实际上它不关心我们在哪个系统中工作)并且只有在每个用户阶段完成后才进入左手模式。 learnopengl 说(强调我的)
Note that in normalized device coordinates OpenGL actually uses a left-handed system (the projection matrix switches the handedness).
但是,我不明白这种说法怎么可能是真的。在这个简单的例子中:假设 ModelViewProjection = Identity,投影矩阵什么都不做,所以最终的顶点仍然是右手的。
如果我们测试它,我们可以看到在 z = -0.5 处渲染的一个对象将被另一个在 z = -0.1 处的对象隐藏,这应该意味着剪辑 space 仍然是正确的-交了,对吧?
归一化设备 space 和剪辑 space 是左撇子。裁剪规则是-w <= x, y, z <= w。模型和视图坐标系通常是 right-handed 只是普通对流。但是“OpenGL”既不是 left- 也不是 right-handed(遗留 OpenGL 矩阵函数生成 right-handed 矩阵除外)。即使是 OpenGL 也不会改变系统。
使用 glm::ortho
or glm::perspective
(or glOrtho
, glFrustum
) 生成的常用正交或透视投影矩阵会反转 z-axis。也就是说,它将 right-handed 系统变成 left-handed 系统,将 left-handed 系统变成 right-handed 系统。使用投影矩阵的单位矩阵不会反转 z-axis 并且不会更改系统。
然而,一个物体是否被另一个物体遮挡取决于Depth Test和深度函数。