当前位置: 首页 > news >正文

OpenGL3.3_C++_Windows(15)

理解glad: 

  1. OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的,由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,
  2. 需要在运行时查询,因此开发者需要在运行时获取函数地址并将其保存在一个函数指针中,动态地加载这些函数
// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);

 理解typedef void (*Fun) (void) 

  1. 函数指针定义:返回类型(*函数名pfun)(参数表) ,函数指针指向函数在内存中的首地址

  2. 如何赋值:定义普通函数,为pfun赋值,因此指向了函数的地址,、

  3. 如何调用:*解引用获取实际的函数,为函数传实参,fun(x);->(*pfun)(x);

  4. typedef 定义别名,pfun类型为void(*)(void)

  5. typedef本质定义新的类型,否则仅定义函数指针,新类型 + pfun;表明变量是函数指针

 glad初始化简单理解:参考

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{std::cout << "Failed to initialize GLAD" << std::endl;return -1;
}
  1. glfwGetProcAddress返回函数的地址
  2. glad.c为C语言的源文件,强制转化为()形式,而非c++的<>
  3. typedef void* (* GLADloadproc)(const char *name);定义名为GLADloadproc的函数指针,将glfwGetProcAddress函数强制转化为函数指针。
  4. 然后将函数指针(返回函数地址)作为参数传给gladLoadGLLoader的形参load
int gladLoadGLLoader(GLADloadproc load) {GLVersion.major = 0; GLVersion.minor = 0;glGetString = (PFNGLGETSTRINGPROC)load("glGetString");if(glGetString == NULL) return 0;if(glGetString(GL_VERSION) == NULL) return 0;find_coreGL();load_GL_VERSION_1_0(load);………略load_GL_VERSION_3_3(load);if (!find_extensionsGL()) return 0;return GLVersion.major != 0 || GLVersion.minor != 0;
}
  1. 调用load("glGetString")函数指针,获取opengl版本,然后传入find_coreGL()    去计算bool GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3;
  2. 接着返回调用load_GL_VERSION_1_0……,如果我们是3,3版本,对于每个函数,都会判断之前计算的bool,所有bool为true的函数,都会传入load()(获取函数地址的函数指针)作为实参,
  3. load_GL_VERSION()内部会加载所有,上一个版本没有的那些函数。
  4. 加载后的地址,就会被赋值到(形如)glad_glCullFace的变量上,

 如何将glad_开头的转化为gl开头的函数: 

  1. 定义在glad,c中,extern在glad.h中,按照下面的转化,这样我们就可以在代码中才可以用 gl开头 的函数了

#define GLAPI extern
typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint *arrays);//定义函数指针类型
GLAPI PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays;//声明  函数指针
#define glGenVertexArrays glad_glGenVertexArrays//定义宏

 理解glad的作用: 

  1. 根据版本号,获取所有函数的地址,存储封装到相应的函数指针glad,再转为gl开头的宏,供开发者使用
http://www.lryc.cn/news/380053.html

相关文章:

  • 出海计划 | 赴马来西亚开展水环境项目考察暨2024中马水务合作论坛
  • NeRF从入门到放弃5: Neurad代码实现细节
  • 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch
  • Pip换源详解
  • 【Docker】——安装镜像和创建容器,详解镜像和Dockerfile
  • 利用LinkedHashMap实现一个LRU缓存
  • git-pull详解
  • 【SQL】count(1)、count(*) 与 count(列名) 的区别
  • 03-ES6新语法
  • Linux中的文本编辑器vi与vim
  • MATLAB基础应用精讲-【数模应用】三因素方差(附R语言、MATLAB和python代码实现)
  • Linux ubuntu安装pl2303USB转串口驱动
  • 关于使用命令行打开wps word文件
  • 将Vite添加到您现有的Web应用程序
  • Apache Kafka与Spring整合应用详解
  • SpringBoot配置第三方专业缓存技术Redis
  • javascript的toFixed()以及使用
  • 软件功能测试和性能测试包括哪些测试内容?又有什么联系和区别?
  • 从工具产品体验对比spark、hadoop、flink
  • 【软件设计】详细设计说明书(word原件,项目直接套用)
  • java本地缓存(map,Guava,echcache,caffeine)优缺点,以及适用场景
  • Monica
  • 国产数据库中读写分离实现机制
  • kubernetes部署dashboard
  • FPGA早鸟课程第二弹 | Vivado 设计静态时序分析和实际约束
  • STM32项目分享:家庭环境监测系统
  • 华为HCIP Datacom H12-821 卷5
  • Mongodb数据库基本操作
  • 【机器学习】基于Softmax松弛技术的离散数据采样
  • .NET+Python量化【1】——环境部署和个人资金账户信息查询