gpt4 book ai didi

java - OpenGL:正交投影

转载 作者:行者123 更新时间:2023-12-01 11:41:34 24 4
gpt4 key购买 nike

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

最佳答案

我的正交矩阵看起来与你的很不同:

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

关于java - OpenGL:正交投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29483228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com