由于OpenGL是独立于各个操作系统的,而我们进行OpenGL的开发的时候,需要的是一个OpenGL的状态,也就是OpenGL的上下文,还需要一个窗口,来表现我们要展示的东西,但是相对于各个操作系统,创建窗口和提供OpenG的上下文是不同的,所以此时我们使用一个叫做:GLFW的C库,
GLFW
GLFW是专门针对OpenGL的一个C库,他可以帮助我们提供OpenGL的上下文以及我们需要的窗口,还可以设置窗口的参数。
我们可以在GLFW官网下载:https://www.glfw.org/download.html;
有关专家建议的是:最好是下载源码然后自己编译,因为有老铁反应下载已经编译好的包的话,会有一些莫名其妙的问题,然后自己编译源码的话,一定是最适合自己的机器的。
我是下载的源码,然后自己编译的,下载的源码里面有对应的CMakeList文件,我们可以使用CMakeList-GUI进行工程的构建,很简单,下载源码之后,然后在CMake-GUI里面讲源码的根目录设置为CMake-GUI的源目录,然后我们自己建立一个build工程,用来生成GLFW有关lib库,具体使用CMake-GUI的方法可以再我的另一篇博客找到:https://blog.csdn.net/DY_1024/article/details/82897406
这里我就不多介绍了,使用CMake-GUI生成我们的工程之后,会有一个GLFW.sln文件:
因为我在CMake-GUI里面设置的是生成2015的工程,所以我用2015打开,运行并且编译这个工程,就会在src/Debug文件里面生成我们的lib库:glfw
现在我们GLFW的lib和头文件已经有了,(头文件就在我们下载的源码里面,include文件夹里面)
我们就可以建立我们自己的工程了,在VS中建立一个空项目,一定要是空项目,不然会有很多问题。
空项目建立好之后,我们将头文件以及lib包含到工程里面,
Tip:这里一定要注意,配置32位的环境,就要运行32位的程序,不然就相当于没有配。
这个时候我们就可以添加头文件了:#include
GLAD
因为OpenGL只是一个规范,具体的实现需要在具体的显卡上面,而且大多数的函数位置无法在编译的时候确定下来,需要在运行的时候查询,开发者需要获取函数的地址然后将其保存指针中,供以后使用。
在Winows中就会变成下面这样:
// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);
每一次使用gl指令,都要去寻找一下,十分的繁琐。
GLAD库就会简化这个过程。
我们可以在GLAD的官网:https://glad.dav1d.de/
来配置自己的压缩包,将语言设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本。之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a loader)的选项是选中的。
然后点击生成,他就会提供我们一个压缩包,这个压缩包里面包含两个头文件目录,和一个glad.c文件。
将两个头文件目录(glad和KHR)复制到你的Include文件夹中,并添加glad.c文件到你的工程中。
Tip:单独建立了一个文件夹,里面放的GLAD以及GLFW的头文件以及需要的lib库,这样添加起来会比较方便。
除了在工程中包含头文件目录和库目录之外,我们还需要添加库的依赖项。
opengl32.lib(这个是windows自带的,直接写进去就行)
glfw3.lib(这个是我们编译生成的)
然后就是我们的头文件:
现在我们在基本的配置已ok,可以写一个简单的main函数跑一下:
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
return 0;
}
调用glfwInit函数来初始化GLFW
使用glfwWindowHint函数将主版本号(Major)和次版本号(Minor)都设为3
然后最后一个指令就是告诉GLFW我们使用的是核心模式(Core-profile)
这样我们基本的环境就ok了~,可以试着跑一下,看有没有错误。