刚开始学OpenGL最折磨人的往往不是着色器语法,不是矩阵变换,而是第一步:环境折腾半天,窗口就是弹不出来。网上教程十有八九是Visual Studio的,用VS Code的又经常遇到“我明明照着做了,怎么还是报错”。你搜“SolidWorks软件里的使用软件OpenGL需要勾选吗”,搜“OpenGL技术文档”,最后都会绕回到同一件事:把OpenGL的开发环境跑起来。
这篇博客就解决这个问题。我用Windows + VS Code + GLFW 3.4 + GLAD这套组合,从零开始把环境一步步搭好,每个细节都说明白,包括那些教程里不会告诉你、但新手十有八九会踩的坑。最后你会看到一个能正常跑起来、能显示窗口的第一个OpenGL程序。这篇文章适合刚接触OpenGL的学生、自学图形学的开发者,也适合需要在Windows上配置图形开发环境的从业者参考。
1. 这套组合到底是怎么回事
1.1 OpenGL不是库,GLFW和GLAD才是
先说清楚这个最容易被绕晕的点。OpenGL本身不是一个可以直接下载安装的“库”,它更像一份规范——规定了显卡驱动要提供哪些函数接口。真正干活的是显卡驱动,而OpenGL的API(比如glClearColor、glDrawArrays)是在驱动里的。但问题来了:你写代码的时候要去哪里拿这些函数的声明?
这时候就需要两样东西:
- GLFW负责创建窗口和上下文。OpenGL本身是不管窗口的,你得有个窗口才能画画,GLFW就是干这个的。它还处理鼠标、键盘输入,跨平台。我们用的版本是GLFW 3.4,这是目前最新的稳定版。
- GLAD负责加载OpenGL函数指针。因为OpenGL的接口在不同显卡驱动里的地址不一样,不能直接链接,必须在运行时去取。GLAD会帮你生成这样一段代码:调用之前先把所有用到的函数指针都加载好。
所以这套组合里的两个库分工明确:GLFW管窗口,GLAD管函数指针。再加上MinGW-w64编译器,就能在VS Code里完成“编辑—编译—运行”。
1.2 为什么不用Visual Studio,而选VS Code
大型游戏引擎、工业级项目确实更多用Visual Studio,它开箱即用,配置少,调试也舒服。但如果你是新手,或者只是写一些图形学课程作业、小demo,VS Code的组合反而更轻快。
一个重要前提是:VS Code本身只是编辑器,编译得靠命令行工具链。所以我们额外需要MinGW-w64。很多新手卡在这一步,觉得“VS Code装好了,为什么不能编译”——因为编译器还没装。
对比一下两个方案:
| 方案 | 上手成本 | 调试体验 | 适用场景 |
|---|---|---|---|
| Visual Studio + NuGet安装GLFW/GLAD | 低,图形界面点选即可 | 非常好 | 大项目、长期维护 |
| VS Code + MinGW-w64 + 手动配置GLFW/GLAD | 中高,需自己配路径和编译参数 | 中等,配置齐全后也不错 | 学习、轻量项目、跨平台习惯养成 |
我推荐VS Code这套,还有一个原因:背后的编译命令你全都能看到、能控制,不会出现“IDE帮我魔法般弄好了但我不知道发生了什么”的情况。对学习图形学的人来说,理解编译过程本身就很值钱。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 搭建前必须搞懂的背景知识
2.1 OpenGL版本选择的逻辑
OpenGL从3.3开始引入了Core Profile(核心模式),把老旧的固定功能管线全部删掉了。从3.3往后,4.0、4.1一路到4.6,核心模式的基础框架没变过,区别主要体现在一些新特性上。现在的主流教程基本都是基于3.3 Core,这个版本既是学习的标准起点,也兼容几乎所有现代显卡。
这里要提醒一句:别迷信最高版本。你在GLAD里选择4.6当然可以,但学习阶段用3.3,教程好找,兼容性也最强。你的显卡驱动只要不是古董,都是支持4.0以上版本的。真正重要的不是版本号,而是理解着色器、VAO/VBO/EBO这套现代管线。
2.2 环境变量和PATH到底是怎么回事
新手配置MinGW-w64最容易栽在PATH上。PATH是Windows用来查找可执行文件的路径列表。你在命令行敲g++,系统会按PATH里列出的目录逐个找g++.exe。
装好MinGW-w64后,bin文件夹里放着g++.exe。你必须把bin目录加到PATH里,才能在任意位置调用g++。判断是否成功的方法就是新开一个终端窗口,输入:
bash复制g++ --version
注意,一定要新开终端窗口——如果你在修改PATH之前就已经开着终端,那个窗口不会自动读到新的PATH,得关掉重开。这是小事,但我见过太多人卡在这。
2.3 静态库、动态库、运行时的区别
GLFW我们一般用静态库(.a文件),意思是在你编译程序时,编译器把GLFW的代码直接复制进你的exe里。好处是运行时不依赖额外的dll文件。动态库(.dll)则是运行到一半才去加载,exe会小一些,但发布程序时得把dll一起带上。
新手阶段建议用静态库,省去一堆路径和运行时的问题。后面如果你要做一个正式的项目,再考虑动态库的部署方式。
3. 环境准备:从零开始的三件套
3.1 VS Code安装与插件
先到官网下载VS Code的用户安装版(User Installer),一路Next安装即可。然后打开扩展面板,按Ctrl+Shift+X,搜索并安装以下插件:
- C/C++(Microsoft官方出的,提供语法提示、IntelliSense、调试支持)
- C/C++ Extension Pack(会带上调试、主题等辅助组件)
这两个装完后,VS Code就能识别C++代码了。不过再次强调:它还不会编译,因为缺编译器。
3.2 MinGW-w64安装与环境变量配置
这步最容易踩坑。网上很多旧教程让你从SourceForge下载MinGW的安装器,那个项目很久没更新了。建议直接去MinGW-w64的官方GitHub页面下载压缩包版本,具体操作如下:
- 访问MinGW-w64的GitHub Releases页面,下载x86_64-win32-seh(或win64-ucrt)版本的压缩包。
- 解压到一个不含中文和空格的路径,比如
D:\mingw64。这里有个关键点:很多人非要解压到C:\Program Files下,路径里带空格,后面写配置的时候经常出幺蛾子。直接放D盘根目录最省心。 - 打开系统环境变量设置:右键“此电脑” → 属性 → 高级系统设置 → 环境变量。
- 在“系统变量”里找到Path,编辑,新增一条
D:\mingw64\bin。 - 新开终端,输入
g++ --version确认安装成功。
注意:如果终端提示“g++不是内部或外部命令”,先检查你是不是新开的终端窗口,再检查bin目录路径是否真的指向了包含g++.exe的那个文件夹。按顺序排查,99%的问题出在这两步。
3.3 验证编译器的第一个小程序
随便创建一个文件夹,比如D:\opengl_learn,在里面新建一个hello.cpp:
cpp复制#include <iostream>
int main() {
std::cout << "Hello, OpenGL setup!" << std::endl;
return 0;
}
打开VS Code,用“文件→打开文件夹”打开这个目录。按Ctrl+`打开终端,输入:
bash复制g++ hello.cpp -o hello.exe
.\hello.exe
如果能看到输出,说明这一步成功了。这个最小程序的验证价值在于:把编译器问题从后面的GLFW/GLAD配置问题中隔离出来。要是这一步都报错,后面配置再精致也白搭。
4. GLFW 3.4的获取与编译
4.1 获取预编译二进制包还是源码编译
GLFW 3.4有两种获取方式:
- 直接下载官方预编译二进制包(glfw-3.4.bin.WIN64.zip),里面有头文件和库文件。
- 下载源码,用CMake自己编译。
对新手的建议是:直接用预编译包。因为GLFW是C写的,对编译器的版本要求不算太敏感,官方预编译的库基本能用。但有一个前提:我们用的是MinGW工具链,而官方预编译包里哪个库能直接用、哪个库会有兼容性坑,需要先搞清楚。
官方预编译包解压后会有:
include/GLFW/glfw3.h(头文件)lib-mingw-w64/(MinGW可用的库文件,这个就是我们要的)lib-vc2019/、lib-vc2022/(Visual Studio的库,我们用不上)
所以下载解压后,我们只需要关注那个lib-mingw-w64目录。我推荐直接下载预编译包,因为省时间,也不用在CMake上折腾。
当然,如果你以后想修改GLFW源码或者需要特定的编译选项,再考虑自己编译不迟。学习阶段,预编译包完全够用。
解压后,建议把整个文件夹放到一个统一的位置,比如D:\opengl_learn\external\glfw。这样后面配置路径时很清楚。下面是我习惯的目录结构,你可以参考:
code复制D:\opengl_learn\
├── external\
│ ├── glfw\
│ │ ├── include\
│ │ └── lib-mingw-w64\
│ └── glad\
│ ├── include\
│ └── src\
└── projects\
└── first_window\
├── main.cpp
└── .vscode\
注意:
lib-mingw-w64目录下有libglfw3.a和libglfw3dll.a两份库文件。前者是静态库,我们用它;后者是配合dll使用的导入库,不要选错。还有,这个目录里一般也有glfw3.dll,如果你选了静态链接,运行时不需要这个dll;如果选了动态链接,就得把它复制到exe旁边。
4.2 CMake配置概述
如果你最终选择自己编译GLFW(比如预编译包里的库和你系统有兼容性问题),需要下载CMake和源码。大致流程是:
- 下载GLFW 3.4源码压缩包,解压到
D:\opengl_learn\external\glfw_source。 - 打开CMake GUI,源码目录选GLFW源码根目录,构建目录设置为
D:\opengl_learn\external\glfw_build。 - 点击Configure,选择“MinGW Makefiles”作为生成器。
- 指定编译器:需要手动指出gcc和g++的路径,比如
D:\mingw64\bin\gcc.exe和D:\mingw64\bin\g++.exe。 - 构建后,生成静态库
libglfw3.a。
这个流程本身不复杂,但新手经常在CMake的生成器选择上栽跟头。如果选成了Visual Studio生成器,出来的库是.lib格式,MinGW链接不了。所以要走源码编译路线,生成器一定选MinGW Makefiles。
我的观点很直接:能把预编译包跑通就先别碰CMake源码编译。把精力留给着色器,等你需要定制GLFW时再学CMake也不迟。
4.3 目录整理技巧,避免后续配置混乱
预编译包解压后,文件夹里还带一堆文档和CMake配置。为了后面配置VS Code时路径简洁,建议把GLFW的核心文件抽出来,整理成干净的目录:
假设你在D:\opengl_learn\external\glfw下:
code复制├── include\
│ └── GLFW\
│ ├── glfw3.h
│ └── glfw3native.h
└── lib\
└── libglfw3.a
把lib-mingw-w64\libglfw3.a复制一份到lib\,这样做的好处是VS Code配置的时候只需要记住一个lib路径。很多教程让你直接用原目录的路径,也行,但路径越短、层级越整齐,后面排错越省事。
5. GLAD的获取与配置
5.1 GLAD在线服务页面怎么填
GLAD有一个在线生成服务:glad.dav1d.de。打开后需要填一些选项,新手最容易不知道该怎么选。按下面来:
- API → gl → Version选
3.3。 - Profile选
Core。 - 勾选
Generate a loader。 - Language选
C/C++。
然后点击生成按钮,下载得到glad.zip。解压后里面有:
include/glad/glad.hinclude/KHR/khrplatform.hsrc/glad.c
把include和src整理到项目目录下,和其它依赖放一起。我建议这样放:
code复制D:\opengl_learn\external\glad\
├── include\
│ ├── glad\
│ │ └── glad.h
│ └── KHR\
│ └── khrplatform.h
└── src\
└── glad.c
这里有个坑:很多人只复制了glad.h,忘了KHR文件夹里的khrplatform.h。编译的时候会报“找不到khrplatform.h”。记住,这两个头文件缺一不可。
5.2 glad.c和glfw3.h的依赖关系
GLAD生成的glad.c里会include glad.h,而glad.h里又依赖KHR/khrplatform.h。这串依赖关系顺下来就不难理解了。所以你在项目的include路径里,必须能让编译器同时找到三个东西:
- GLFW的头文件目录:
external/glfw/include - GLAD的头文件目录:
external/glad/include
你可以把GLFW和GLAD的include都指向各自的上一级目录,这样编译器在搜索glfw3.h和glad.h时就能各取所需。
顺带一提,GLFW和GLAD的头文件名不同,不会冲突。但如果你以后引入内容加载库(比如stb_image),注意别把GLAD放在一个名字很通用的目录里,免得和其他库的头文件重名打架。
6. 第一个OpenGL窗口程序
6.1 创建项目并编写你的main.cpp
环境都就位了,现在开始写第一个OpenGL程序。我们要做的是:创建一个窗口,设置清除颜色,在背景色变化中验证整个环境是否真正跑通。
在D:\opengl_learn\projects\first_window下新建main.cpp,内容如下:
cpp复制#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
glViewport(0, 0, width, height);
}
int main() {
// 初始化GLFW
if (!glfwInit()) {
std::cerr << "Failed to initialize GLFW" << std::endl;
return -1;
}
// 配置GLFW:使用核心模式,版本3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// 创建窗口
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Window", NULL, NULL);
if (window == NULL) {
std::cerr << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// 加载OpenGL函数指针
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cerr << "Failed to initialize GLAD" << std::endl;
return -1;
}
// 设置视口
glViewport(0, 0, 800, 600);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 渲染循环
while (!glfwWindowShouldClose(window)) {
// 设置清除颜色为深蓝色
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
这段代码的逻辑很直白:初始化GLFW → 创建窗口 → 用GLAD加载OpenGL函数 → 进入渲染循环。注意gladLoadGLLoader必须在glfwMakeContextCurrent之后调用,否则拿不到有效的函数指针。这也是网上报错常见的原因之一,顺序反了就崩。
6.2 配置tasks.json——编译任务的灵魂
在VS Code里,编译动作通过tasks.json来定义的。新建.vscode/tasks.json:
json复制{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "cppbuild",
"command": "D:\\mingw64\\bin\\g++.exe",
"args": [
"-g",
"main.cpp",
"-I",
"D:/opengl_learn/external/glfw/include",
"-I",
"D:/opengl_learn/external/glad/include",
"-L",
"D:/opengl_learn/external/glfw/lib",
"-lglfw3",
"-lglad",
"-lopengl32",
"-lgdi32",
"-luser32",
"-lkernel32",
"-o",
"main.exe"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": ["$gcc"]
}
]
}
这里的编译参数是整套环境的精髓,逐个解释:
-g:生成调试信息,配合后面配置的调试功能。-I:指定头文件搜索路径,让编译器找到glfw3.h和glad.h。-L:指定库文件搜索路径,让链接器找到libglfw3.a。-lglfw3:链接GLFW静态库。-lglad:注意!这里链接的是glad.c编译出来的目标文件,因为我们把glad.c当成了项目源码来编译。-lopengl32、-lgdi32、-luser32、-lkernel32:Windows系统库,OpenGL在Windows上必须要链接这些。
刚才那里我写了-lglad,这种方式其实需要你先把glad.c单独编译成glad.o再链接,对新手有些绕。更简单的做法是直接把glad.c当作源文件喂给g++。也就是改成:
json复制"args": [
"-g",
"main.cpp",
"D:/opengl_learn/external/glad/src/glad.c",
"-I",
"D:/opengl_learn/external/glfw/include",
"-I",
"D:/opengl_learn/external/glad/include",
"-L",
"D:/opengl_learn/external/glfw/lib",
"-lglfw3",
"-lopengl32",
"-lgdi32",
"-luser32",
"-lkernel32",
"-o",
"main.exe"
]
这样更直接,glad.c会连同main.cpp一起被编译链接,不用额外处理。说实话,对新手来说,这种直接在命令行里列出所有源文件的方式,比整什么构建系统要简单得多。
6.3 配置launch.json——调试三件套之一
编译能过、能运行,但出了bug你得能调试。新建.vscode/launch.json:
json复制{
"version": "0.2.0",
"configurations": [
{
"name": "Debug OpenGL",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/main.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build"
}
]
}
这里唯一可能需要改的就是miDebuggerPath,确保它指向你MinGW安装目录下的gdb.exe。preLaunchTask指定为我们刚才定义的build,这样按F5的时候会先自动编译,再启动调试。
6.4 配置c_cpp_properties.json——解决IntelliSense报错
你不配置这个文件,编译其实能过,但VS Code的代码分析器(IntelliSense)可能一直飘红,说找不到glfw3.h。新建.vscode/c_cpp_properties.json:
json复制{
"configurations": [
{
"name": "Win64",
"includePath": [
"${workspaceFolder}/**",
"D:/opengl_learn/external/glfw/include",
"D:/opengl_learn/external/glad/include"
],
"defines": [],
"compilerPath": "D:/mingw64/bin/g++.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}
includePath这里配置的是给IntelliSense看的,不参与实际编译。实际编译靠的是tasks.json里的-I参数。两处要同步维护,如果你改了目录结构,记得两处都改,不然会出现“提示不报错,编译却报错”或者反过来“提示报错,编译却过”的诡异状态。
6.5 编译运行并验证
按Ctrl+Shift+B执行编译任务,终端里会输出g++的运行结果。如果一切顺利,会生成main.exe。然后在VS Code里按F5或者直接运行.\main.exe,应该会弹出一个800x600的深蓝色窗口,标题是“OpenGL Window”。
这个窗口出现,说明你的整套环境已经通了:VS Code能编译,MinGW能编译,GLAD能加载函数,GLFW能创建窗口。后面写着色器、画三角形,都建立在这个基础上。
7. 实战中的坑,我把它们逐个记下来
7.1 undefined reference to glfwInit
链接错误,提示undefined reference to 'glfwInit',这类错误几乎都是链接器找不到库文件。排查顺序:
-L路径是否正确,libglfw3.a是否在这个目录下。-lglfw3的写法是否正确。注意,写-lglfw3会去找libglfw3.a,Windows下很多新手会写成-lglfw或者-lGLFW,大小写和写法不对就链接不上。- 确认自己链接的是
lib-mingw-w64下的.a文件,而不是lib-vc2022下的.lib文件。MinGW和Visual Studio的库文件格式不同,不能混用。
7.2 编译报错:找不到glfw3.h
这个错误很直接,就是头文件路径不对。检查tasks.json里的-I路径是否正确指到了include目录。注意路径分隔符:Windows下用正斜杠/或双反斜杠\\都可以,但别用单反斜杠\加普通字母的组合,比如\i在某些情况下会被解析成转义字符,产生奇怪的问题。
提示:如果VS Code的includePath没配好,IntelliSense会报错,但编译不一定报。反过来,如果IntelliSense不报错,说明includePath大概率是对的,但tasks.json里没写,编译照样挂。两个文件要一起看。
7.3 窗口创建失败(Failed to create GLFW window)
这个问题出现的频率不高,但一旦遇到就比较难受。常见原因:
- 显卡驱动跟不上,老机器特别容易出现。更新显卡驱动试试。
- 虚拟机里跑OpenGL,虚拟显卡不支持硬件OpenGL。如果在VMware或VirtualBox里,需要开启3D加速。实机操作最稳妥。
- 代码里设置了GLFW_OPENGL_CORE_PROFILE,但显卡驱动只支持旧版OpenGL。可以尝试把版本号从3.3降到3.0,或者干脆不设置Version和Profile,让GLFW自己选择兼容模式。
有一种可能性你搜过“solidworks软件里的使用软件OpenGL需要勾选吗”也见过:OpenGL依赖显卡驱动的硬件加速。SolidWorks里那个OpenGL选项其实就是让你选择软件渲染还是硬件加速。如果显卡驱动不行,SolidWorks里OpenGL显示灰色,同样在GLFW里也会创建窗口失败。桌面环境检查一下显卡驱动,别在这上面卡太久。
7.4 编译通过一运行就崩溃
程序一启动就崩溃,大概率是GLAD加载失败。排查:
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)是不是在glfwMakeContextCurrent之后?顺序反了会拿到空的函数指针。glad.c有没有被编译进去?如果你用我之前说的源文件方式,确认路径没错;如果你用-lglad链接,确认glad.o真的存在且是同一个架构编译的。
这类崩溃还有一个常见表现:窗口一闪而过,然后就提示程序停止工作。这时候先加日志,在gladLoadGLLoader前后输出一点信息,看崩溃发生在哪一行。
7.5 窗口标题或控制台出现乱码
乱码问题很多人都会遇到,特别是中文Windows系统。VS Code默认的编码和Windows的命令行编码不一致:VS Code通常是UTF-8,而Windows控制台是GBK(代码页936)。解决方式:
在main.cpp开头添加:
cpp复制#ifdef _WIN32
#include <windows.h>
#endif
int main() {
#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
#endif
...
}
或者在控制台执行chcp 65001把代码页切换成UTF-8。前者更稳定,写在代码里即可。
说到底,乱码只是影响输出文本的显示,不影响OpenGL渲染本身,但新手遇到会慌,先解释清楚,心里有底。
7.6 GPU占用和缩放问题
你搜“降低gpu占用的方案有哪些”发现跑了个空窗口GPU占用还很高?这是正常的。OpenGL渲染循环如果没加帧率限制,它会以最大速度疯狂刷新。我们这个demo里没有垂直同步限制,所以GPU占用率高不奇怪。后续学习时可以在渲染循环里加glfwSwapInterval(1)开启垂直同步,把帧率限制在显示器刷新率左右。
窗口缩放模糊的问题也可能遇到,特别是高分屏。OpenGL里默认视口不会自动跟随窗口大小变化,需要设置framebuffer size回调,就是我们代码里写的framebuffer_size_callback。如果你改了窗口大小但画面没跟着变,检查一下有没有调用glfwSetFramebufferSizeCallback。
8. 经验总结与进阶建议
环境搭建是很琐碎的事情,但本质上就是“让编译器找到头文件、找到库文件、正确链接”。你这套配置一旦跑通,后面所有OpenGL项目的结构都大同小异。我现在提几个实际的操作建议,能让你的学习之路顺一点。
第一,把依赖目录固定下来,别每次新建项目都重新下载GLFW和GLAD。维护一套固定的external目录,所有项目共享。以后新建项目时,只需要新建.vscode配置文件,路径指过去就行。这样既省时间,也避免下载过程被网络问题打断。
第二,自己动手写一遍tasks.json的编译参数。我见过太多人复制粘贴配置文件,事后出了问题完全不知道在看什么。每一个-I、-L、-l参数背后都有明确意义,花一个下午搞懂这些,比周末刷三天教程都值。
第三,如果你条件允许,可以再配一套Visual Studio作为后备环境。不是说非要学它,而是遇到VS Code配置实在解决不了的问题时,VS Studio可以作为一种快速验证手段:同一个源代码在VS里能不能编译、运行?如果能,说明代码没问题,问题在工具链;如果也不能,说明代码和依赖的匹配有问题。这种“隔离变量”的排错思路,能帮你省下大量时间。
第四,后续的学习路线:搭好环境后,下一步就是画三角形。先理解VAO、VBO、EBO的关系,再写着色器。推荐把LearnOpenGL(https://learnopengl.com)作为主线教程,它对应的中文翻译站点也有不少,但翻译质量参差不齐,英文原版读起来反而清晰。配合这篇环境配置,你已经走完了最枯燥的一步。
我在最开始搭这套环境时,也折腾了两三个晚上,大部分时间花在“网上教程版本太老”和“MinGW路径配错”上。回过头看,真正把原理搞清楚了,这套配置一次成型,后来换电脑、换项目,基本都是十分钟的事。技术这事,耐心熬过第一公里,后面反而越来越顺。
