做环评需要关注哪些网站,手机端网页设计尺寸规范,艺术设计与制作,石家庄网站建设推广公司哪家好理解glad#xff1a;
OpenGL只是一个标准/规范#xff0c;具体的实现是由驱动开发商针对特定显卡实现的#xff0c;由于OpenGL驱动版本众多#xff0c;它大多数函数的位置都无法在编译时确定下来#xff0c;需要在运行时查询#xff0c;因此开发者需要在运行时获取函数…理解glad
OpenGL只是一个标准/规范具体的实现是由驱动开发商针对特定显卡实现的由于OpenGL驱动版本众多它大多数函数的位置都无法在编译时确定下来需要在运行时查询因此开发者需要在运行时获取函数地址并将其保存在一个函数指针中动态地加载这些函数 // 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers (GL_GENBUFFERS)wglGetProcAddress(glGenBuffers);
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, buffer); 理解typedef void (*Fun) (void) 函数指针定义返回类型(*函数名pfun)(参数表) 函数指针指向函数在内存中的首地址 如何赋值定义普通函数为pfun赋值因此指向了函数的地址、 如何调用*解引用获取实际的函数为函数传实参funx-*pfunx typedef 定义别名pfun类型为void(*)(void) typedef本质定义新的类型否则仅定义函数指针新类型 pfun表明变量是函数指针 glad初始化简单理解参考
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{std::cout Failed to initialize GLAD std::endl;return -1;
}
glfwGetProcAddress返回函数的地址glad.c为C语言的源文件强制转化为形式而非c的typedef void* (* GLADloadproc)(const char *name);定义名为GLADloadproc的函数指针将glfwGetProcAddress函数强制转化为函数指针。然后将函数指针返回函数地址作为参数传给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;
}调用load(glGetString)函数指针获取opengl版本然后传入find_coreGL 去计算bool GLAD_GL_VERSION_3_3 (major 3 minor 3) || major 3;接着返回调用load_GL_VERSION_1_0……如果我们是3,3版本对于每个函数都会判断之前计算的bool所有bool为true的函数都会传入load获取函数地址的函数指针作为实参load_GL_VERSION内部会加载所有,上一个版本没有的那些函数。加载后的地址就会被赋值到形如glad_glCullFace的变量上 如何将glad_开头的转化为gl开头的函数 定义在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的作用
根据版本号获取所有函数的地址存储封装到相应的函数指针glad再转为gl开头的宏供开发者使用