目录
1.环境搭建
自行安装vs2022/vs2019。
1-1.下载GLFW
GLFW是opengl的C库,需要使用该库进行编程。推荐下载GLFW源码包在vs2022中使用cmake工具进行编译,这样可以编译出适合自己操作系统和编译环境的GLFW库文件。
可在官网下载GLFW源码:Download | GLFW
1-2.安装Cmake
上面说到,要编译GLFW源码就得用到cmake工程管理工具,类似于linux环境下的makefile,有了它才能按照某种规则顺利编译源码。
在官网下载:Download | CMake
这里推荐下载.msi后缀文件,可以以GUI界面方式安装在电脑上。
安装好后桌面显示cmake图标。
1-3使用Cmake设置读取GLFW生成vs2022工程
使用vs2022编译代码得需要.sln工程,所以就需要先使用Cmake设置GLFW使其生成可以用vs2022打开的工程文件。
(1)解压glfw-3.3.8.zip到任意路径下,这里我放在自己创建的路径OpenGL_lib目录下。在glfw-3.3.8目录下创建一个文件夹build,用来存放配置生成的工程文件.sln。然后启动Cmake,按照如下图方式配置。
(2)出现下面打印信息就说明Cmake已经配置好了vs2022工程。从打印信息中可知该工程是根据自己的操作系统环境生成的。
1-4使用vs2022编译GLFW源码生成库文件
(1)在build目录下打开vs工程。
(2)点击生成解决方案。生成glfw3.lib,glfw帮助我们建立窗口,定义上下文、处理用户输入。
(3)新建一个GLFW_LIB目录,在该目录下再创建include和lib目录。将glfw-3.3.8/include/GLFW/下的.h文件和glfw-3.3.8/build/src/Debug下的.lib文件分别拷贝到我们创建的include和lib目录下。
(4)打开vs2022,创建空的c++项目(非控制台项目);在解决方案栏右击选择属性->打开VC++目录->添加库路径:
添加头文件路径和上面方法一样,如此就可以使用include <GLFW/…>了。
(5)然后来链接库,添加依赖:注意:opengl32.lib是安装vs2022时默认安装的。
(6)最后写个程序测试一下环境。
1-5 配置GLAD
安装编译glad,glad作用是为了把函数指针和显卡驱动里面的函数建立联系,因为各显卡厂商对于OpenGL标准的理解不同,写出来的驱动也不同。简单来说就是为了让我们的代码能在不同显卡厂家的设备上运行。glad只需要一行代码就可以解决本地函数指针到显卡驱动函数的映射。
(1)打开GLAD在线服务,按照下图选择,生成我们需要的版本包。
GLAD在线服务:https://glad.dav1d.de/
(2)下载.zip文件并解压。
(3)把include目录下的两个目录中的.h文件复制到之前的include文件中。
(4)添加GLAD/src/下的glad.c文件到你的工程中,修改这两处头文件,具体得根据你的include目录,如果你的include目录下还有文件夹,那就得用人家源码的写法,我的.h直接复制到include目录中所以这样改。
(5)以上工作准备就绪后注释掉这行代码,否则编译报错。
(6)写一段小程序测试环境搭建是否成功。
2.Hello窗口
之前搭建好的工程可以拷贝为以后编程使用,这里直接在之前环境搭建的工程上编程。
opengl.cpp
#include <glad.h> //glad.h需要在glfw.h之前
#include <glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);
int main()
{
//初始化glfw:选择opengl 3.3~4.2核心模式,取决于你的显卡驱动
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__ //如果是苹果操作系统
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL); //创建窗体对象:参数1:opengl窗口大小;参数2:窗口标题
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window); //设置当前窗口上下文设置为当前线程的上下文,之后才能在窗口进行绘制
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) //glad:加载所有OpenGL函数指针,固定写法就这一行
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
glViewport(0, 0, 600, 400); //设置opengl实际渲染的区域大小;0,0为左下角坐标
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); //注册窗口大小改变回调函数
while (!glfwWindowShouldClose(window)) //检查一次GLFW是否被要求退出,循环一次就是刷新一帧
{
processInput(window);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //设置颜色:深绿色
glClear(GL_COLOR_BUFFER_BIT); //刷新屏幕,使用设置的颜色
glfwSwapBuffers(window); //交换颜色缓冲(双缓冲):储存着GLFW窗口每一个像素颜色值作为输出显示在屏幕上
glfwPollEvents(); //轮训检查输入设备触发事件
}
glfwTerminate(); //释放分配的所有glfw资源
return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height) //窗口大小被改变就重新设置渲染区域大小
{
glViewport(0, 0, width, height);
}
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) //按Esc键关闭界面
glfwSetWindowShouldClose(window, true);
}
运行效果