openGL学习笔记(2):创建窗口

openGL学习笔记(2):创建窗口

首先,在main函数中调用glfwInit函数来初始化GLFW,然后可以使用glfwWindowHint函数来配置GLFW。
glfwWindowHint函数的第一个参数代表选项的名称;第二个参数用来设置这个选项的值。

	glfwInit();//初始化GLFW
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//OpenGL主版本号
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//OpenGL次版本号
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式(Core-profile)
	//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//Mac系统下

接下来创建一个窗口对象,这个窗口对象存放了所有和窗口相关的数据,而且会被GLFW的其他函数频繁地用到。

	//创建窗口对象
	GLFWwindow* window = glfwCreateWindow(800, 600, "WindowTitle", NULL, NULL);//创建窗口,指定宽、高、标题等
	if (window == NULL) {
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();//释放资源
		return -1;
	}
	glfwMakeContextCurrent(window);//将窗口的上下文设置为当前线程的主上下文

GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD。

	//初始化GLAD
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}

在开始渲染之前必须告诉OpenGL渲染窗口的尺寸大小,即视口(Viewport),这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标。

	//设置渲染窗口的尺寸大小,即视口(Viewport)
	glViewport(0, 0, 800, 600);//窗口左下角坐标、宽和高

然而,当用户改变窗口的大小的时候,视口也应该被调整。可以对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用。

void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
	glViewport(0, 0, width, height);
}

还需要注册这个函数,告诉GLFW每当窗口调整大小的时候调用这个函数

	//注册回调函数
	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

渲染循环

	//渲染循环
	while (!glfwWindowShouldClose(window)) { //检查GLFW是否被要求退出

		//输入
		processInput(window);

		//渲染指令
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);

		glfwPollEvents();//检查事件
		glfwSwapBuffers(window);//交换缓冲
	}

glfwWindowShouldClose函数在每次循环的开始前检查一次GLFW是否被要求退出,如果是的话该函数返回true然后结束渲染。
processInput是输入处理函数:

//输入处理函数
void processInput(GLFWwindow *window) {
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
		glfwSetWindowShouldClose(window, true);
}

检查用户是否按下了返回键(Esc)(如果没有按下,glfwGetKey将会返回GLFW_RELEASE。如果用户的确按下了返回键,我们将通过glfwSetwindowShouldClose使用把WindowShouldClose属性设置为 true的方法关闭GLFW。下一次while循环的条件检测将会失败,程序将会关闭。
调用glClearColor可以设置清空屏幕所用的颜色。当调用glClear函数,清除颜色缓冲之后,整个颜色缓冲都会被填充为glClearColor里所设置的颜色。
glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。
glfwSwapBuffers函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。

最后释放资源

	glfwTerminate();//释放资源

完整代码:

#include 
#include 
#include 

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

int main() {
	glfwInit();//初始化GLFW
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//OpenGL主版本号
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//OpenGL次版本号
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式(Core-profile)
	//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//Mac系统下

	//创建窗口对象
	GLFWwindow* window = glfwCreateWindow(800, 600, "WindowTitle", NULL, NULL);//创建窗口,指定宽、高、标题等
	if (window == NULL) {
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();//释放资源
		return -1;
	}
	glfwMakeContextCurrent(window);//将窗口的上下文设置为当前线程的主上下文

	//初始化GLAD
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}

	//设置渲染窗口的尺寸大小,即视口(Viewport)
	glViewport(0, 0, 800, 600);//窗口左下角坐标、宽和高

	//注册回调函数
	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

	//渲染循环
	while (!glfwWindowShouldClose(window)) { //检查GLFW是否被要求退出

		//输入
		processInput(window);

		//渲染指令
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);

		glfwPollEvents();//检查事件
		glfwSwapBuffers(window);//交换缓冲
	}

	glfwTerminate();//释放资源
	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)
		glfwSetWindowShouldClose(window, true);
}

运行效果:
openGL学习笔记(2):创建窗口_第1张图片

你可能感兴趣的:(OpenGL)