OpenGl学习记录
学习参考文档: LearnOpenGL https://learnopengl-cn.github.io/
部分问题:
- 在搭建openGl环境时vs工程属性的平台选择错误(一开始选择为Win32),导致引入头文件时无法识别
- 引入glad生成文件中的glad.c文件时vs没有识别为c语言,导致编译后报错显示找不到glad的相关函数
环境搭建:
-
GLFW
这里使用了CMake来生成glfw3.lib文件,并引用了源文件中的include文件夹,然而实际上GLFW的官网有编译好的文件(刚开始本人不知道怎么用,搞了半天还是选择了自己编译)
总结一下,我们在项目中实际运用到的文件为include文件夹下的GLFW文件夹(里面有两个头文件glfw3.h和glfw3native.h),另外我们还需要一个glfw3.lib文件
-
GLAD (https://glad.dav1d.de/)
这里选择参考了LearnOpenGL文档里的做法,Language选择为C/C++,gl版本选择为3.3,Profile选择为Core,其它保持默认状态,之后点击GENERATE,下载生成的glad.zip文件
该文件内含有两个文件夹,其中include文件夹下有glad和KHR两个文件夹,src文件夹下有一个glad.c文件
-
准备工作
- 创建一个include文件夹,将上面两步得到的三个文件夹(GLFW,glad和KHR)放进去
- 创建一个lib文件夹,将第一步得到的glfw3.lib文件放进去
- 将glad.c文件保存好
- 创建项目
- 使用了vs2022创建一个空项目,然后在项目源文件夹下创建src目录,将glad.c文件放进去,同时创建一个main.cpp文件
- 在解决方案资源管理器中打开项目的属性页,将配置改为所有配置,平台改为活动(x64)
- 在配置属性下的VC++目录内将第三步创建的include文件夹添加进包含目录,并将lib文件夹添加进库目录
- 在链接器下的输入中将glfw3.lib添加进附加依赖项
到这里环境的配置就好了,我们可以在main.cpp下引入相应的头文件查看是否成功引入
#include <glad/glad.h>
#include <GLFW/glfw3.h>
写一个引擎窗口:
这里按照文档的代码测试了一下能否正常运行,最后确实生成了一个深色的引擎窗口
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
//创建一个回调函数保证窗口大小被调整时调用
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
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);
//创建一个800×600的窗口对象,标题为LearnOpenGL
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
//通知GLFW将窗口的上下文设置为当前线程的主上下文
glfwMakeContextCurrent(window);
//初始化glad
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
//告知OpenGL渲染窗口的大小为800×600,左下角的位置为0,0
glViewport(0, 0, 800, 600);
//告知OpenGL调整窗口大小
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//渲染循环,glfwWindowShouldClose函数会在glfw被要求退出时返回true
while (!glfwWindowShouldClose(window))
{
//按键输入事件
processInput(window);
//设置一个清屏颜色
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
//执行清屏,这里选用的参数只会清除颜色缓冲
glClear(GL_COLOR_BUFFER_BIT);
/*
渲染部分
*/
//交换颜色缓冲
glfwSwapBuffers(window);
//检查触发事件
glfwPollEvents();
}
//循环结束后释放资源
glfwTerminate();
return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
void processInput(GLFWwindow* window)
{
//当我们输入按下esc键后glfw会被告知退出
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}