LearnOpenGL CN学习笔记2-创建窗口

本节主要学习OpenGL显示一个空白窗口。可以改变背景色,按键ESC退出窗口。

代码结构如下:

1、初始化 GLFW库。
2、用GLFW库 创建窗口。

3、加载 GLAD库。
(由于调用OpenGL库函数需要通过GLAD库,所以在调用函数前加载GLAD库。)

4、设置视口
(代码没有设置camera,我给估计是这节并没有渲染任何东西所以没有设置camera。看看下面的视频估计就有了。)

5、注册各种回调函数

6、渲染循环
    处理鼠标、键盘
    清空屏幕背景
    处理各种渲染和绘制指令
    交换前后缓冲,将渲染结果显示输出。

7、清理GLFW库相关所有资源
(并没有清理GLAD库的资源)

 

具体代码和函数注释如下:

#include 
#include 
#include 
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);

int main()
{
	/*初始化 GLFW库*/
	glfwInit();//初始化GLFW
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);//OpenGL的版本号
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式(Core-profile)
	//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);// mac os 系统需要添加这句

	/*创建窗口*/
	GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);//宽,高,标题,
	if (window == NULL)
	{
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);//将窗口的上下文设置为当前线程

	/*初始化GLAD,需要调用OpenGL函数前加载GLAD库。*/
	//GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD
	//glfwGetProcAddress 是GLFW定义的 OpenGL函数指针地址
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}

	//设置视口,怎么没有camera的设置?
	glViewport(0, 0, 800, 600);//左下角,宽度和高度

	//注册各种回调函数
	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//注册窗口变化回调函数

	//渲染循环(Render Loop)
	while (!glfwWindowShouldClose(window))//检查一次GLFW是否被要求退出
	{
		processInput(window);//处理鼠标、键盘 的输入

		//清空屏幕
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//清空屏幕所用的颜色
		glClear(GL_COLOR_BUFFER_BIT);//清空屏幕的颜色缓冲

		//各种各种渲染和绘制操作指令

		//swap 交换前后缓冲,将渲染结果显示输出。
		glfwSwapBuffers(window);//交换颜色缓冲,并且输出显示到屏幕(双缓冲(Double Buffer))
		glfwPollEvents();//这个函数不太理解,解释如下暂时记录。
		//glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,
		//并调用对应的回调函数(可以通过回调方法手动设置)。
	}
	//清理 GLFW库。
	glfwTerminate();//正确释放/删除之前的分配的所有资源

	//清理 GLAD库。不需要吗?

	return 0;
}

//每次窗口大小被调整的时候被调用 回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
	glViewport(0, 0, width, height);
}
void processInput(GLFWwindow *window)
{
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//判断esc是否按下
		glfwSetWindowShouldClose(window, true);//把WindowShouldClose属性设置为 true的方法关闭GLFW
}

参考文章:

https://learnopengl-cn.github.io/01%20Getting%20started/03%20Hello%20Window/

 

你可能感兴趣的:(OpenGL)