什么是OpneGL
Open Graphics Library (OpenGL) is a cross-language, cross-platform application programming interface (API) for rendering 2D and 3D vector graphics. The API is typically used to interact with a graphics processing unit (GPU), to achieve hardware-accelerated rendering.
总的来说,OpenGL 就是一个应用程序接口(API),用来帮助我们与GPU交互,来使用硬件加速渲染图形。OpenGL只是一个规范,不同的显卡厂商有不同的实现,但这无关紧要,只要用起来相同就行了。值得一提的是,OpenGL 是无需下载的,系统里已经有这个库了(opengl32.lib, opengl64.lib for Windows)。建议将显卡驱动更新到最新
但是,只有 OpenGL 是不够的,原因大致有二:
- 1.OpenGL 本身提供的 API 比较底层,不便于使用,我们需要一个更高层次的封装。
- 2.OpenGL 并没有提供创建 context,管理窗口以及处理用户输入等机制。
安装库
需要安装:GLFW、GLEW/GLAD
GLEW和GLAD都是一样的库,下载其中一个即可
GLFW
是专门针对OpenGL的C语言库,GLFW是一个专门用于处理窗口创建和事件循环的库,它能够兼容各种操作系统,提供了一个简单的API来处理窗口相关的操作,如创建、销毁、调整大小等。GLFW负责创建窗口、处理窗口相关的事件(如键盘和鼠标输入),并提供一个OpenGL上下文供程序使用。
GLEW
全称OpenGL Extension Wrangler Library,是一个用于管理OpenGL扩展功能的库。由于OpenGL只有函数声明而没有实现,所以不同的显卡生产商会提供自己的实现。这就需要在编写程序时判断哪些函数是否可用,非常麻烦。而GLEW库则将这些问题简化,使得各个版本的OpenGL函数像原生函数一样可以直接调用。
GLAD
glad是glew的升级版,专门加载OpenGL的函数指针,也可以只安装glad,无需配置glew
其他库
下载
GLEW
步骤一:选择官网的Binaries
下载
步骤二:跳转后,等待即可下载
GLFW
步骤一: 选择官网的Download页面,主页是源码,需要自己编译
步骤二: 选择对应平台: 这里选择Windows平台,选择32位(64位可能有些平台不支持)
步骤三: 将下载的文件解压,可看到对应版本的
GLAD
步骤一: 在官网选择对应的信息用来生成库, 最后选择右下角的Generate按钮生成库文件
步骤二: 点击Generate后可以查看生成的库文件, 选择glad.zip进行下载
步骤三: 将下载的文件解压,可看到和官网生成的库文件一致
到这里OpenGL所需要的库就下载好了
配置
这里以Visual Studio2017为例,Visual Studio都差不多,其他编译器没试过,主要是将OpenGL库链接到项目中,可以分开链接(GLFW和GLAD);也可以专门一个文件夹将GLFW和GLAD的include、lib放一起(这里以该方式)
步骤一
将GLFW和GLEW的include
和lib
文件进行分类,当然也可以不进行分类。
GLFW的include库
GLFW文件选择include->GLFW
GLEW的lib库
GLFW选择对应编辑器版本的lib库(这里以2022版为例)
GLEW的include库
GLEW文件选择include->GL
GLEW的lib库
GLEW文件选择lib->Release->Win32
最终两个文件的include和lib库合并
步骤二
将库文件链接到Visual Studio项目中
步骤一
创建控制台项目
步骤二
将OpenGL库链接到项目中,项目->属性
步骤三
属性页:配置选"所有配置",平台选"所有平台"
步骤四
将"include"文件链接到项目中。如果没合并(glew和glfw分开)的话,就分别链接
选:C/C++->常规->附加包含目录
或者也可采取相对目录
将合并的Opengl库放到当前项目下,%(AdditionalIncludeDirectories)/OpenGLlibrary/GL
步骤五
将"lib"库链接到项目中
选:链接器->常规->附加库目录
或者也可采取相对目录
将合并的Opengl库放到当前项目下,%(AdditionalIncludeDirectories)/OpenGLlibrary/lib
步骤六
选择附加依赖性
选:链接器->输入->附加依赖项->输入"opengl32.lib","glfw3.lib","glew32s.lib"
步骤七
以上设置选择确定和应用
步骤三
写入OpenGL代码,即创建Opengl窗口,这里以glfw代码为例
#include <glfw3.h> //该头文件取决于实际情况,有些是#include <GLFW/glfw3.h>
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
运行报错
报错:LNK2019 无法解析的外部符号 glewInit
,后面有警告“X86”与目标计算机类型“X64”冲突
将X64改成X86
报错:LNK2019 无法解析的外部符号 __imp____glewInit
在属性页->C/C++->预处理器->预处理器定义->加上"GLFW_STATIC"
编译成功即可看到OpenGL窗口
总结
- 1.将库进行分类(
include
和lib
),也可以不分类。 - 2.将
include
链接到C/C++
:项目->属性->C/C++->常规->附加包含目录(可绝对路径
也可相对路径(%(AdditionalIncludeDirectories)\...\include)
)。 - 2.将
lib
链接到链接器
:项目->属性->链接器->常规->附加库目录(可绝对路径
也可相对路径(%(AdditionalIncludeDirectories)\...\lib)
)。 - 3.在
链接器
下的输入:项目->属性->链接器->输入->附加依赖项->加上opengl32.lib
、glew32s.lib
、glfw3.lib
。 - 4.由于
GLEW
是静态,需要加上GLEW_STATIC
。可在项目->属性->C/C++->预处理器->预处理器定义加上;也可在引用库(#include <GL/glew.h>
)的前面加上#define GLEW_STATIC
。 - 5.输入上面创建窗口代码是否能创建窗口。