我正在研究GLFW应用程序,我在调整窗口大小时发现了一个问题.
当用户缩放窗口时,该glfwPollEvents()功能会一直等到用户完成.这意味着,在缩放窗口期间,不会调用渲染函数,并且会创建可怕的伪像.
我通过从主循环调用render函数以及窗口调整大小回调来解决这个问题:
#include <GLFW/glfw3.h>
static void render(GLFWwindow* window) {
glfwMakeContextCurrent(window);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
}
static void window_size_callback(GLFWwindow* window, int width, int height) {
render(window);
glViewport(0, 0, width, height);
}
int main(void) {
if (!glfwInit()) {
return -1;
}
GLFWwindow* window = glfwCreateWindow(640, 480, "Terrain chunk render", NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
glfwSetWindowSizeCallback(window, window_size_callback);
while (!glfwWindowShouldClose(window)) {
render(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,这意味着当用户在缩放窗口而不实际移动窗口之后按住鼠标按钮时,不会调用渲染功能.有没有一种有效的方法来解决这个问题并使渲染函数更加一致?
您应该将 移动glfwSetWindowSizeCallback(window, window_size_callback);到 while 循环中,以便在调整窗口大小时调用渲染函数。很久以前我也遇到过同样的问题。
编辑:不建议在循环中设置回调。只需要在调整窗口大小时重新绘制框架即可。