Java LWJGL正交+;翻译矩阵问题
我已经使用opengl很长一段时间了,为了设置一个将精灵位置映射到窗口坐标的转换,我使用了以下方法Java LWJGL正交+;翻译矩阵问题,java,opengl,lwjgl,Java,Opengl,Lwjgl,我已经使用opengl很长一段时间了,为了设置一个将精灵位置映射到窗口坐标的转换,我使用了以下方法 glOrtho(0, screenWidth, screenHeight, 0, -1, 1); glTranslate(100, 100, 0); 然后将精灵放置在窗口坐标处,我将使用以下命令 glOrtho(0, screenWidth, screenHeight, 0, -1, 1); glTranslate(100, 100, 0); 对于可编程管道,我会做同样的事情,除了不使用g
glOrtho(0, screenWidth, screenHeight, 0, -1, 1);
glTranslate(100, 100, 0);
然后将精灵放置在窗口坐标处,我将使用以下命令
glOrtho(0, screenWidth, screenHeight, 0, -1, 1);
glTranslate(100, 100, 0);
对于可编程管道,我会做同样的事情,除了不使用glOrtho和glTranslate之外,我会创建矩阵数据结构并将它们发送到着色器
我现在使用带有可编程管道的JavaLWJGL库,出于某种原因,还使用了转换
必须相当于
glOrtho(0, screenWidth, screenHeight, 0, -1, 1);
glTranslate(100, -100, 0);
如果我使用可编程管道
glTranslate(100, 100, 0);
精灵从屏幕上消失了。看起来y的翻译与我习惯的相反。有没有其他人使用过LWJGL,并且知道它在这方面与C/C++opengl不同的问题
为了在java中参考,我用以下代码设置了正交矩阵
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);
最初对glOrtho(…)的调用对于OpenGL来说是不典型的 也就是说,您对图像进行投影,使Y=0为顶部。您可以自由地建立任何您想要的投影,但是如果您要遵循OpenGL矩阵数学的教科书实现,您通常需要交换
glOrtho(…)
中的第3个和第4个参数。大多数书籍都假定ModelView矩阵是右手坐标,投影矩阵仅反转Z轴以生成左手坐标系
由于您可能对最初的投影非常满意,因此只需在用于构建矩阵的函数中交换top
和bottom