Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LWJGL正交+;翻译矩阵问题_Java_Opengl_Lwjgl - Fatal编程技术网

Java LWJGL正交+;翻译矩阵问题

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

我已经使用opengl很长一段时间了,为了设置一个将精灵位置映射到窗口坐标的转换,我使用了以下方法

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