涉及内容简介

OpenGL
一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范。具体的实现是由驱动开发商针对特定显卡实现的。
GLFW(Graphics Library Framework)
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。可认为是符合OpenGL规范的具体的库。
GLAD
由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。
GLAD用来帮助开发者解决这个问题。(不用自己手动编写代码查询函数了)

渲染(render):它表示计算机从模型创建最终图像的过程。

编译环境配置

GLFW只是实现了OpenGL规范的具体库中的一个,其他比较流行的还有GLUT,SDL,SFML;
我选择使用GLFW。

  • 下载GLFW源文件:官网(需翻墙)
    打开后点击Source Package按钮进行下载。

  • 下载cMake:官网(需翻墙)
    打开后选择32位的下载就行。 下载按钮长这样cmake-3.14.0-win32-x86.zip

cMake: CMake是一个工程文件生成工具。用户可以使用预定义好的CMake脚本,根据自己的选择(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。

1、下载好cMake并安装成功后,打开cMake;点击Browsere Source…按钮选择glfw压缩包解压后的整个文件夹

2、点击 Browsere Build… 选择一个文件夹(最好新建一个空的)来存放编译后的文件。

3、点击 Configure (设置)按钮。选择工程的生成器,由于我们使用的是Visual Studio 2015,我们选择 Visual Studio 14 选项(因为Visual Studio 2015的内部版本号是14)。

4、点击 Finish (完成)按钮保存设置。保存之后,点击Generate(生成)按钮,生成的工程文件会在你第二步选择的文件夹中(假设这个文件夹名为build)。

5、在build文件夹中点击 GLFW.sln 打开项目,然后对其进行编译。

6、编译通过后在bulid/src/Debug文件夹中找到库 glfw3.lib (注意我们用的是第3版)

7、推荐建立一个新的目录包含所有的第三方库文件和头文件,每次新建一个工程时都需要指定这些文件夹。可以使用一个单独的文件夹,里面包含libs和include文件夹,在这里存放OpenGL工程用到的所有第三方库和头文件。将第6步的库 glfw3.lib 放到libs文件夹下。

GLAD是在线服务,将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能正常工作)。之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a loader)的选项是选中的。现在可以先(暂时)忽略拓展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。
GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个glad.c文件。将两个头文件目录(glad和KHR)复制到你的 include 文件夹中,可以将glad.c文件储存到你的include文件夹下(便于寻找)。

经过上面的操作我们已经得到了OpenGL工程中所需要的库和头文件了(bulid文件夹下的所有东西,一定要保存好);接下来开始配置开发环境吧。

使用VS创建一个Visual C++ 常规空项目。
打开 解决方案资源管理器 在项目名称上点击右键——>属性,然后在配置属性下选择VC++目录,编辑 包含目录库目录 分别选择我们的 build 文件夹中的 include 目录和 libs 目录。

在配置属性下选择链接器——>输入,编辑附加依赖项,输入格式为:opengl32.lib 回车 glfw3.lib 然后点击确定按钮。

在配置属性页面确定修改后,环境配置便结束了。在当前项目中新建一个.cpp文件,将下面的代码复制过去,若果能编译且运行成功的话,恭喜你,OK了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>

using namespace std;

void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);

int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(800, 600, "SUCCESS", NULL, NULL);

if (window == NULL) {
std::cout << "Failed to create the windows" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}

while (!glfwWindowShouldClose(window)) {

processInput(window);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glfwSwapBuffers(window);
glfwPollEvents();
}

glfwTerminate();
return 0;
}

void framebuffer_size_callback(GLFWwindow* windows, int width, int height) {
glViewport(0, 0, width, height);
}

void processInput(GLFWwindow* window) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwSetWindowShouldClose(window, true);
}
}

 评论