Lwjgl 3白色屏幕

时间:2015-04-17 22:42:13

标签: java opengl window lwjgl glfw

我尝试使用VAO,VBO和DrawArrays()渲染一个Rectangle。现在我用GLFW设置了窗口,出现了一个窗口。即使我更改了清晰的颜色并调用glClear(),窗口也始终为白色。

我的窗口创建代码:

public static long createWindow(int width, int height, String title){

    long window;
    window = GLFW.glfwCreateWindow(width, height, title, MemoryUtil.NULL, MemoryUtil.NULL);

    if (window == MemoryUtil.NULL) {
        GLFW.glfwTerminate();
        System.out.println("Couldn't create window");
        System.exit(-1);
    }

    GLFW.glfwMakeContextCurrent(window);
    GLFW.glfwSwapInterval(1);
    GLFW.glfwShowWindow(window);
    GLContext.createFromCurrent();
    GL11.glClearColor(0.0f, 0.0f, 0.5f, 1.0f);
    GLFW.glfwSwapInterval(1);
    GLFW.glfwShowWindow(window);
    System.out.println("OpenGL version: " + GL11.glGetString(GL11.GL_VERSION));
    return window;

My Mainloop:

public class Mainloop {
public static void mainloop(int vaoID,int vboID, int vertexCount, long window, ShaderProgram Shader){
    //Setup Before Rendering
    GL11.glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
    GLFW.glfwPollEvents();
    //Bind Arrays
    GL30.glBindVertexArray(vaoID);
    GL20.glEnableVertexAttribArray(0);
    //Bind Shader
    Shader.start();
    //Render
    GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, vertexCount);
    //Clean-up Shader
    Shader.stop();
    //Clean-up Array
    GL20.glDisableVertexAttribArray(0);
    GL30.glBindVertexArray(0);

    }
}

1 个答案:

答案 0 :(得分:2)

GLFW窗口使用两个颜色缓冲区。其中一个缓冲区是当前显示的缓冲区(即保存窗口内容的缓冲区,如您现在所见)。另一个是在后台缓冲区中。所有OpenGL绘图命令(glClearglDrawArrays)都会渲染到后台缓冲区中。这样做是为了避免screen tearing,当您在显示缓冲区时进入缓冲区时会发生这种情况,从而导致部分图像被绘制,因此比其他部分更早显示,从而导致闪烁效果。

现在因为所有命令只在后台缓冲区中绘制,所以它们实际上并没有显示在窗口中,这意味着您只看到了白色背景。您必须通过调用glfwSwapBuffers(window)告诉GLFW您要交换缓冲区。然后显示的缓冲区成为后台缓冲区(并准备好用于新的绘图命令),后台缓冲区成为显示的缓冲区,这意味着您在前一帧中绘制的所有内容现在都显示在窗口中。然后你可以清除背景缓冲区并渲染下一帧。

简而言之:GLFW.glfwSwapBuffers(window);末尾添加mainloop