1 #include <iostream> // C++的标准输入输出头文件
2 using namespace std;
3
4 #define GLEW_STATIC // 预定义:把 glew 这个库放到系统文件夹里面(STATIC:能找到静态库就优先使用静态库)
5
6 /* 由静态库导出或从静态库导入的函数的签名用关键字 export.
7 从动态库导入的功能必须用 extern __declspec(dllimport).
8 GLEW_STATIC是激活第一种情况的预处理器定义.*/
9
10 #include <GL/glew.h> // 包含“GL”文件夹里面的“glew.h”的头文件
11 // 程序运行到这一段后,先找到“GL”文件,打开后找到“glew.h”头文件,然后
12 // 会在“编译”的时候把里面的整段代码复制到下面,只是没有显示出来
13
14 #include <GLFW/glfw3.h> // 我们需要和不同的操作系统进行交互,则需要“glfw.h”的头文件
15 // 先创建一个窗口,然后在窗口里面创建一个“视口”
16
17 const GLint WIDTH = 800, HEIGHT = 600; // 先设置窗口以及其大小
18 /* 在openGL里面,数据类型名字前面都有个大写的“GL”,
19 所以“GLint”其实内涵就是“整型int”的意思*/
20
21 /*
22 说明:
23 glfw 提供的是环境(变量名或函数名以“glfw”或“GLFW”开头的都是)
24 glew 用来绘图(变量名或函数名以“glew”或“GLFW”开头的都是)
25 而openGL里面的函数都以小写的“gl”开头
26 */
27 int main()
28 {
29 glfwInit(); //初始化,使用glfw来打开一个窗口
30
31 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 设置窗口版本,“MAJOR”代表主版本号
32
33 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 设置窗口版本,“MAJOR”代表副版本号
34
35 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // GLFW_OPENGL_PROFILE用告诉窗口,这个版本是为了openGL 做准备的。
36 // openGL用的版本用“CORE_PROFILE”来表示,指的是3.1以后的版本 新版的
37
38 //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 苹果系统需要加这条语句(Windows可加可不加)。函数作用:向前面的版本兼容
39
40 glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); // 缩放窗口的关闭
41
42 GLFWwindow* window_1 = glfwCreateWindow(WIDTH, HEIGHT, "Hello, friend! I'm a openGL window!", nullptr, nullptr);
43 // 新建一个窗口,(第三个参数):设置窗口名字
44
45 // 开始为高清屏做设置
46 int screenWidth, screenHeight;
47 glfwGetFramebufferSize(window_1, &screenWidth, &screenHeight); // 获得实际占用的帧缓存大小。帧的宽传给screenWidth;帧的高传给screenHeight。
48
49 if (nullptr == window_1) // 判断窗口输出是否成功,失败则给出一段提示
50 {
51 cout << "Failed to create GLFW window" << endl;
52 glfwTerminate(); // glfw关闭
53 return -1; // 进程结束
54 }
55
56 glfwMakeContextCurrent(window_1); // 捕获当前窗口,准备对当前窗口进行画图
57
58 glewExperimental = GL_TRUE; // 如果程序编译的时候说有问题的时候,再打开这条语句(以前解决问题的一条语句)
59
60 if (glewInit() != GLEW_OK) // 判断glew初始化是否成功,看返回值是否成功 失败则给出一段提示
61 {
62 cout << "Failed to initialise GLEW" << endl;
63 glfwTerminate(); // 关闭glfw
64 return -1;
65 }
66
67 glViewport(0, 0, screenWidth, screenHeight); // 设置视口的大小(帧缓存的大小传进去)
68 // 原函数声明: glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
69 // (x ,y)代表视口(正方形)的左下角的坐标。width、height分别代表视口的宽和高
70
71 while (!glfwWindowShouldClose(window_1)) // 只要当前窗口不关闭,一直执行这个循环
72 {
73 glfwPollEvents(); // 事件相应的命令,作用:捕获所有的事件。
74
75 glClearColor(0.5f, 0.7f, 0.5f, 1.0f); // 分别是红、绿、蓝、透明度的四个参数。RGB三原色+透明度(1.0表示不透明,0.1表示完全透明)
76 // 一般电脑的RGB显示的都是8位,能表示256*256*256=16777216色
77
78 glClear(GL_COLOR_BUFFER_BIT); // glClear():使用 glClearColor 中指定的值设定颜色缓存区的值,
79 // 即将窗口中的每一个像素设置为背景色GL_COLOR_BUFFER_BIT
80
81 glfwSwapBuffers(window_1); // 打开双缓存模式(进阶知识),相当于拿出两块“画板”(一块画好的展示在你面前,另一块接着画,反正画好才给你看)
82 }
83
84 glfwTerminate(); // 如果循环结束:glfw关闭
85
86 return 0;
87 }
![]()