我正在转换一些旧软件以支持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的端口所需要做的就是:
- 反转消隐面缠绕-默认情况下,DX消隐是逆时针方向,而GL则保持这种状态
- 根据不同的深度范围进行调整:DX使用0(近)到1(远)的深度范围,而GL使用-1表示近和1表示远的带符号范围。您可以将此操作作为投影矩阵中的"最后一步"
DX9也有像素坐标偏移的问题,但这完全是另一回事,DX10以后不再是问题。
根据您的描述,缠绕可能是您的问题,因为您正在使用GLM函数来生成应该适合OpenGL的矩阵。