学习OpenGL——第二天

45 阅读2分钟

OpenGL窗口创建与渲染基础


一、窗口创建

在OpenGL开发中,窗口的创建是图形渲染的第一步。以下是典型的窗口初始化代码示例:

#pragma region Initialize GLFW and GLAD
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // For MacOS

	GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "OpenGL Window", NULL, NULL);

	// Check if window creation was successful
	if (window == NULL) {
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return -1;
	}
	// Make the context of the window current
	glfwMakeContextCurrent(window);
	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

	// Initialize GLAD before calling any OpenGL function
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}
#pragma endregion

要点总结:

  • 初始化GLFW和GLAD,保证OpenGL环境可用。
  • 创建窗口,并检查是否成功。
  • 设置OpenGL上下文,注册窗口尺寸回调函数,确保窗口变化时能正确响应。

二、视口(Viewport)设置

在开始渲染前,必须设置OpenGL渲染窗口的尺寸(视口),以确保图形能够正确显示。

glViewport函数用法:

void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);

  • 作用:定义OpenGL渲染输出的视口区域。
  • 理解方式:类似在画布上指定一个“取景框”,告诉OpenGL在这个区域内绘制内容。
  • 重要性:控制最终图像在窗口中的显示位置和大小。

OpenGL会根据glViewport定义的位置和尺寸,将归一化坐标(-1到1)映射到实际屏幕坐标。例如,OpenGL坐标(-0.5, 0.5)可能被映射到屏幕坐标(200, 450)。这种机制方便适配不同分辨率和窗口大小。


三、渲染循环

渲染循环是OpenGL窗口持续响应与绘制的核心机制。典型代码如下:

while(!glfwWindowShouldClose(window)) { 
    glfwSwapBuffers(window); 
    glfwPollEvents(); 
}

核心流程说明:

  1. glfwWindowShouldClose
  • 检查窗口是否被要求关闭,若是则跳出循环,程序终止。
  1. glfwPollEvents
  • 处理所有窗口事件(如键盘、鼠标输入),并调用相关回调函数。
  1. glfwSwapBuffers
  • 交换前后缓冲区,将渲染结果显示到屏幕上。

关于双缓冲(Double Buffer)

单缓冲时,图像逐像素绘制,可能导致闪烁。双缓冲机制下,所有渲染操作先在“后缓冲”完成,随后与“前缓冲”交换,确保用户看到的始终是完整的最终图像,大幅提升显示效果的流畅度与真实感。