2010-09-12 76 views
1

我有一个应用程序,它使用DirectX,因此是一个左手世界坐标系统,一个俯视正z的投影和投影到单位立方体中的投影,但z从0到1。如何使DirectX风格的世界/视图/投影矩阵适应OpenGL?

我移植这个应用程序的OpenGL和OpenGL具有不同的坐标系等,特别是右撇子,视图看起来顺着负z,并投影到真实单位立方体。

将DirectX矩阵调整为OpenGL最简单的方法是什么?世界空间的变化似乎很容易,只是通过翻转X轴,但我不完全确定如何改变视图/投影。我可以单独修改所有矩阵,然后将它们相乘并将它们发送给我的着色器。如果可能的话,我想尽量使用基于DirectX的坐标系尽可能保持最低点(即,我不想改变放置物体的位置,计算视角的方法等。 - 理想情况下,我“只有会权应当将其交由我的着色器之前,涂抹一些修改矩阵)

+0

只要你不使用固定功能管道,就没有真正的区别。左手/右手协调的事情只不过是一种惯例,FFP和一些便利功能就是随之而来的。 – jalf 2011-01-01 11:33:29

回答

4

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

有一个古老的OpenGL的扩展完全为:GL_ARB_TRANSPOSE_MATRIX。它在GPU上转换矩阵,并应在每张视频卡上提供。

+0

这与问题0一致:问题在于OpenGL具有不同的手性,而这无法通过转置来解决。 – Anteru 2010-09-14 00:27:15

+0

这解决了另一半问题 - 矩阵布局差异。 – alxx 2010-09-14 06:04:04