最近看完了GAMES101,接下来准备熟悉一下图形API~
先从OpenGL入手,找到了网站 LearnOpenGL
在此简要的记录一下,方便以后查阅
完整代码:https://gitee.com/Duo1J/learn-open-gl
一、环境配置
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.3
glfwWindowHint(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;
}
编译执行,顺利的话会看见以下窗口
下接: https://blog.csdn.net/weixin_44506615/article/details/149864439?spm=1001.2014.3001.5501