【问题标题】:OpenGL: Orthographic ProjectionOpenGL:正交投影
【发布时间】:2015-04-07 03:28:19
【问题描述】:

我正在尝试使用正交投影来进行 GUI 渲染。当我仅使用常规变换矩阵绘制网格时,我得到了我所期望的结果,但是当我使用正交投影时,我什么也得不到。我的透视投影也很好用。我的正交矩阵:

public Matrix4f initOrthographic(float left, float right, float bottom, float top, float near, float far)
{
    m[0][0] = 2.0f / (right - left);    m[0][1] = 0;                        m[0][2] = 0;                    m[0][3] = (left + right) / (left - right);
    m[1][0] = 0;                        m[1][1] = 2.0f / (top - bottom);    m[1][2] = 0;                    m[1][3] = (bottom + top) / (bottom - top);
    m[2][0] = 0;                        m[2][1] = 0;                        m[2][2] = 2.0f / (near - far);  m[2][3] = (far + near) / (far - near);
    m[3][0] = 0;                        m[3][1] = 0;                        m[3][2] = 0;                    m[3][3] = 1;

    return this;
}

我一辈子都无法找出问题所在。我将此矩阵乘以常规变换,然后将该矩阵乘以着色器中的顶点位置。有任何想法吗?如果需要,我可以发布更多代码/信息。

我想我刚刚发现了问题。我的顶部为 0,底部为 720,当我将这些值翻转为顶部 720 和底部 0 时,它工作得很好。唯一的事情是我希望左上角是 (0, 0)。有什么办法可以做到这一点,还是我被左下角的 (0, 0) 困住了?

【问题讨论】:

  • 看起来你的矩阵是行主要的,而列主要的矩阵通常用于 OpenGL。
  • 我所有的其他矩阵都是以这种方式完成的,它们工作得很好。抱歉,如果我不完全理解,我真的不知道我在做矩阵方面的工作。
  • 您是否考虑过检查您的视口设置?
  • 您是否以正确的顺序使用参数调用它?检查你没有传入左、上、右、下
  • 我检查了一下,通话顺序正确。

标签: java opengl lwjgl


【解决方案1】:

我的正交矩阵看起来和你的完全不同:

      2.0f / (right - left)                          0                                    0                      0
                0                          2.0f / (top - bottom)                          0                      0
                0                                    0                           2.0f / (zFar - zNear)           0
-(right + left) / (right - left)     -(top + bottom) / (top - bottom)    -(zFar + zNear) / (zFar - zNear)        1

重要的是如何存储值。如果你要为你的矩阵使用一个浮点数组,你可以像这样存储它:

float orthoMat[] =
{
    2.0f / (right - left),
    0,
    0,
    0,

    0,
    2.0f / (top - bottom),
    0,
    0,

    0,
    0,
    2.0f / (zFar - zNear),
    0,

    -(right + left) / (right - left),
    -(top + bottom) / (top - bottom),
    -(zFar + zNear) / (zFar - zNear),
    1
};

这是 OpenGL 希望您传递给着色器的布局。这是列主要约定。 DirectX 使用行优先约定。所以基本上我的矩阵可以从左到右、下一行、从左到右读取,而你的矩阵应该从上到下、下一列、从上到下读取。如果你转置你的矩阵,你得到的矩阵几乎和我一样。然而,我们的矩阵之间存在一些差异,即使是在转置时:

在您的代码中

- m[2][2] should be 2.0f / (zFar - zNear)
- m[0][3], m[1][3] and m[2][3] should be negative

只要您解决了矩阵的这些问题并确保在将矩阵传递给着色器时元素的正确顺序,您仍然可以使用您的矩阵实现。请记住,元素 12、13 和 14 存储翻译。如果您对所有这些以行为主/以列为主的东西感到困惑,请阅读this 关于它的简短文章,它很好地解释了它。我强烈推荐它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2023-04-01
    • 2013-11-26
    • 2011-04-06
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多