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 }
标签:DrawTriangle,OpenGL,0.0,0.5,vertexShader,顶点,着色器 From: https://www.cnblogs.com/sansuiwantong/p/17603064.html