通过GLEW访问OpenGL函数
为了使用新版本的OpenGL,我们可以进入到显卡的驱动dll文件里,检索库里面的函数的指针来调用他们,但首先这不是跨平台的,所以到驱动里拉取函数,需要用到一些windows专用的API调用或者外来的windows加载库,而且这些新版本OpenGL经过迭代可能有1000多个函数需要我们手动检索并实现,这相当困难。所以我们直接用GLEW库(也有其他库,但GLEW是最简单的),它只提供OpenGL的规范,包括函数的声明,符号的声明,常量等等,不提供任何实际代码,只会访问一些电脑中的二进制形式的函数。
到GLEW官网,出于学习OpenGL的目的,我们只需要下载二进制文件。在VS项目属性中分别添加附加包含目录,附加库目录,附加依赖项,根据经验一般lib文件如果有带s的,就是静态库。在doc文件夹中包含了相关的文档,打开index.html可以在本地浏览跟官网相同的网页。首先我们需要看文档来搞清楚怎么用正确的方法来调用一个库,而不是随便做出一些假设,因为这会导致一些奇怪的BUG(哪怕它暂时能运行)。
在glew.h中找到glewInit();进入GLEWAPI宏中,可以看到注释,

GLEW_STATIC是用来定义静态库的,GLEW_BUILD用来定义构建DLL库的,现在我们没有GLEW_STATIC和GLEW_BUILD的定义,所以这里定义GLEWAPI为extern __declspec(dllimport),这是一个内在的MSVC编译器,它会告诉链接器这是来自一个dll文件,需要dll引用,但现在我们用的是静态库,没有用dll版本的glew,所以这样写代码就会出错。解决这事的方法就是定义GLEW_STATIC,项目属性->C/C++->预处理器->预处理器定义,添加GLEW_STATIC;

我们在glfwMakeContextCurrent(window)之前调用glewInit(),它的返回值不等于GLEW_OK,因为官方文档告诉我们需要在创建一个有效的OpenGL渲染上下文之后调用glewInit(),所以我们应该在glfwMakeContextCurrent(window)之后调用glewInit(),如下:

这样一来我们就能访问所有的OpenGL函数了,在glew.h文件中可以找到它们。