【发布时间】:2018-05-31 02:40:24
【问题描述】:
虽然我是 opengl 的新手并且很少寻求帮助,但我认为需要对 Z 轴、深度测试和 GLM:ortho 进行一些澄清。 已经为此苦苦挣扎了一两个星期,一切从一开始就被“逆转”了。
所以我使用:
-
glDepthFunc(GL_LESS); -
glDepthRange(0.0f, 1.0f); -
glm::ortho(0.0f, 800, 0.0f, 800), 0.0f, 1.0f); - Z 轴为 Y / 800(高度),Y = 20 的对象在 Y = 10 的后面。
Okej,所以一切都应该加起来,小 Z 在前面,大在后面,但不是。一切都相反。
根据thread 和 glDepthFunc/glClearDepth 的默认值,当 MVP 提供给着色器时,一切都应该在左手坐标中。
因此,当我阅读链接线程时,我发现 glm::ortho 应该将右手坐标(因为显然这是每个人在示例中使用的)转换为左手坐标。听起来很棒,为什么它不起作用?
当您查看 GLM 库时,您会发现 glm::ortho、glm::orthoLH 和 glm::orthoRH 听起来很有趣。如果我使用 glm::orthoLH 一切都加起来并且工作完美,因为它将我所有的坐标转换为左手坐标。那么为什么 glm::ortho 不为我这样做呢?
在您编译 GLM 库时,显然有一个设置。 GLM_COORDINATE_SYSTEM 控制在调用 glm::ortho 时系统是否将 glm::orthoLH 或 glm::orthoRH 作为默认值。令我惊讶的是, glm::orthoLH 不是默认值。
如果你查看 GLM 的源代码,你会发现这些行,
#define GLM_LEFT_HANDED 0x00000001 // For DirectX, Metal, Vulkan
#define GLM_RIGHT_HANDED 0x00000002 // For OpenGL, default in GLM
#ifdef GLM_FORCE_LEFT_HANDED
# define GLM_COORDINATE_SYSTEM GLM_LEFT_HANDED
#else
# define GLM_COORDINATE_SYSTEM GLM_RIGHT_HANDED
#endif
OpenGL是右手的,不需要将正交转换为左手?
所以我的问题是,
- 为什么 GLM 认为 OpenGL 是右撇子?
- 在处理着色器时,OpenGL 是否真的希望 MVP 是右手的?
如果这没有任何意义,请纠正我。我也很困惑:)
【问题讨论】: