OpenGL 简明教程(一) 开篇

1.1 开始

这是我在学习 OpenGL 时的记录,所以文章以简单叙述为主。1
计算机创建和显示图像时,一般由计算机显卡渲染完成,而显卡中就记录了一些渲染图形的 API,其中 OpenGLDirectX 最为常用,这系列文章讲的就是如何使用 openGL 在计算机上绘图并显示在屏幕上。由于 OpenGL 的 API 是显卡提供的,所以请保证显卡较新,最好使用更新的显卡驱动。

1.2 开发环境

1.2.1 准备

Windows 操作系统(这是我使用的,其他操作系统差异不大,具体情况变通一下即可)
Microsoft Visual Studio(版本最好高于2012,我使用的是 vs2017,推荐使用 vs2015 或 vs2017,在安装程序里选中 linux 的 C++ 库会减少一些麻烦)
CMake 工程文件生成工具
下载链接:http://www.cmake.org/cmake/resources/software.html/
c++ 库:(下载时最好下源码32位版本,源码后面需要用 CMake+VS 编译好后使用)
GLFW 库 用于 OpenGL 创建窗口和处理输入
下载链接:http://www.glfw.org/download.html/
GLEW 库 能够简化 OpenGL 库函数调用的库
下载链接:http://glew.sourceforge.net/index.html/
ps:下载链接失效/速度慢,可以从我的 csdn 资源里下载。(我的 FLEW 库是编译好的文件)

1.2.2 编译构建库

将 GLFW 和 GLEW 的压缩包解压到各自的文件夹;
在各自的目录下创建额外的目录 /build (在该目录下存放编译后的文件,也可以自行指定位置);
安装并打开 CMake,指定好 GLFW 的存放目录、编译后文件的存放目录(前面创建的 /build 目录);
OpenGL 简明教程(一) 开篇
点击配置(configure)按钮,设置好你安装的编译器版本,其他选项默认,没有出错的话就点击生成(generate)按钮,完成编译;
这时构建目录就会生成一些文件,其中包含一个 GLFW.sln(VS 解决方案文件),用 VS 打开这个文件,点击构建/生成,GLFW 库就构建好了;
如果你的 GLEW 文件是源码,则需要进行上述的同样步骤。(如果你下载的是我的文件,就无视吧)

1.2.3 项目配置

打开 Visual Studio 新建一个项目,右键点击项目->属性,在属性窗口中编辑库函数的目录:
OpenGL 简明教程(一) 开篇
打开 vc++目录选项卡,编辑包含目录(include),添加 2个新行,选中 GLFW 的 include 目录和 GLEW 的 include 目录;
OpenGL 简明教程(一) 开篇
编辑库目录(lib),添加 2个新行,选中 GLFW 的构建目录中的 Debug 目录和 GLEW 的 lib/Release/Win32 目录;
切换到链接器->输入选项卡,编辑附加加载项,添加新行,写入 glfw3.libglew32s.lib
OpenGL 简明教程(一) 开篇
OpenGL 简明教程(一) 开篇
至此项目的环境配置完成了,下面就能在代码中调用使用 OpenGL 的库函数进行绘图了,只要在代码段前将头文件包含即可:

// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>

1.3 第一个项目

1.3.1 头文件

包含 GLFW 和 GLEW 库,包含了另一些库来解决找不到库函数的问题,代码如下:

// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
1.3.2 主循环

这里用游戏循环模式来进行绘图,防止画面输出后直接退出程序,代码如下:

	// 创建游戏循环
	while (!glfwWindowShouldClose(window)) {
		// 事件处理
		glfwPollEvents();
		// 交换颜色缓冲(双缓冲),绘制图像
		glfwSwapBuffers(window);
	}
1.3.3 用 GLFW 创建窗口
	// 初始化 GLFW
	glfwInit();
	// glfwWindowHint() // 配置 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);
	// Mac OS 使用
	// glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

	// 创建一个窗口
	GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
	if (window == nullptr) {
		cout << "Failed to create GLFW window" << endl;
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);

1.3.4 初始化 GLEW
	// 初始化 GLEW
	glewExperimental = GL_TRUE;
	if (glewInit() != GLEW_OK) {
		cout << "Failed to initialize GLEW" << endl;
		return -1;
	}
1.3.5 设置窗口大小及释放内存
	// 设置窗口大小
	int width, height;
	glfwGetFramebufferSize(window, &width, &height);
	glViewport(0, 0, width, height);

	// 创建游戏循环
	while (!glfwWindowShouldClose(window)) {
		// dosomething();
	}

	// 释放 GLFW 内存
	glfwTerminate();
1.3.6 源码
#include <iostream>
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")

using namespace std;

int main (void) {

	// 初始化 GLFW
	glfwInit();
	// glfwWindowHint() // 配置 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);
	// Mac OS 使用
	// glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

	// 创建一个窗口
	GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
	if (window == nullptr) {
		cout << "Failed to create GLFW window" << endl;
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);

	// 初始化 GLEW
	glewExperimental = GL_TRUE;
	if (glewInit() != GLEW_OK) {
		cout << "Failed to initialize GLEW" << endl;
		return -1;
	}

	// 设置窗口大小
	int width, height;
	glfwGetFramebufferSize(window, &width, &height);
	glViewport(0, 0, width, height);

	// 创建游戏循环
	while (!glfwWindowShouldClose(window)) {
		// 事件处理
		glfwPollEvents();
		// 交换颜色缓冲(双缓冲),绘制图像
		glfwSwapBuffers(window);
	}

	// 释放 GLFW 内存
	glfwTerminate();
	return 0;
}

将代码保存到源文件目录中,启动项目,你会看到一个黑色的窗口,这证明:你成功了!


  1. 我在学习时参考了许多资料,其中有个非常好用的 OpenGL 学习网站
    网站链接:https://learnopengl-cn.readthedocs.io/zh/latest/ ↩︎

OpenGL 简明教程(一) 开篇OpenGL 简明教程(一) 开篇 黛˙晨 发布了7 篇原创文章 · 获赞 3 · 访问量 866 私信 关注
上一篇:OpenGL基础学习之二代码基本结构


下一篇:OpenGL学习笔记