java - 按纵横比拉伸(stretch)的 OpenGL 2D 投影

标签 java opengl jogl orthographic opengl-compat

我目前正在尝试使用 JOGL 将 2D java 游戏的绘图方法转换为 OpenGL,因为 native java 对于快速连续绘制高分辨率图像似乎相当慢。现在我想使用 16:9 的宽高比,但问题是我的图像被拉伸(stretch)到两侧。目前我只绘制一个白色旋转四边形来测试这一点:

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() 以某种方式解决这个问题,并且我现在尝试了许多不同的值,但它们都没有实现未拉伸(stretch)的图像。我必须如何使用这个?或者还有其他简单的解决方案吗?

最佳答案

投影矩阵将所有顶点数据从眼睛坐标转换为剪辑坐标。

然后,这些剪辑坐标也通过除以剪辑坐标的 w 分量而转换为标准化设备坐标 (NDC)。 标准化设备坐标的范围为 (-1, -1, -1)(1, 1, 1) .

通过正交投影,眼空间坐标线性映射到 NDC。

如果视口(viewport)是矩形,则必须通过映射坐标来考虑。

float aspect = (float)width/height;
gl.glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);

关于java - 按纵横比拉伸(stretch)的 OpenGL 2D 投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45458412/

相关文章:

Java、SWT : how to make a shell transparent (not alpha!)

java - 如何使用整个 Jlabel 来保存文本

java - 为什么我的文字不显示?

java - 通过二分查找查找数组中存储的信息

c++ - 使用 OpenGL 分配的纹理内存受什么限制?

qt - 线程之间的 OpenGL 上下文共享延迟

c++ - 存储多种颜色并从一种颜色切换到另一种颜色

java - OpenGL:我的纹理是错误的吗?

java - 如何使用 jzy3d 库标记 3D 绘图轴?

.class 文件的 Java 语言命名约定