路遥见人心,日久知马力

博客园 首页 新随笔 联系 订阅 管理
  55 随笔 :: 3 文章 :: 0 评论 :: 10887 阅读

首先拿到一个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 其实看上去难、但仔细分析还是可以明白执行原理的!

posted on   只讲大白话  阅读(1628)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示