1 /* 第一步:引入相应的库 */
2 #include <iostream>
3 using namespace std;
4
5 #define GLEW_STATIC
6 #include <GL/glew.h>
7 #include <GLFW/glfw3.h>
8
9
10 /* 第二步:编写顶点位置 */
11 GLfloat vertices_1[] =
12 {
13 0.0f, 0.5f, 0.0f, // 上顶点
14 -0.5f, -0.5f, 0.0f, // 左顶点
15 0.5f, -0.5f, 0.0f, // 右顶点
16 };
17
18
19 /* 第三步:编写顶点着色器 */
20 const GLchar* vertexCode_1 = "#version 330 core\n" // 3.30版本
21 "layout(location = 0) in vec3 position_1;\n" // 三个浮点数vector向量表示位置 position变量名
22 "void main()\n"
23 "{\n"
24 "gl_Position = vec4(position_1, 1.0f);\n" // 核心函数(位置信息赋值)
25 "}\n";
26
27
28 /* 第四步:编写片元着色器(也称片段着色器) */
29 const GLchar* fragmentCode_1 = "#version 330 core\n" // 版本信息
30 "out vec4 FragColor_1;\n" // 输出是四个浮点数构成的一个向量 RGB+aerfa
31 "void main()\n"
32 "{\n"
33 "FragColor_1 = vec4(0.5f, 0.75f, 0.25f, 1.0f);\n"
34 "}\n";
35
36 const static GLint WIDTH = 800, HEIGHT = 600;
37
38 // DrawArray 、 VAO 这两个要重点理解,其他只要知道大致模块功能就行了。
39
40 int main()
41 {
42 glfwInit();
43 GLFWwindow* window_1 = glfwCreateWindow(WIDTH, HEIGHT, "Learn OpenGL Triangle test", nullptr, nullptr);
44
45 int screenWidth_1, screenHeight_1;
46 glfwGetFramebufferSize(window_1, &screenWidth_1, &screenHeight_1);
47 glfwMakeContextCurrent(window_1);
48 glewInit();
49
50 //
51 GLint flag; // 用于判断编译是否成功
52 GLchar infoLog[512]; // 512个字符
53
54 /* 第三步:编写顶点着色器 */
55 GLuint vertexShader_1 = glCreateShader(GL_VERTEX_SHADER); // 创建顶点着色器对象
56 glShaderSource (vertexShader_1, 1, &vertexCode_1, NULL); // 将顶点着色器的内容传进来
57 glCompileShader(vertexShader_1); // 编译顶点着色器
58 glGetShaderiv (vertexShader_1, GL_COMPILE_STATUS, &flag); // 获取编译状态
59 if (!flag)
60 {
61 glGetShaderInfoLog(vertexShader_1, 512, NULL, infoLog); // 缓冲池
62 cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << endl;
63 }
64
65 /* 第四步:编写片元着色器(也称片段着色器) */
66 GLuint fragmentShader_1 = glCreateShader(GL_FRAGMENT_SHADER); // 创建片元着色器对象
67 glShaderSource (fragmentShader_1, 1, &fragmentCode_1, NULL); // 将顶点着色器的内容传进来
68 glCompileShader(fragmentShader_1); // 编译顶点着色器
69 glGetShaderiv (fragmentShader_1, GL_COMPILE_STATUS, &flag); // 获取编译状态
70 if (!flag)
71 {
72 glGetShaderInfoLog(fragmentShader_1, 512, NULL, infoLog); // 缓冲池
73 cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << endl;
74 }
75
76
77 /* 第五步:创建着色器程序 */
78 GLuint shaderProgram_1 = glCreateProgram();
79 glAttachShader(shaderProgram_1, vertexShader_1);
80 glAttachShader(shaderProgram_1, fragmentShader_1);
81 glLinkProgram (shaderProgram_1);
82 glGetProgramiv(shaderProgram_1, GL_LINK_STATUS, &flag);
83 if (!flag)
84 {
85 glGetProgramInfoLog(shaderProgram_1, 512, NULL, infoLog);
86 cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << endl;
87 }
88 glDeleteShader(vertexShader_1);
89 glDeleteShader(fragmentShader_1);
90
91
92 /* 第七步:设置顶点缓冲对象(VBO) + 第八步:设置顶点数组对象(VAO) */
93 GLuint VAO, VBO; // 它俩是成对出现的
94 glGenVertexArrays(1, &VAO);
95 glGenBuffers (1, &VBO);
96 glBindVertexArray(VAO);
97 glBindBuffer (GL_ARRAY_BUFFER, VBO); // 从显卡中划分一个空间出来
98 glBufferData (GL_ARRAY_BUFFER, sizeof(vertices_1), vertices_1, GL_STATIC_DRAW); // GL_STATIC_DRAW:静态的画图(频繁地读)
99
100
101 /* 第六步:设置链接顶点属性 */
102 glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
103 glEnableVertexAttribArray(0);
104
105 // draw loop 画图循环
106 while (!glfwWindowShouldClose(window_1))
107 {
108 glViewport (0, 0, screenWidth_1, screenHeight_1);
109 glfwPollEvents();
110 glClearColor (0.0f, 0.0f, 1.0f, 1.0f);
111 glClear (GL_COLOR_BUFFER_BIT);
112
113 /* 第九步:绘制三角形 */
114 glUseProgram (shaderProgram_1); // 渲染调用着色器程序
115 glBindVertexArray(VAO); // 绑定 VAO
116 glDrawArrays (GL_TRIANGLES, 0, 3); // 画三角形 从第0个顶点开始 一共画3次
117 glBindVertexArray(0); // 解绑定
118
119 glfwSwapBuffers(window_1);
120 }
121
122 glDeleteVertexArrays(1, &VAO);
123 glDeleteBuffers(1, &VBO);
124 glDeleteProgram(shaderProgram_1);
125
126 glfwTerminate();
127 return 0;
128 }