- 实例化glfw窗口
int main() { glfwInit();//初始化glfw glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//配置glfw,第一个参数代表选项的名称,我们可以从很多以GLFW_开头的枚举值中选择;第二个参数接受一个整形,用来设置这个选项的值 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); return 0; }
2. 创建窗口对象
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);//通知glfw将该窗口的上下文设置为线程主上下文
3. 初始化GLAD 管理OpenGL的函数指针
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; }
glfwGetProcAddress 用来加载与系统相关的OpenGL函数指针地址的函数。
4. 定义渲染窗口的尺寸大小
glViewport(0,0,800,600); //设置窗口的维度 座标为(0,0)在左下角,宽度为800,高度为600 (单位为 像素)
若要视口的大小随窗口的大小变化而变化,可通过注册一个回调函数(Callback Function)实现,函数原型如下“
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
这个帧缓冲大小函数需要一个GLFWwindow作为它的第一个参数,以及两个整数表示窗口的新维度。每当窗口改变大小,GLFW会调用这个函数并填充相应的参数供你处理。
void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); }
注册函数:
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
5.准备引擎
渲染循环:
while(!glfwWindowShouldClose(window)) {//每次循环的开始前检查一次GLFW是否被要求退出 glfwSwapBuffers(window);//检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置) glfwPollEvents(); //检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置) }
6. 输入
void processInput(GLFWwindow *window) { if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//一个窗口以及一个按键作为输入,函数将会返回这个按键是否正在被按下 glfwSetWindowShouldClose(window, true); }
检查用户是否按下了返回键(Esc)(如果没有按下,glfwGetKey将会返回GLFW_RELEASE。如果用户的确按下了返回键,我们将通过glfwSetwindowShouldClose使用把WindowShouldClose属性设置为 true的方法关闭GLFW。下一次while循环的条件检测将会失败,程序将会关闭。
7. 渲染
- 我们要把所有的渲染(Rendering)操作放到渲染循环中,因为我们想让这些渲染指令在每次渲染循环迭代的时候都能被执行
// 渲染循环 while(!glfwWindowShouldClose(window)) { // 输入 processInput(window); // 渲染指令 ... // 检查并调用事件,交换缓冲 glfwPollEvents(); glfwSwapBuffers(window); }
glClear函数用来清空屏幕的颜色缓冲,它接受一个缓冲位(Buffer Bit)来指定要清空的缓冲,可能的缓冲位有GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//设置填充的颜色 glClear(GL_COLOR_BUFFER_BIT);

浙公网安备 33010602011771号