【问题标题】:How to adapt DirectX-style world/view/projection matrices to OpenGL?如何使 DirectX 风格的世界/视图/投影矩阵适应 OpenGL?
【发布时间】:2010-09-12 16:04:59
【问题描述】:

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

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

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

【问题讨论】:

  • 只要不使用固定函数流水线,并没有真正的区别。左手/右手坐标只是一个约定,FFP 和一些便利函数遵循。

标签: opengl graphics directx


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    没有经过测试或任何东西,只是我的头顶:

    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
    

    【讨论】:

      【解决方案3】:

      有一个古老的 OpenGL 扩展正是为此:GL_ARB_TRANSPOSE_MATRIX。它在 GPU 上转置矩阵,并且应该在每个视频卡上都可用。

      【讨论】:

      • 这与问题几乎为零:问题是 OpenGL 具有不同的手性,而这无法通过转置来解决。
      • 这解决了问题的另一半——矩阵布局差异。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2019-03-05
      相关资源
      最近更新 更多