1

我正在转换一些旧软件以支持 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 坐标。我还尝试乘以各种矩阵和向量的逆,并将相机矩阵乘以缩放向量。

4

1 回答 1

6

不要过多地考虑惯用手。确实,它们使用不同的约定,但您可以选择不使用它们,归结为两种 API 中几乎相同的东西。我的建议是在两个 API 中使用完全相同的矩阵和设置,除了以下两点:

从 DX 移植到 GL 所需要做的就是:

  1. 反转剔除面缠绕 - 默认情况下 DX 逆时针剔除,而这正是 GL 保留的。
  2. 针对不同的深度范围进行调整:DX 使用 0(近)到 1(远)的深度范围,而 GL 使用 -1 表示近,1 表示远的有符号范围。您可以将其作为投影矩阵中的“最后一步”。

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

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

于 2012-08-03T23:12:58.197 回答