2015-04-07 142 views
0

我想要为我的GUI渲染使用正射投影。当我使用我的常规变换矩阵绘制网格时,我得到了我期望的结果,但是当我使用正交投影时,我什么也得不到。我的透视投影也很好。我的正矩阵:OpenGL:正投影

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

看起来您的矩阵按行排列,而列主矩阵通常用于OpenGL。 –

+0

我所有的其他矩阵都是以这种方式完成的,它们工作得很好。对不起,如果我不完全理解,我不知道我在做矩阵时做了什么。 – redonkulasman

+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的希望您能传递到shader布局。这是列主要的约定。 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关于它的简短文章,它很好地解释了它。我强烈推荐它。