LWJGL ortho +翻译矩阵问题

时间:2014-05-05 01:35:41

标签: java opengl lwjgl

我已经使用了很长时间的opengl并设置了一个转换,它将精灵位置映射到窗口坐标我使用以下内容......

glOrtho(0, screenWidth, screenHeight, 0, -1, 1);

然后将精灵定位在窗口坐标上我将使用以下内容...

glTranslate(100, 100, 0);

对于可编程管道我会做同样的事情,除了不使用glOrtho和glTranslate我会创建矩阵数据结构并将它们发送到着色器制服

我现在正在使用带有可编程管道的java LWJGL库,并且出于某种原因进行转换 必须等同于

glOrtho(0, screenWidth, screenHeight, 0, -1, 1);
glTranslate(100, -100, 0);

如果我的可编程管道相当于

glTranslate(100, 100, 0);

精灵进入屏幕。似乎y翻译与我习惯的翻译相反。有没有其他人与LWJGL合作并了解在这方面与C / C ++ opengl不同的任何问题?

供java参考我用这段代码设置了我的ortho矩阵

float tx = -(right + left) / (right - left);
float ty = -(top + bottom) / (top - bottom);
float tz = -(far + near) / (far - near);
float sx =  2 / (right - left);
float sy =  2 / (bottom - top);
float sz = -2 / (far - near);

matrix.m00 = sx; matrix.m10 =  0; matrix.m20 =  0; matrix.m30 = tx;
matrix.m01 =  0; matrix.m11 = sy; matrix.m21 =  0; matrix.m31 = ty;
matrix.m02 =  0; matrix.m12 =  0; matrix.m22 = sz; matrix.m32 = tz;
matrix.m03 =  0; matrix.m13 =  0; matrix.m23 =  0; matrix.m33 = 1;

并使用Matrix4f.translate创建转换矩阵。矩阵被发送到投影和模型制服,在顶点着色器中,位置计算如下......

gl_Position = projection * model * vec4(aPosition, 1.0);

矩阵设置为转置。我也试过没有换位但是当矩阵没有换位时我得到了无效的变换。

我发现问题是上述代码中的错误

而不是

float sy =  2 / (bottom - top);

应该是

float sy =  2 / (top - bottom);

1 个答案:

答案 0 :(得分:0)

您对glOrtho (...)的原始呼叫对于OpenGL来说是非典型的。

也就是说,您投影的图像是Y = 0的顶部。您可以自由地建立任何您想要的投影,但如果您要遵循OpenGL矩阵数学的教科书实现,您通常需要交换glOrtho (...)中的第3和第4个参数。大多数书籍都会假设您的ModelView矩阵是右手的,并且投影矩阵仅反转 Z轴以生成左手坐标系。

由于您可能对 最初 所拥有的投影感到满意,因此您只需要在函数中交换topbottom正在用来构建你的矩阵。