OpenGL运行环境搭配的方法
OpenGL只是一个图形库,因为是跨平台,每个系统上显示窗口是不一样的,所以OpenGL有目的地把这些操作抽象出去,所以我们不得不自己去创建窗口,定义OpenGL上下文以及处理用户的输入。 所以就有一些库提供了这些功能,省去了我们码操作系统相关代码的时间,现在最流行的几个库有GLUT,SDL,SFML和GLFW,GLUT由于太古老了,而且有许多的坑,就算有了改进的freeGLUT,但是因为我用着不太顺,所以这里就不描述了,至于SDL,SFML我没用过,所以这里也不再描述,本篇使用的是GLFW。 GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我所需要的。 下面就是建立GLFW的环境了,这里有两种方法:一种是使用CMake工程生成工具去编译你下载的GLFW库(下载地址 ),得到glfw3.lib库文件,把它放到你的工程之中,在项目属性中链接glfw3.lib,还有把你下载的GLFW库的include的文件也添加到你的项目之中。此方法比较麻烦。 如果你用的是Visual Studio那么就很简单了,只需要用到Visual Studio的一个插件“NuGet” ,这个插件在Visual Studio的工具–>扩展更新搜索下载即可,然后重启Visual Studio就可以装好。如图: 装好之后打开Visual Studio创建一个c++空项目,右键点击项目选择“管理Nuget程序包”如图 下面就开始装GLFW了在浏览里搜索GLFW然后下载它 安装好了之后项目将会多一个packages.config的配置文件,说明已经配置好了GLFW 到这里别激动这就开始写代码,配置好GLFW之后我们还要配置一个东西 因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。而这个异常复杂和繁琐,所幸的是有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。 下面就开始配置GLAD了,GLAD是一个开源的库,配置也与其他的库有些不同,GLAD使用了在线服务,在这里我们能够告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数。地址在线服务 打开GLAD的在线服务,将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能正常工作)。之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a loader)的选项是选中的。现在可以先(暂时)忽略拓展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。 GLAD现在应该提供给你了一个zip压缩文件,里面包含了两个文件夹(include和scr),include直接复制到你的项目目录下,src文件里的glad.c文件也复制到你的项目目录下并添加到你的工程之中。然后将工程指向include文件,在右键点击项目选择属性,在VC++目录的包含目录里添加include文件 现在就可以开兴的写代码了 代码如下fist_Windows.cpp -
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
const unsigned int SCR_WIDTH = 800 ;
const unsigned int SCR_HEIGHT = 600 ;
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3 );
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3 );
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL" , NULL, NULL);
if (window == NULL)
{
std ::cout << "Failed to create GLFW window" << std ::endl;
glfwTerminate();
return -1 ;
}
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std ::cout << "Failed to initialize GLAD" << std ::endl;
return -1 ;
}
while (!glfwWindowShouldClose(window))
{
processInput(window);
glClearColor(0.2f , 0.3f , 0.3f , 1.0f );
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0 ;
}
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true );
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0 , 0 , width, height);
}