OpenGL之DrawTriangle

发布时间 2023-08-03 13:17:27作者: 三岁玩童
  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 }