OpenGL/GLM - 切换坐标系方向

Pla*_*oks 1 c++ opengl math

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

glScalef(1.0f, 1.0f, -1.0f);
Run Code Online (Sandbox Code Playgroud)

这一次,我正在使用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;
Run Code Online (Sandbox Code Playgroud)

我尝试了很多方面,包括反转矢量和反转着色器中的z坐标.我还尝试乘以各种矩阵和向量的倒数,并将相机矩阵乘以缩放向量.

ltj*_*jax 5

不要那么多考虑用手.确实,他们使用不同的约定,但你可以选择不使用它们,它归结为两个API几乎相同的东西.我的建议是在两个API中使用完全相同的矩阵和设置,除了这两件事:

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

  1. 反转剔除面 - 在默认情况下逆时针方向剔除DX,而这就是GL保持的.
  2. 调整不同的深度范围:DX使用0(近)到1(远)的深度范围,而GL使用-1的近距离和1远的有符号范围.您可以将其作为投影矩阵中的"最后一步".

DX9也存在像素坐标偏移的问题,但这完全是另外一个问题,它不再是DX10以后的问题.

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