Math OpenGL中的左手计算

Math OpenGL中的左手计算,math,opengl,matrix,direct3d,Math,Opengl,Matrix,Direct3d,在中断了2年之后,我又回到了世界游戏编程领域。不幸的是,我大部分关于3D数学的知识都很生疏。所以请容忍我 我的引擎和游戏最初是为DirectX设计的,这是一个使用行主矩阵结构的左手系统。我的数学代码都是自制的,在该系统的范围内工作得非常完美。我想给我的游戏一个OpenGL渲染器。由于我所有的数学都使用左手的行主矩阵系统(例如,创建投影矩阵),将我的数学移植到OpenGL的左手的列主矩阵系统有多难 这是一个转换矩阵并将值粘贴到列主结构中的问题吗?还是我把这个简化得太多了。视情况而定。我们说的是基于

在中断了2年之后,我又回到了世界游戏编程领域。不幸的是,我大部分关于3D数学的知识都很生疏。所以请容忍我

我的引擎和游戏最初是为DirectX设计的,这是一个使用行主矩阵结构的左手系统。我的数学代码都是自制的,在该系统的范围内工作得非常完美。我想给我的游戏一个OpenGL渲染器。由于我所有的数学都使用左手的行主矩阵系统(例如,创建投影矩阵),将我的数学移植到OpenGL的左手的列主矩阵系统有多难


这是一个转换矩阵并将值粘贴到列主结构中的问题吗?还是我把这个简化得太多了。

视情况而定。我们说的是基于着色器的OpenGL还是固定函数(FF)

在FF land中,您需要做的是使用gluPerspective(或glFrustum)生成透视矩阵,使用类似于D3D下代码的参数。然后,您需要转置将为D3D计算的矩阵(不考虑计算的投影部分),以使列成为主要的,这是glLoad/MultMatrix想要的方式

然后,需要生成一个矩阵来翻转场景,将其放置在GL_MODELVIEW堆栈的最底部。要想知道该怎么做,最简单的方法就是渲染一切,看看世界是如何颠倒的。然后在那里粘贴一个矩阵,它沿着一个轴求反;如果这能解决问题,你就完了

在伪代码中,您要做的是:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(/*Projection parameters here*/);

glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(/*Your flip matrix here*/);
glPushMatrix();

//Render your stuff here.
//When rendering an object:
Matrix mat = ComputeD3DModelToCameraMatrixForObject();
mat = Transpose(mat);
glPushMatrix();
glMultMatrixf(GetMatrixAsFloatArray(mat));
//Draw the object.
glPopMatrix();

//When finished rendering stuff:
glPopMatrix();
在着色器中,情况更简单。这假设您正在使用自己的制服将矩阵传递给GLSL

实际上,您需要做的就是查看OpenGL使用的剪辑空间和D3D使用的剪辑空间之间的差异。剪辑空间是从顶点着色器输出的顶点位置的空间。由于
glUniformMatrix
函数有一个参数,允许您指定矩阵是否被转置(行主键),因此您可以将矩阵作为正常值传递给GLSL。一旦计算出D3D剪辑空间位置,就像计算D3D一样,只需根据OpenGL的预期修改结果即可


我现在还不记得有什么不同,但OpenGL规范第2.13节(在3.3版中,对于其他版本,它可能是不同的一节)非常明确地详细说明了预期的坐标系,以及随后对窗口空间的转换。

您可以查看以下内容:


所以,我从你的帖子中收集到的信息是,为了使我的代码能够与GLSL一起工作,我只需要调用glUniform***(),并将row major boolean设置为true。投影矩阵的数学需要改变,我发现。你可以根据剪辑空间的不同进行调整,将D3D投影矩阵乘以从D3D剪辑空间到OpenGL剪辑空间的转换矩阵,而不是从单位矩阵开始。类似地,您可以启动diag(1,1,-1,1)的modelview堆栈,而不是identity。