错误GLFW_VISIBILE的目的提示绑定OpenGL上下文

时间:2016-11-30 21:14:38

标签: java opengl lwjgl glfw

我目前正在学习一个包含创建窗口的初始化代码的教程

private void init() {
    // Setup an error callback. The default implementation
    // will print the error message in System.err.
    errorCallback = GLFWErrorCallback.createPrint(System.err);
    glfwSetErrorCallback(errorCallback);

    // Initialize GLFW. Most GLFW functions will not work before doing this.
    if (!glfwInit()) {
        throw new IllegalStateException("Unable to initialize GLFW");
    }

    // Configure our window
    glfwDefaultWindowHints(); // optional, the current window hints are already the default
    glfwWindowHint(GLFW_VISIBLE, GL_FALSE); // the window will stay hidden after creation
    glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); // the window will be resizable

    int WIDTH = 300;
    int HEIGHT = 300;

    // Create the window
    window = glfwCreateWindow(WIDTH, HEIGHT, "Hello World!", NULL, NULL);
    if (window == NULL) {
        throw new RuntimeException("Failed to create the GLFW window");
    }

    // Setup a key callback. It will be called every time a key is pressed, repeated or released.
    glfwSetKeyCallback(window, keyCallback = new GLFWKeyCallback() {
        @Override
        public void invoke(long window, int key, int scancode, int action, int mods) {
            if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) {
                glfwSetWindowShouldClose(window, true); // We will detect this in our rendering loop
            }
        }
    });

    // Get the resolution of the primary monitor
    GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
    // Center our window
    glfwSetWindowPos(
            window,
            (vidmode.width() - WIDTH) / 2,
            (vidmode.height() - HEIGHT) / 2
    );

    // Make the OpenGL context current
    glfwMakeContextCurrent(window);
    // Enable v-sync
    glfwSwapInterval(1);

    // Make the window visible
    glfwShowWindow(window);
}

注意glfwWindowHint(GLFW_VISIBLE, GL_FALSE);提示被禁用,然后在创建窗口后,设置关键回调,绑定opengl上下文,它再次启用glfwShowWindow(window);

文档没有建议做这样的事情,删除这两行似乎没有任何改变。 为什么首先禁用提示

教程:https://lwjglgamedev.gitbooks.io/3d-game-development-with-lwjgl/content/chapter1/chapter1.html

1 个答案:

答案 0 :(得分:3)

它禁用可见性,因此它可以设置大小,更改位置和初始化上下文,而无需客户端见证它。来自GLFW docs中的Window Visablity部分:

  

最初可以隐藏窗口模式窗口   GLFW_VISIBLE窗口提示。隐藏的Windows完全是隐藏的   在显示之前对用户不可见。如果需要,这可能很有用   在显示之前进一步设置窗口,例如将其移动到   一个特定的位置。

你的程序通过调用

来遵循这个确切的例子
glfwSetWindowPos(
            window,
            (vidmode.width() - WIDTH) / 2,
            (vidmode.height() - HEIGHT) / 2
    );