【OpenGL学习】OpenGL窗口创建

OpenGL窗口创建

本节介绍如何在利用配置好的GLFW和GLAD进行一个简单窗口的绘制,首先明白在OpenGL中进行图形绘制到窗口的整个流程:

  • 初始化GLFW
  • 创建窗口window
  • 创建OpenGL上下文
  • 初始化Glad
  • 渲染循环
  • 结束绘制

初始化GLFW

然后我们从上面的流程逐步进行窗口创建,首先完成GLFW的初始化,代码如下:

	//Init
	//-----------------------------------------------------------------------
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

解释一下上面几行代码的含义,首先glfwInit()完成对GLFW的初始化,接着我们对Hint进行指定,因为使用的是OpenGL3.3,所以主版本号GLFW_CONTEXT_VERSION_MAJOR和副版本号GLFW_CONTEXT_VERSION_MINOR均设置为3,OPenGL的模式设置为GLFW_OPENGL_CORE_PROFILE,核心模式,关于核心模式见OpenGL介绍那节。完成上述操作之后,GLFW窗口的初始化就成功了。

创建窗口

使用函数glfwCreateWindow来创建一个GLFWwindow指针,持有我们创建的窗口,在函数中对窗口的各种属性进行指定,分别为窗口的宽和高,窗口的标题,以及后面两个GLFWmonitor和GLFWwindow的指针,可以设置为nullptr

	// glfw window creation
	// --------------------
	GLFWwindow* window = glfwCreateWindow(800, 600, "OPenGL", nullptr, nullptr);

窗口创建完成之后,确认是否创建成功,如果不成功,则直接退出程序:

	if (window == nullptr)
	{
		std::cout << "Failed to create window!" << std::endl;
		glfwTerminate();
		return -1;
	}

创建OpenGL上下文

创建openGL上下文主要是通过这个函数glfwMakeContextCurrent(window),传入的参数为我们创建好的窗口指针,这行代码执行完毕之后上下文就创建好了。

初始化Glad

Glad的初始化如下:

	// glad: load all OpenGL function pointers
	// ---------------------------------------
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Glad Initialized failed!" << std::endl;
		return -1;
	}

渲染循环

一切准备完毕之后就可以进行渲染了,也就是我们熟悉的 Render Loop:

	while(!glfwWindowShouldClose(window))
	{

		glClearColor(0.2f, 0.8f, 0.5f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		
		glfwSwapBuffers(window);
		glfwPollEvents();
	}

在没有点击关闭窗口的按钮前,会一直运行函数体内的内容,这里我放了一个清空颜色缓冲区的函数,每次执行循环的时候,都会用glClearColor()指定的颜色来进行清空,最终窗口显示的颜色就是指定颜色,函数glClear()是当前缓冲区使用什么内容清空的,一般有:

        GL_COLOR_BUFFER_BIT;   //表示清除当前可写的颜色缓冲
        GL_DEPTH_BUFFER_BIT:   // 深度缓冲
        GL_ACCUM_BUFFER_BIT:  // 累积缓冲
        GL_STENCIL_BUFFER_BIT : //模板缓冲

函数glfwSwapBuffers(window)会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),和当前显示在屏幕上面的缓冲进行交换,避免绘制的过程显示在屏幕上,可以参阅双缓冲这篇文章:双缓冲技术讲解_海洋_的博客-CSDN博客_双缓冲。

之后通过函数glfwPollEvents()将触发事件上传,比如各种输入等,事件系统可以参考unity手册中的描述:事件系统 - Unity 手册 (unity3d.com)。

渲染中的窗口如下:
【OpenGL学习】OpenGL窗口创建_第1张图片

结束绘制

绘制完成之后,结束程序,终止GLFW运行:

	// glfw: terminate, clearing all previously allocated GLFW resources.
   // ------------------------------------------------------------------
	glfwTerminate();

你可能感兴趣的:(OpenGL,学习)