OpenGL矩阵与DirectX矩阵的对比

5

我只处理过DirectX矩阵。

我读过一些文章,说你不能用DirectX矩阵数学库来处理OpenGL矩阵。

但我也读过,如果你的数学知识是一致的,你可以得到类似或相同的结果。这让我更加困惑了。

有人能给我解释一下吗?或者如果你不能在OpenGL矩阵上使用DirectX数学,请问有没有好的OpenGL矩阵库?

任何关于它们之间差异和数学知识的帮助都将不胜感激。


看起来它们不同:http://www.mindcontrol.org/~hplus/graphics/matrix-layout.html。相关:http://stackoverflow.com/questions/3695520/how-to-adapt-directx-style-world-view-projection-matrices-to-opengl。http://www.opengl.org/discussion_boards/showthread.php/133554-Converting-a-DirectX-Matrix-to-OpenGL-Not-possible。它们可能只是彼此的转置:http://en.wikipedia.org/wiki/Transpose。 - Ray Tayek
2个回答

5
我已经阅读了一些文章,这些文章说你不能使用DirectX矩阵数学库来处理OpenGL矩阵。这是错误的。但我也看到过如果你的数学计算一致,你可以得到类似或相同的结果。唯一的区别在于OpenGL和DirectX对其标准化设备坐标空间所做的默认假设不同。它们使用略有不同的范围和符号。然而,这只会转换成一个变换堆栈,上面预乘了一个额外的“适配器”矩阵,完成后就可以了。另外,索引排序也很重要,但是现代OpenGL允许您通过传递给glUniformMatrix参数的名称为“transpose”的参数来选择使用哪种顺序。

所以你的意思是,如果我在DirectX中使用了自己编写的数学库,在传递矩阵时只需要确保检查转置布尔值? - Franky Rivera
@FrankyRivera:此外,您的投影矩阵需要一些缩放预乘。如果我没记错的话,是 Scale(0.5, 0.5, -1) · Translate(1, 1, 0),但不要完全相信我。 - datenwolf

3
我希望通过澄清datenwolf的出色回答来补充一些内容,即OpenGL矩阵和DirectX矩阵之间的关键区别在于它们分别以列主序和行主序格式表示。(列主序和行主序是指您如何在4x4格式中编写它们。如果翻译出现在第四列,则为列主序,反之亦然。)
数学家会告诉您,列主序是表示矩阵的正确方式,主要是因为它使得操作矩阵在视觉上(在纸上)更容易。
然而,在OpenGL中,整个矩阵以一个16元素数组的形式连续地布置在内存中,其中平移占据第13、14和15个元素,根据规格。因此,很容易将数据适应任何矩阵格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接