创建一个最简单的窗口所需要的步骤:
1、添加需要的头文件
#pragma once
#include <glad/glad.h>
#include <GLFW/glfw3.h>
2、选择自己的glfw版本号,并设定绘制模式
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设定的是主版本号 3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设定的是次版本号 3
//综合起来就是选择glfw 3.3
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//现在设定的是绘制模式(profile) 选择的是核心模式(还有立即模式)
//glfwWindowHint(GLFW_FORWARD_COMPAT,GL_TRUE);//设置为mac os x系统下运作
3、创建窗口对象,并将窗口上下文设置成当前线程上下文(不要在意细节)
GLFWWindow *window = glfwCreateWindow(WIDTH, HEIGHT, NULL, NULL);
//宽 高
if(window == NULL)
{
cout<<"Failed to create window"<<endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);//将窗口上下文设置成当前线程的上下文
4、创建窗口大小变化时的回调函数framebuffer_size_callback(即窗口变化时调用来调整视口的函数,不理解复制代码即可,先忽视具体意义),再使用glfwSetFramebufferSizeCallback注册这个回调函数。
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
//保证视口匹配新窗口的尺寸,注意这里的宽高会显著大于视网膜显示屏上实际显示的宽高
glViewport(0, 0, width, height);
//前两个为左下角坐标,后两个为宽高
}
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//窗口对象 函数
此处的窗口对象就是之前创建的窗口对象,它代表着你的窗口,而视口则代表着这个窗口中你需要渲染的部分,glViewPort前两个参数决定绘制的图像的左下角坐标点,后两个参数决定绘制的图像的宽高。也就是说你把参数改成
glviewPort(width/2, height/2, width, height)//修改前两个参数
那么图像就会从窗口的中心开始绘制(即绘制出来的图像的左下角会在窗口中心);若把后两个改成
glViewPort(0, 0, width/2, height/2);//修改后两个参数
那么绘制出来的图像就会从窗口左下角开始,覆盖窗口左下角四分之一的面积。
所以你每次改变窗口大小的时候也要改变视口大小,保证它们匹配,这样窗口中的图像才能铺满窗口。
5、初始化glad,即装载glfw函数指针
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
cout<<"Failed to initialize GLAD!"<<endl;
return -1;
}
6、创建渲染循环,检测窗口是否需要关闭,绘制窗口
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//没按下会返回release
glfwSetWindowShouldClose(window, true);//设置窗口应当关闭
}
while(!glfwWindowShouldClose(window)) //检测窗口是否应当关闭
{
processInput(window); //处理按键输入
glClearColor(0.1, 0.2, 0.3); //使用rgb颜色清窗(绘制)
glClear(GL_COLOR_BUFFER_BIT); //清除指定缓冲,这里是颜色缓冲
glfwSwapBuffers(window); //为window交换缓冲
glfwPollEvents(window); //为window处理事件(按键等)
}
glfwTerminate(); //退出
return 0;
此处的glfwGetKey负责监听指定窗口的某个按键,按下后返回GLFW_PRESS,glfwWindowShouldClose负责检测并关闭窗口,它会在glfwSetWindowShouleClose设定了true时关闭窗口。glClearColor中的颜色为窗口中图像的实际颜色。
完整代码:
main.h
#pragma once
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>//数学库,先忽视
using namespace std;
namespace initialization {
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
// 宽高
const unsigned int SCR_WIDTH = 1280;
const unsigned int SCR_HEIGHT = 980;
GLFWwindow* init(int SCR_WIDTH, int SCR_HEIGHT)
{
// glfw: initialize and configure
// ------------------------------
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
//GLFW版本号设定 主版本号3,次版本号3,即3.3
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//模式设定 使用核心模式
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//MAC OS X使用
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //mac
#endif
//创建窗口
GLFWwindow* window =
glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "new begin", NULL, NULL);
//宽 高 标题
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();//终止
return NULL;
}
glfwMakeContextCurrent(window);
//将窗口上下文设置成当前线程的主上下文
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//注册窗口大小改变时的回调函数
// 装载全部的opengl函数指针(初始化glad)
// ---------------------------------------
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return NULL;
}
return window;
}
//输入回调函数,处理窗口的按键输入等
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//没按下会返回release
glfwSetWindowShouldClose(window, true);//关闭窗口
}
// 窗口大小变换时调用的函数,用来调整视口大小
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
//保证视口匹配新窗口的尺寸,注意这里的宽高会显著大于视网膜显示屏上实际显示的宽高
glViewport(0, 0, width, height);
//前两个为左下角坐标,后两个为宽高
}
}
main.cpp
#include"main.h"
int main()
{
using namespace initialization;
GLFWwindow *window = init(SCR_WIDTH,SCR_HEIGHT);
// render loop
// -----------
while (!glfwWindowShouldClose(window))
{
// render
// ------
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);//清除指定BUFFER
// input
// -----
processInput(window);
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
// -------------------------------------------------------------------------------
glfwSwapBuffers(window);//交换缓冲
glfwPollEvents();//处理事件响应
}
// glfw: terminate, clearing all previously allocated GLFW resources.
// ------------------------------------------------------------------
glfwTerminate();
return 0;
}