首先拿到一个LearnOpenGL的基本工程(glfw+glad)
glad可以说是去在运行时查询函数地址用的:
如果我们想调用 glGenBuffers() 、就要先查出 glGenBuffers的地址(如下图)
为什么要查询地址呢?其实1.1之后的新函数都在驱动中、所以要去查询函数的地址!
参看 cherno的讲述: Using Modern OpenGL in C++ - YouTube
总之我们就先假设必须查!然后先分析下去:
glfwGetProcAddress本身是一个函数、会接收一个 c 字符串、然后返回函数的地址、那个GLADloadproc就是一个强制类型转换(函数指针)而已!因为兼容C语言、所以不存在用std::function进行包装
现在把这个函数传入gladLoadGLloader中、点进这个函数、发现进入了glad.c 、继续往下看、发现又把函数传到了一堆 load 函数中:
第 1806行、用咱们刚才传入的那个函数把 glGetString这个函数查出来、然后复制给 glGetString
而glGetString其实是包装了一下glad_glGetString
随后 1809行、去findCore():发现里面会调用glGetString、也就是我们目前为止唯一可用的函数、去查当前opengl的版本(这些东西前面设置过了!):
GLAD_GL_VERSION_X_X 起到 bool 值的作用、不过还有一个或逻辑。
再回到 gladLoadGLLoader()函数:
随便进去一个load_GL_VERSION_xx函数:
发现首先就是拿前面计算出的bool值判断是否进行执行!
但要注意、因为前面算这些bool值的时候用了或逻辑、所以如果我们是3,3版本、那么前面的一系列变量都是真!
这样 load_version 1_0 .... 3_3都会执行、而后面的都不执行!
这代码写的确实优美
而每个函数内部就是用 load (这个东西就是最开始传入的加载函数地址的函数)去加载【本版本有】而【上一个版本没有】的那些函数!
比如进入load_version 4、才看到有NamedBuffer之类的函数被加载了进来
而加载之后的函数都被赋值到了 glad_glXXX上
这些东西其实都被包装成立 glXXX
所以形成了一个完美的闭环、我们在代码中才可以用 glXXX 之类的函数了、但他们只是 glad的包装。
总结: glad就是按版本号、批量的查询并包装 gl系列的函数给人们使用!所以必须首先执行 glad 的初始化、才能进行任何 opengl函数的调用!
C++ 、C 其实看上去难、但仔细分析还是可以明白执行原理的!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通