1.1 开始
这是我在学习 OpenGL 时的记录,所以文章以简单叙述为主。1
计算机创建和显示图像时,一般由计算机显卡渲染完成,而显卡中就记录了一些渲染图形的 API,其中 OpenGL 和 DirectX 最为常用,这系列文章讲的就是如何使用 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 目录);
点击配置(configure)按钮,设置好你安装的编译器版本,其他选项默认,没有出错的话就点击生成(generate)按钮,完成编译;
这时构建目录就会生成一些文件,其中包含一个 GLFW.sln(VS 解决方案文件),用 VS 打开这个文件,点击构建/生成,GLFW 库就构建好了;
如果你的 GLEW 文件是源码,则需要进行上述的同样步骤。(如果你下载的是我的文件,就无视吧)
1.2.3 项目配置
打开 Visual Studio 新建一个项目,右键点击项目->属性,在属性窗口中编辑库函数的目录:
打开 vc++目录选项卡,编辑包含目录(include),添加 2个新行,选中 GLFW 的 include 目录和 GLEW 的 include 目录;
编辑库目录(lib),添加 2个新行,选中 GLFW 的构建目录中的 Debug 目录和 GLEW 的 lib/Release/Win32 目录;
切换到链接器->输入选项卡,编辑附加加载项,添加新行,写入 glfw3.lib 和 glew32s.lib
至此项目的环境配置完成了,下面就能在代码中调用使用 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;
}
将代码保存到源文件目录中,启动项目,你会看到一个黑色的窗口,这证明:你成功了!
-
我在学习时参考了许多资料,其中有个非常好用的 OpenGL 学习网站
网站链接:https://learnopengl-cn.readthedocs.io/zh/latest/ ↩︎