写在前面
本文的环境搭建适用于==VS2015及以上==(作者使用的是VS2019),涉及的库有glut系列(glut、freeglut)、glfw3+glad、glm、stb_image、assimp、AntTweakBar,最终可以完美契合OpenGL教程。 我会在最后给出已经编译整合好的常用库合集链接(含两个VS项目模板)。
第三方库简介
- glut:跨平台的OpenGL程序的工具包,定义以及控制视窗,侦测事件;
- freeglut:是glut的替代;
- glu:包含在glut内,是对底层OpenGL接口的封装(实现跨平台),包含一些数学方法如向量,操纵矩阵;
- glew:glu的加强版,但不包括数学方法需要搭配glm;
- glm:数学库(用于glfw);
- glad:是glew的替代;
- glfw:是freeglut升级版;
- stb_image:用于图像加载的解码库;
- assimp:用于模型加载的库;
- AntTweakBar:界面库,在程序中增加一些轻量且直观的 GUI 效果(相当于一个控制台)。
其中说明一下8,9,10是拓展项,不是必须(我都整合在一起了可以直接用)
OpenGL发展历史及库的更替
OpenGL发展
| OpenGL版本 | 版本特点 |
|---|---|
| OpenGL1.x | 支持了顶点数组,纹理,缓冲对象及一系列优化 |
| OpenGL2.x | 可编程着色,能够实现更丰富的效果 ;代表DX9级硬件 |
| OpenGL3.x | 增加几何着色渲染,拥有更强的跨平台能力;代表DX10级硬件 |
| OpenGL4.x | 若干细节优化;代表DX11级硬件 |
| 详细内容可以查看官方文档。 |
库的分类
| 功能 | 库的更替 |
|---|---|
| 窗口创建,IO交互,OpenGL上下文处理 | glut --> freeglut --> glfw |
| 对显卡底层的接口支持 | glu --> glew --> glad |
一般来说glfw和glad搭配使用(也可以与glew),freeglut与glew搭配。
库所对应的版本
| 库 | 版本 |
|---|---|
| GLUT | OpenGL1.0/2.0 |
| FREEGLUT | OpenGL 1.0/2.0/3.0 |
| GLEW | OpenGL2.0以上 |
| GLFW | OpenGL3.0以上 |
| GLAD | OpenGL3.0以上 |
环境搭建
这里提供两种环境搭建的方法,但均基于==VS2015及以上==(作者使用的是VS2019)。 其中方法一适用于使用glut或freeglut;方法二提供的是glfw+glad。
本着学新不学旧的原则,更推荐方法二;但是方法一在学习和搭建上都更简单。
方法一:NuGet包管理
- 新建一个项目,在解决方案管理器中右键项目名-管理NuGet程序包(或者上方工具栏 项目-管理NuGet程序包)
打开NuGet管理器
打开NuGet管理器
- 搜索nupengl,找到第一个并安装
安装nupengl
- 到此通过NuGet包管理就已经为这个项目安装了OpenGL环境,其中包含了OpenGL, FreeGLUT, GLEW, Game, GLFW, GLUT, nativepackage。
方法二:使用整合的环境
下载链接中的压缩包: OpenGL整合包.
- 解压压缩包,记下路径
解压缩
- 打开VS(演示为VS2019),工具栏 - 项目 - 属性 - VC++目录在包含目录和库目录分别添加我们解压缩的包内的include文件夹和lib文件夹
链接库
- 到此就搭建完毕了,下面测试一下代码:
#include <glad\glad.h>
#include <glfw\glfw3.h>
#include <iostream>
#include <Windows.h>
#pragma comment(lib,"glfw3.lib")
#pragma comment(lib,"glad.lib")
#pragma comment(lib,"stb_image.lib")
#pragma comment(lib,"assimp.lib")
#pragma comment(lib,"winmm.lib") // 告诉连接器与这个库连接,因为我们要播放多媒体声音
//#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
// Window dimensions
const GLuint WIDTH = 800, HEIGHT = 600;
void minit()
{
// Init GLFW
glfwInit();
// Set all the required options for GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
}
// The MAIN function, from here we start the application and run the game loop
int main()
{
std::cout << "Starting GLFW context, OpenGL 3.3" << std::endl;
minit();
// Create a GLFWwindow object that we can use for GLFW's functions
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "ink", nullptr, nullptr);
if (window == nullptr)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// Set the required callback functions
glfwSetKeyCallback(window, key_callback);
// Initialize GLEW to setup the OpenGL Function pointers
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLad" << std::endl;
return -1;
}
// 定义视角 Define the viewport dimensions
glViewport(0, 0, WIDTH, HEIGHT);
//进入循环 Game loop
while (!glfwWindowShouldClose(window))
{
//检查事件 Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions
glfwPollEvents();
//渲染指令 Render
//清除颜色缓存 Clear the colorbuffer
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Swap the screen buffers
glfwSwapBuffers(window);
Sleep(20);
}
//释放GLFW分配的内存 Terminate GLFW, clearing any resources allocated by GLFW.
glfwTerminate();
return 0;
}
//键盘事件 Is called whenever a key is pressed/released via GLFW
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
std::cout << key << std::endl;
if (key == GLFW_KEY_Z && action == GLFW_PRESS)
{
std::cout << "!!!!" << std::endl;
glfwSetWindowShouldClose(window, GL_TRUE);
}
}
如果显示如下,键盘输入Z,输出”!!!“则证明成功。
成功示例
Reference: