GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。

首先用在main中用glfwInit进行初始化GLFW,用glfwWindowHint函数来配置GLFW,该函数的选项及对应值都可以在这GLFW’s window handling这篇文章中找到。

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    //mac系统需要加这一条配置
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

    return 0;
}

glfwWindowHint函数的第一个参数代表选项的名称。

第二个参数接受一个整型,用来设置这个选项的值,因为我用的是glfw3,所以在这里填3。

下面用glfwCreateWindow函数来创建一个窗口对象,前两个参数是框口宽高,第是三个参数是窗口名称,第四、五个参数返回GLFWmonitor和GLFWwindow对象后续会用到,这里暂时用不到,该函数返回一个glfwWindow的对象。

GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);

使用glfwMakeContextCurrent函数在当前线程中打开一个窗口。

GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window);

值得注意的是glfwCreateWindow函数返回的对象进行一下判空,如果是NULL的话用glfwTerminate来终止该程序。

GLFWAPI void glfwTerminate(void);
    if (window == NULL)
    {
	std::cout << "Failed to create GLFW window" << std::endl;
	glfwTerminate(); //终止
	return -1;
    }

运行这段代码可以打开一个窗口,窗口左上角是我们定义的名字。

GLFW中实现输入控制,相当于unity当中的Input控制键盘鼠标等一系列的指令。

使用glfwGetKey函数,相当于unity当中的GetKey方法,在c++中叫函数,在c#中叫方法,习惯了ヽ(°▽、°)ノ

void processInput(GLFWwindow *window)
{
    if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

上面自定义函数的操作是传入一个GLFWwindow对象,判断按下的是否是Esc,

通过则关闭GLFWwindow窗口。

GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value);

glfwSetwindowShouldClose函数中value值为true关闭GLFW,下次循环中条件检测会失败,程序将会关闭。

while (!glfwWindowShouldClose(window))
{
    processInput(window);
    glClearColor(0,0.5f,0.5f,0);
    glClear(GL_COLOR_BUFFER_BIT);
    glfwSwapBuffers(window);
    glfwPollEvents();
}

glClear函数的作用是清除屏幕上的缓存可能的缓冲位有GL_COLOR_BUFFER_BIT(颜色缓存),GL_DEPTH_BUFFER_BIT(深度缓存)和GL_STENCIL_BUFFER_BIT(模板缓存),glClearColor函数用来设置清空屏幕所用的颜色,相当于unity Camera上的Clear Flags设置Solid Color。

glfwSwapBuffers函数的作用是刷新buffer。

glfwPollEvents函数用来接收用户输入的事件。

完整代码如下:

#define GLEW_STATIC
#include "GL/glew.h"
#include "GLFW/glfw3.h"

#include "iostream"

int const WIDTH = 1280;
int const HEIGHT = 720;
char const *TITLE = "OpenGL Game Scene";

void processInput(GLFWwindow* window);

int main()
{
	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); //mac系统需要加

	//Open GLFW Window
	GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, TITLE, NULL, NULL);
	if (window == NULL)
	{
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate(); //终止
		return -1;
	}
	glfwMakeContextCurrent(window);

	//Init GLFW
	glewExperimental = true;
	if (glewInit() != GLEW_OK)
	{
		std::cout << "Failed to init GLFW window" << std::endl;
		glfwTerminate(); //终止
		return -1;
	}

	while (!glfwWindowShouldClose(window))
	{
		processInput(window);
		glClearColor(0,0.5f,0.5f,0);
		glClear(GL_COLOR_BUFFER_BIT);
		glfwSwapBuffers(window); //刷新buffer
		glfwPollEvents(); //接收用户输入事件
	}

	glfwTerminate();

	return 0;
}

/// <summary>
/// 输入处理
/// </summary>
/// <param name="window"></param>
void processInput(GLFWwindow* window)
{
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
	{
		glfwSetWindowShouldClose(window, true);
	}
}

运行效果如下:

参考文档:

中文:https://learnopengl-cn.github.io/

英文:https://learnopengl.com/

glfw:https://www.glfw.org/

最后更新于 2021-11-09