OpenGL/GLM-切换坐标系方向



我正在转换一些旧软件以支持OpenGL。DirectX和OpenGL有不同的坐标系(OpenGL在右边,DirectX在左边)。我知道在旧的固定管道功能中,我会使用:

glScalef(1.0f, 1.0f, -1.0f);

这一次,我使用GLM和着色器,需要一个兼容的解决方案。我尝试过用缩放向量乘以我的相机矩阵,但没有成功。

这是我的相机设置:

// Calculate the direction, right and up vectors
 direction = glm::vec3(cos(anglePitch) * sin(angleYaw), sin(anglePitch), cos(anglePitch) * cos(angleYaw));
 right = glm::vec3(sin(angleYaw - 3.14f/2.0f), 0, cos(angleYaw - 3.14f/2.0f));
 up = glm::cross(right, direction);
 // Update our camera matrix, projection matrix and combine them into my view matrix
 cameraMatrix = glm::lookAt(position, position+direction, up);
 projectionMatrix = glm::perspective(50.0f, 4.0f / 3.0f, 0.1f, 1000.f);
 viewMatrix = projectionMatrix * cameraMatrix;

我已经尝试了很多事情,包括反转向量和反转着色器中的z坐标。我还尝试过乘以各种矩阵和向量的倒数,并将相机矩阵乘以缩放向量。

不要想那么多利手的问题。的确,它们使用不同的约定,但你可以选择不使用它们,这在两个API中几乎是一样的。我的建议是在两个API中使用完全相同的矩阵和设置,除了以下两件事:

从DX到GL的端口所需要做的就是:

  1. 反转消隐面缠绕-默认情况下,DX消隐是逆时针方向,而GL则保持这种状态
  2. 根据不同的深度范围进行调整:DX使用0(近)到1(远)的深度范围,而GL使用-1表示近和1表示远的带符号范围。您可以将此操作作为投影矩阵中的"最后一步"

DX9也有像素坐标偏移的问题,但这完全是另一回事,DX10以后不再是问题。

根据您的描述,缠绕可能是您的问题,因为您正在使用GLM函数来生成应该适合OpenGL的矩阵。

最新更新