下面的这行代码就是加载所有的OpenGL功能函数,这个任务由glad来负责完成:

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
  }

一、先看下GLAD是怎么样和Opengl32.dll建立联系的

1.glfwGetProcAddress的实现:

GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname)
{
.....

return window->context.getProcAddress(procname);
}

2.看下GLFW是怎么加载Opengl32.dll的

glfwCreateWindow()   ->   _glfwPlatformCreateWindow()   ->  _glfwInitWGL()  这样的调用关系:

_glfwInitWGL()函数位于GLFW源码wgl_context.c文件中

GLFWbool _glfwInitWGL(void)
{
  ......

_glfw.wgl.instance = LoadLibraryA("opengl32.dll");
    if (!_glfw.wgl.instance)
    {
        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,
                             "WGL: Failed to load opengl32.dll");
        return GLFW_FALSE;
    }

_glfw.wgl.GetProcAddress = (PFN_wglGetProcAddress)
        GetProcAddress(_glfw.wgl.instance, "wglGetProcAddress");

......
}

二、gladLoadGLLoader函数

1.先进入gladLoadGLLoader()函数中:

int gladLoadGLLoader(GLADloadproc load) {
    GLVersion.major = 0; GLVersion.minor = 0;
    glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); //动态加载glGetString 函数
    if(glGetString == NULL) return 0;
    if(glGetString(GL_VERSION) == NULL) return 0;
    find_coreGL();
    load_GL_VERSION_1_0(load);
    load_GL_VERSION_1_1(load);

......

}

2.再进入find_coreGL()中:

static void find_coreGL(void) {

......

/* PR #18 */
#ifdef _MSC_VER
    sscanf_s(version, "%d.%d", &major, &minor);
#else
    sscanf(version, "%d.%d", &major, &minor);
#endif

GLVersion.major = major; GLVersion.minor = minor;    //得到主版本号:例如 "3.3.0 - Build 10.18.10.4252"
    max_loaded_major = major; max_loaded_minor = minor;
    GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
    GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;
    GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1;
    GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1;
    GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1;
    GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1;
    GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2;

......

}

int  GLAD_GL_VERSION_1_0;
int  GLAD_GL_VERSION_1_1;
int  GLAD_GL_VERSION_1_2;

......

int GLAD_GL_VERSION_4_4;
int GLAD_GL_VERSION_4_5;

这些都是int型的标识,为1:表示当前的Openg32 库大于且需兼容的版本,为0:表示还没有到这个版本

这里版本是3.3 GLAD_GL_VERSION_1_0 至 GLAD_GL_VERSION_3_3的值都是1,后面这个为了后面动态加载每个版本的函数做准备。

3.依据版本号动态加载相应的函数

动态加载各个版本的函数

load_GL_VERSION_1_0(load);
load_GL_VERSION_1_1(load);
load_GL_VERSION_1_2(load);
load_GL_VERSION_1_3(load);
load_GL_VERSION_1_4(load);
load_GL_VERSION_1_5(load);
......

例如:

static void load_GL_VERSION_1_0(GLADloadproc load) {
    if(!GLAD_GL_VERSION_1_0) return;  //这里是判断Opengl32的库版本是否大于它,大于就加载后面的库函数
    glad_glCullFace = (PFNGLCULLFACEPROC)load("glCullFace");
    glad_glFrontFace = (PFNGLFRONTFACEPROC)load("glFrontFace");
    glad_glHint = (PFNGLHINTPROC)load("glHint");
    glad_glLineWidth = (PFNGLLINEWIDTHPROC)load("glLineWidth");
    glad_glPointSize = (PFNGLPOINTSIZEPROC)load("glPointSize");

......

}


总结

可以看到windows下的Opengl32.dll共导出300多个库函数


以上就是GLAD大致做的事情,就是为了兼容各个平台的差异性,一种解耦的方法。

OPENGL中GLAD的代码实现过程相关推荐

  1. 乱弹OpenGL中的矩阵变换

    在前面的日志(Shadow Volume 阴影锥技术之探Ⅲ )中,自己稍微提及了NEHE的"3D矩阵求逆"方法之高,并谈了谈自己的一点拙略理解.呵呵,然后,既然如此,一不做二不休, ...

  2. 乱弹OpenGL中的矩阵变换(上)

    在前面的日志(Shadow Volume 阴影锥技术之探Ⅲ )中,自己稍微提及了NEHE的"3D矩阵求逆"方法之高,并谈了谈自己的一点拙略理解.呵呵,然后,既然如此,一不做二不休, ...

  3. 【lombok】使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法...

    错误如题:使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法 报错如下: 解决方法: 1.首先查看你的lombok插件是否下载安 ...

  4. 在学习js的然后写代码的过程中我老是找不到思路怎么办?

    在学习js的然后写代码的过程中我老是找不到思路怎么办? 写的少了,边写边思考: 刚刚学习的阶段,还是要多写,多借鉴别人的代码. 转载于:https://www.cnblogs.com/helloy/p ...

  5. 在PHP输出时间代码调试过程中出现 “It is not safe to rely on the system’s timezone settings”

    在PHP输出时间代码调试过程中出现 "It is not safe to rely on the system's timezone settings" 解决方法可试试: 1.在p ...

  6. 【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现

    相关信息 (1)建模思路 [2023 年第十三届 MathorCup 高校数学建模挑战赛]A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现 [2023 年第十三届 Matho ...

  7. OpenGL中各种坐标系的理解

    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕 ...

  8. OpenGL中的颜色混合功能(一)

    OpenGL中的颜色混合功能(一)              我们知道,材料属性和光照参数可以极大地增加图形的逼真度,但除此之外,我们在对现实世界进行建模时,有许多效果是通过混合颜色的方式实现的.透明 ...

  9. OpenGL中的gl,glu,glut的区别

    OpenGL中gl,glu,glut的区别 OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库, gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包 ...

  10. OPENGL中GLU和GLUT工具箱

    GLUT工具箱提供几种图形3维图形的函数: void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);  丝状球 void gl ...

最新文章

  1. 基于各种基础数据结构的SPFA和各种优化
  2. Qt在VS2010的安装与配置
  3. 用户测评 | EDAS Serverless 上手体验 1
  4. matlab产生一组均为一的矩阵,在matlab中如何从一组数中得到随机数组成一个n*n的矩阵...
  5. CanalSharp-mysql数据库binlog的增量订阅消费组件Canal的.NET客户端
  6. java中字节码_Java字节码执行图示
  7. 解决 Block-scoped declarations (let, const, function, class) not yet supported outside strict mode at
  8. HTML/CSS基础知识总结
  9. 一种基于memcache或redis缓存架构的验证码
  10. netscreen MIP 问题
  11. 在JS中关于堆与栈的认识function abc(a){ a=100; } function abc2(arr){ arr[0]=0; }
  12. Android Studio 安装TinyPng插件
  13. pigoss BSM 售前使用问题总结2(FAQ)
  14. 两次碰到编译错误: crosses initialization of...
  15. My Fifty-First Page - 组合总和 - By Nicolas
  16. 鼠标滚轮乱跳解决方法
  17. WAP、触屏版网站及APP的区别
  18. h5 登录页面_鲁班H5作者:@小小鲁班
  19. 如何使用python视频_如何使用python网络爬虫抓取视频?
  20. 二值图像blob分析

热门文章

  1. 一、绘制不同类别特征均值标准差直方图
  2. 女生学习前端究竟适不适合?
  3. java 实现微信公众号开发服务器认证
  4. 农历阳历转换 java_Java编程实例:Java版农历和阳历转换源码
  5. word页眉前后不一致怎么设置_2007word中,如何在某几页设置与前后不同的页眉?
  6. 法律养成——刑法(一)
  7. Pycharm相对路径
  8. SpringBoot+MyBatisPlus+Vue+ElementUI实现前后端分离的物业管理系统
  9. 只有1kb的清理软件_1kb病毒专杀工具下载
  10. 【AOP】面向切面谈恋爱(二)| 学废了AOP,他最终失去了爱情