使用LWJGL 3

时间:2016-02-05 03:56:09

标签: java opengl lwjgl

我使用LWJGL 3在OpenGL 4.2窗口中设法显示二维三角形。这是我使用的代码:

import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import org.lwjgl.opengl.GL;
import org.lwjgl.system.MemoryUtil;

public class TestClass
{
    private static long window;
    private static int WIDTH = 1280;
    private static int HEIGHT = 720;

    public static void main (String[] args)
    {
        if (glfwInit() == GL_FALSE)
        {
            System.out.println ("GLFW initialization failed.");
            System.exit (1);
        }

        glfwWindowHint (GLFW_RESIZABLE, GL_FALSE);
        window = glfwCreateWindow (WIDTH, HEIGHT, "GLFW Window", MemoryUtil.NULL, MemoryUtil.NULL);
        glfwMakeContextCurrent (window);
        glfwSwapInterval (1);
        GL.createCapabilities();
        glMatrixMode (GL_PROJECTION);
        glLoadIdentity();
        glOrtho (0, 12, 12, 0, 1, -1);
        glClearColor (0, 0.7f, 1, 0);
        glMatrixMode (GL_MODELVIEW);
        glfwShowWindow (window);

        while (glfwWindowShouldClose (window) == GL_FALSE)
        {
            glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

            glBegin (GL_TRIANGLES);
            glColor3f (1, 0, 0.7f);
            glVertex3f (6, 4, 0); // Vertex one
            glColor3f (1, 0, 0.7f);
            glVertex3f (4, 8, 0); // Vertex two
            glColor3f (1, 0, 0.7f);
            glVertex3f (8, 8, 0); // Vertex three
            glEnd();

            glfwSwapBuffers (window);
            glfwPollEvents();
        }

        glfwDestroyWindow (window);
        glfwTerminate();
    }
}

如果我将三个顶点中的任何一个的Z值设置为大于1或小于-1的值,则三角形会在该顶点周围消失。当我将Z值设置为1-1之间的某个值时,我发现它之间没有区别,并且值等于0。我有点卡在这里。有人可以解释如何让这个三角形存在于与视角不完全平行的平面上吗?

干杯, 星云

1 个答案:

答案 0 :(得分:0)

这是因为您没有使用透视图,而是使用正交视图。当您调用glOrtho()时,您要求将用于投影的矩阵设置为正交矩阵,该矩阵不考虑深度并且不进行透视计算。这就是为什么你没有看到三角形的变化。至于当值超过(-1,1)的范围时顶点消失,这是因为你将glOrtho()调用的最后两个参数分别设置为1和-1。这告诉openGL丢弃此范围之外的顶点(因为规范化设备坐标和矩阵数学一起工作的方式,如果继续使用openGL并使用后续版本,您可能会了解到这一点。)

现在,在LWJGL 3中,删除了glu(Utility包)。这使得初始化固定管道的透视矩阵变得有点困难。 here是关于如何做到这一点的好帖子,但是因为它是为c ++编写的,所以我将为你提供java等价物。

// Replaces gluPerspective. Sets the frustum to perspective mode.
// fov     - Field of vision in degrees in the y direction
// aspect   - Aspect ratio of the viewport
// zNear    - The near clipping distance
// zFar     - The far clipping distance
private static void perspectiveGL(float fov, float aspect, float zNear, float zFar) {
    float fH = (float) Math.tan(fov / 360 * Math.PI) * zNear;
    float fW = fH * aspect;
    glFrustum( -fW, fW, -fH, fH, zNear, zFar );
}

glFrustum()调用是此函数的重要组成部分,是创建透视矩阵的原因,但其参数并非用户友好。

希望这有帮助!