【OpenGL】LearnOpenGL学习笔记01 - 环境配置、窗口创建
最近看完了GAMES101,接下来准备熟悉一下图形API~
先从OpenGL入手,找到了网站 LearnOpenGL
在此简要的记录一下,方便以后查阅
一、环境配置
1. GLFW
GLFW是一个针对OpenGL的C语言库,它提供了一些渲染所需的最低限度的接口。我们可以通过它创建OpenGL上下文、定义窗口以及处理用户输入等。
可以在 GLFW 上下载源码或是编译好的文件
2.GLAD
实际上OpenGL是一个标准或是规范,其具体的实现是由驱动开发商针对不同的显卡实现的。因而OpenGL大多数的函数位置都无法在编译时确定下来,需要我们在运行时进行查询。并且在不同的平台上,取得函数地址的方法也不同,如Windows平台:
// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);
GLAD就是帮我们简化和封装这个过程的一个库,我们可以在 GLAD 上生产库文件
本文以版本3.3为例,Profile设置为Core并勾选Generate a loader后点击Generate
3.VS工程
接下来创建一个VS C++ 空工程,取名为OpenGLRenderer
然后右键项目属性在VC++目录中设置我们的头文件包含目录以及Lib目录,将GLFW和GLAD配置进去
然后选择链接器,在附加依赖项中配置glfw3.lib和opengl32.lib
对于Windows平台,opengl32.lib已经包含进Microsoft SDK中了,尽管它的名称中包含32,但是64位的版本也是用它
到这一步,环境配置就完成了~
二、窗口创建
直接上代码
#include <iostream>// 注意顺序,glad中有依赖检查
// 顺序错误编译会报错 #error: OpenGL header already included, remove this include, glad already provides it
#include <glad/glad.h>
#include <GLFW/glfw3.h>// 输入处理
void ProcessInput(GLFWwindow* window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE)){glfwSetWindowShouldClose(window, true);}
}// 窗口大小改变回调
void OnSetFrameBufferSize(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}int main()
{// glfw初始化glfwInit();// glfw设置OpenGL版本为3.3glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// glfw设置OpenGL为核心(Core)模式// 核心模式相较于立即渲染模式(Immediate mode,也就是固定渲染管线,现已废弃),拥有更高的灵活性glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建一个窗口对象GLFWwindow* window = glfwCreateWindow(1280, 720, "OpenGLRenderer", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}// 设置为当前上下文glfwMakeContextCurrent(window);// 初始化glad加载器if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// 注册窗口大小改变回调glfwSetFramebufferSizeCallback(window, OnSetFrameBufferSize);// 主循环while (!glfwWindowShouldClose(window)){// 清屏glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 输入处理ProcessInput(window);// ...之后会做其他事情// 双缓冲切换glfwSwapBuffers(window);// 检查事件触发,如窗口大小改变,调用对应回调函数glfwPollEvents();}// 资源清理glfwTerminate();return 0;
}
编译执行,顺利的话会看见以下窗口