我尝试使用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);
}
}
答案 0 :(得分:2)
GLFW窗口使用两个颜色缓冲区。其中一个缓冲区是当前显示的缓冲区(即保存窗口内容的缓冲区,如您现在所见)。另一个是在后台缓冲区中。所有OpenGL绘图命令(glClear
,glDrawArrays
)都会渲染到后台缓冲区中。这样做是为了避免screen tearing,当您在显示缓冲区时进入缓冲区时会发生这种情况,从而导致部分图像被绘制,因此比其他部分更早显示,从而导致闪烁效果。
现在因为所有命令只在后台缓冲区中绘制,所以它们实际上并没有显示在窗口中,这意味着您只看到了白色背景。您必须通过调用glfwSwapBuffers(window)
告诉GLFW您要交换缓冲区。然后显示的缓冲区成为后台缓冲区(并准备好用于新的绘图命令),后台缓冲区成为显示的缓冲区,这意味着您在前一帧中绘制的所有内容现在都显示在窗口中。然后你可以清除背景缓冲区并渲染下一帧。
简而言之:在GLFW.glfwSwapBuffers(window);
末尾添加mainloop
。