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);
}
}
运行效果如下:
参考文档:
Comments NOTHING