OpenGL:正交投影

时间:2015-04-07 03:28:19

标签: java opengl lwjgl

我正在尝试使用正交投影来进行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)?

1 个答案:

答案 0 :(得分: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数组,则可以将其存储为:

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关于它的简短文章,这很好地解释了它。我强烈推荐它。