小白的OpenGL整合环境入门(搭建以及简介)

目录

  • 写在前面
    • 第三方库简介
    • OpenGL发展历史及库的更替
          • OpenGL发展
          • 库的分类
          • 库所对应的版本
  • 环境搭建
    • 方法一:NuGet包管理
    • 方法二:使用整合的环境

写在前面

本文的环境搭建适用于VS2015及以上(作者使用的是VS2019),涉及的库有glut系列(glut、freeglut)、glfw3+glad、glm、stb_image、assimp、AntTweakBar,最终可以完美契合OpenGL教程。
我会在最后给出已经编译整合好的常用库合集链接(含两个VS项目模板)。

第三方库简介

  1. glut:跨平台的OpenGL程序的工具包,定义以及控制视窗,侦测事件;
  2. freeglut:是glut的替代;
  3. glu:包含在glut内,是对底层OpenGL接口的封装(实现跨平台),包含一些数学方法如向量,操纵矩阵;
  4. glew:glu的加强版,但不包括数学方法需要搭配glm;
  5. glm:数学库(用于glfw);
  6. glad:是glew的替代;
  7. glfw:是freeglut升级版;
  8. stb_image:用于图像加载的解码库;
  9. assimp:用于模型加载的库;
  10. 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包管理

  1. 新建一个项目,在解决方案管理器中右键项目名-管理NuGet程序包(或者上方工具栏 项目-管理NuGet程序包

小白的OpenGL整合环境入门(搭建以及简介)_第1张图片

打开NuGet管理器

小白的OpenGL整合环境入门(搭建以及简介)_第2张图片

打开NuGet管理器

  1. 搜索nupengl,找到第一个并安装
    小白的OpenGL整合环境入门(搭建以及简介)_第3张图片

安装nupengl

  1. 到此通过NuGet包管理就已经为这个项目安装了OpenGL环境,其中包含了OpenGL, FreeGLUT, GLEW, Game, GLFW, GLUT, nativepackage

方法二:使用整合的环境

下载链接中的压缩包: OpenGL整合包.

  1. 解压压缩包,记下路径
    小白的OpenGL整合环境入门(搭建以及简介)_第4张图片

解压缩

  1. 打开VS(演示为VS2019),工具栏 - 项目 - 属性 - VC++目录包含目录库目录分别添加我们解压缩的包内的include文件夹和lib文件夹

小白的OpenGL整合环境入门(搭建以及简介)_第5张图片

链接库

  1. 到此就搭建完毕了,下面测试一下代码:
#include 
#include 
#include 
#include 
#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,输出”!!!“则证明成功。
小白的OpenGL整合环境入门(搭建以及简介)_第6张图片

成功示例

Reference:

  1. opengl关于glut, freeglut, glfw, glew, glad, gl3w库的说明
  2. OpenGL常用的库

你可能感兴趣的:(计算机图形学)