我目前正在尝试使用JOGL将2D Java游戏的绘制方法转换为OpenGL,因为本机Java似乎无法快速连续绘制高分辨率图像。现在我想使用16:9的长宽比,但是问题是我的图像被拉伸到了侧面。目前我只画一个白色的旋转四边形来测试:
public void resize(GLAutoDrawable d, int width, int height) {
GL2 gl = d.getGL().getGL2(); // get the OpenGL 2 graphics context
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);
}
public void display(GLAutoDrawable d) {
GL2 gl = d.getGL().getGL2(); // get the OpenGL 2 graphics context
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glColor3f(1.0f,1.0f,1.0f);
degree += 0.1f;
gl.glRotatef(degree, 0.0f, 0.0f, 1.0f);
gl.glBegin(GL2.GL_QUADS);
gl.glVertex2f(-0.25f, 0.25f);
gl.glVertex2f(0.25f, 0.25f);
gl.glVertex2f(0.25f, -0.25f);
gl.glVertex2f(-0.25f, -0.25f);
gl.glEnd();
gl.glRotatef(-degree, 0.0f, 0.0f, 1.0f);
gl.glFlush();
}
我知道您可以通过使用glOrtho()以某种方式解决此问题,并且我现在为此尝试了许多不同的值,但是没有一个获得未拉伸的图像。我该如何使用呢?还是为此提供另一种简单的解决方案?
最佳答案
投影矩阵将所有顶点数据从眼睛坐标转换为剪辑坐标。
然后,通过将片段坐标的w分量除以将这些片段坐标也转换为归一化设备坐标(NDC)。
规范化的设备坐标在(-1, -1, -1)
至(1, 1, 1)
的范围内。
通过正交投影,眼睛空间坐标线性映射到NDC。
如果视口是矩形的,则必须通过映射坐标来考虑。
float aspect = (float)width/height;
gl.glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);