我已经使用了很长时间的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);
答案 0 :(得分:0)
您对glOrtho (...)
的原始呼叫对于OpenGL来说是非典型的。
也就是说,您投影的图像是Y = 0的顶部。您可以自由地建立任何您想要的投影,但如果您要遵循OpenGL矩阵数学的教科书实现,您通常需要交换glOrtho (...)
中的第3和第4个参数。大多数书籍都会假设您的ModelView矩阵是右手的,并且投影矩阵仅反转 Z轴以生成左手坐标系。
由于您可能对 最初 所拥有的投影感到满意,因此您只需要在函数中交换top
和bottom
正在用来构建你的矩阵。