我正在转换一些旧软件以支持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坐标。我还试过乘以各种矩阵和向量的倒数,并将相机矩阵乘以缩放矢量。
答案 0 :(得分:5)
不要考虑那么多的手性。确实,他们使用不同的约定,但你可以选择不使用它们,它归结为两个API几乎相同的东西。我的建议是在两个API中使用完全相同的矩阵和设置,除了这两件事:
从DX到GL的所有操作都需要:
DX9也存在像素坐标偏移的问题,但这完全是另外一个问题,而且DX10以后不再是问题。
根据您的描述,绕组可能是您的问题,因为您正在使用GLM函数生成对OpenGL来说应该没问题的矩阵。