如何使DirectX风格的世界/视图/投影矩阵适应OpenGL?

时间:2010-09-12 16:05:00

标签: opengl graphics directx

我有一个使用DirectX的应用程序,因此是一个左手世界坐标系统,一个俯视正z的视图和一个投影到单位立方体但是z为0..1的投影。

我正在将此应用程序移植到OpenGL,并且OpenGL具有不同的坐标系等。特别是,它是右手的,视图沿负z向下看,并且投影进入实际的单位立方体。

使DirectX矩阵适应OpenGL的最简单方法是什么?仅仅通过翻转x轴,世界空间变化似乎很容易,但我不完全确定如何改变视图/投影。我可以在将它们相乘并将它们发送到我的着色器之前单独修改所有矩阵。如果可能的话,我想坚持使用基于DirectX的坐标系统尽可能远离管道(即我不想改变我放置对象的位置,我如何计算视锥,等等 - 理想情况下,我在将它们交给我的着色器之前,只对矩阵应用一些修改。)

3 个答案:

答案 0 :(得分:4)

答案是:没有必要翻转任何东西,只是调整深度范围。 OpenGL有-1..1,DX有0..1。您可以像以前一样使用DX矩阵,并且只在投影矩阵顶部的末端乘以比例/偏差矩阵,以将深度值从0..1缩放到-1..1。

答案 1 :(得分:0)

没有经过测试或其他任何事情,只是出于我的头脑:

oglProj = transpose(dxProj)
glScalef (1., 1., -1.);  // invert z
glScalef(0.5, 0.5, 1); // from [-1,1] to [-0.5, 0.5]
glTranslatef(0.5, 0.5, 0) // from [-0.5, 0.5] to [0,1]

oglView = transpose(dxView)
glScalef (1., 1., -1.);  // invert z

oglModel = transpose(dwModel)
glScalef (1., 1., -1.);  // invert z

oglModelView = oglView * oglModel

答案 2 :(得分:-2)

对于OpenGL,有一个古老的扩展名为:GL_ARB_TRANSPOSE_MATRIX。它在GPU上转换矩阵,应该可以在每个视频卡上使用。