在2年的中断之后我又回到了世界游戏节目中。不幸的是,我对3D数学的大部分知识都相当生疏。所以忍受我。
我的引擎和游戏最初是为DirectX设计的,这是一个使用行主要Matrix结构的左手系统。我的数学代码都是自制的,并且在该系统的范围内完美运行。我想让我的游戏成为一个OpenGL渲染器。由于我的所有数学都使用左手的行主要矩阵系统(例如,创建投影矩阵),将数学运算到OpenGL的左手柱主系统有多难?
是否需要转换矩阵并将值粘贴到列主结构中?或者我是否过度简化了这一点。
答案 0 :(得分:1)
这取决于。我们是在谈论基于着色器的OpenGL还是固定功能(FF)?
在FF版本中,您需要做的是使用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使用的剪辑空间之间的差异。剪辑空间是从顶点着色器输出的顶点位置的空间。您可以照常将矩阵传递给GLSL,因为glUniformMatrix
函数有一个参数,允许您指定矩阵是否转置(行主要)。一旦像D3D那样计算了D3D剪辑空间位置,只需根据OpenGL的预期修改结果。
我不记得手头的差异,但OpenGL规范第2.13节(在3.3版中,它可能是其他版本的不同部分)非常明确地详述了预期的坐标系,以及随后的转换为窗口空间。
答案 1 :(得分:0)