与上一节内容基本相同,只是用ElementArraryBuffer绘制三角形,也就是VBO与IBO。
1.VBO 一系列点,通过glDrawArrays指定绘制几个点,是连续的,不能跳跃。
2.IBO(ElementArrayBufferObject) 一系列点,通过指定其中的某一些点组成三角形,不需要是连续的。
gldrawElement(绘制什么,绘制数据的个数,类型,绘制的起始位置)
3.其他与上一节相同,代码部分如下:
1#include<GL/glew.h> 2#include <GLFW/glfw3.h> 3#include <stdio.h> 4#include<iostream> 5#include<glm/glm.hpp> 6#include<glm/ext.hpp> 7using namespace std; 8struct Vertex 9{ 10 float pos[3]; 11 float color[4]; 12}; 13 14char *LoadFileContent(const char*path)//加载shader 15{ 16 FILE*pFile = fopen(path, "rb"); 17 if (pFile) 18 { 19 fseek(pFile, 0, SEEK_END); 20 int nLen = ftell(pFile); 21 char*buffer = new char[nLen+1]; 22 rewind(pFile); 23 fread(buffer, nLen , 1, pFile); 24 buffer[nLen]='\0'; 25 fclose(pFile); 26 return buffer; 27 } 28 fclose(pFile); 29 return nullptr; 30} 31 32GLuint CreateGPUProgram(const char*vsShaderPath, const char*fsShaderPath)//编译shader 33{ 34 GLuint vsShader = glCreateShader(GL_VERTEX_SHADER); 35 GLuint fsShader = glCreateShader(GL_FRAGMENT_SHADER); 36 const char* vsCode = LoadFileContent(vsShaderPath); 37 const char* fsCode = LoadFileContent(fsShaderPath); 38 glShaderSource(vsShader, 1, &vsCode, nullptr); 39 glShaderSource(fsShader, 1, &fsCode, nullptr);//ram -> vram 40 glCompileShader(vsShader); 41 glCompileShader(fsShader); 42 GLuint program = glCreateProgram(); 43 glAttachShader(program, vsShader); 44 glAttachShader(program, fsShader); 45 glLinkProgram(program); 46 glDetachShader(program,vsShader); 47 glDetachShader(program, fsShader); 48 glDeleteShader(vsShader); 49 glDeleteShader(fsShader); 50 return program; 51} 52 53int main(void) 54{ 55 GLFWwindow* window; 56 57 /* Initialize the library */ 58 if (!glfwInit()) 59 return -1; 60 61 /* Create a windowed mode window and its OpenGL context */ 62 window = glfwCreateWindow(480, 320, "Hello World", NULL, NULL); 63 if (!window) 64 { 65 glfwTerminate(); 66 return -1; 67 } 68 69 /* Make the window's context current */ 70 glfwMakeContextCurrent(window); 71 72 //shader数据 73 GLenum status = glewInit(); 74 75 if (status != GLEW_OK) 76 { 77 cout<<">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"<<endl; 78 std::cout << "Error::GLEW glew version:" << glewGetString(GLEW_VERSION) 79 << " error string:" << glewGetErrorString(status) << std::endl; 80 glfwTerminate(); 81 std::system("pause"); 82 // return -1; 83 } 84 GLuint program = CreateGPUProgram("/home/jun/Qt_Preject/opengl/shader/materials/sample.vs", "/home/jun/Qt_Preject/opengl/shader/materials/sample.fs"); 85 //取得shader变量的位置 86 GLint posLocation, colorLocation, MLocation, VLocation, PLocation; 87 posLocation = glGetAttribLocation(program, "pos"); 88 colorLocation = glGetAttribLocation(program, "color"); 89 90 MLocation = glGetUniformLocation(program, "M"); 91 VLocation = glGetUniformLocation(program, "V"); 92 PLocation = glGetUniformLocation(program, "P"); 93 94 Vertex vertex[3]; 95 vertex[0].pos[0] = 0; 96 vertex[0].pos[1] = 0; 97 vertex[0].pos[2] = -100.0f; 98 vertex[0].color[0] = 1.0f; 99 vertex[0].color[1] = 1.0f; 100 vertex[0].color[2] = 1.0f; 101 vertex[0].color[3] = 1.0f; 102 103 vertex[1].pos[0] = 10; 104 vertex[1].pos[1] = 0; 105 vertex[1].pos[2] = -100.0f; 106 vertex[1].color[0] = 1.0f; 107 vertex[1].color[1] = 1.0f; 108 vertex[1].color[2] = 1.0f; 109 vertex[1].color[3] = 1.0f; 110 111 vertex[2].pos[0] = 0; 112 vertex[2].pos[1] = 10; 113 vertex[2].pos[2] = -100.0f; 114 vertex[2].color[0] = 1.0f; 115 vertex[2].color[1] = 1.0f; 116 vertex[2].color[2] = 1.0f; 117 vertex[2].color[3] = 1.0f; 118 //vbo上传shader数据到GPU 119 GLuint vbo; 120 glGenBuffers(1, &vbo); 121 glBindBuffer(GL_ARRAY_BUFFER, vbo); 122 glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 3, vertex, GL_STATIC_DRAW); 123 glBindBuffer(GL_ARRAY_BUFFER, 0); 124 //ibo上传shader数据到GPU 125 unsigned int indexes[] = {0,1,2}; 126 GLuint ibo; 127 glGenBuffers(1, &ibo); 128 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 129 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * 3, indexes, GL_STATIC_DRAW); 130 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 131 132 133 134 float identity[] = { 135 1,0,0,0, 136 0,1,0,0, 137 0,0,1,0, 138 0,0,0,1 139 }; 140 glm::mat4 projection = glm::perspective(45.0f, 800.0f / 600.0f, 0.1f, 1000.0f); 141 142 143 /* Loop until the user closes the window */ 144 while (!glfwWindowShouldClose(window)) 145 { 146 /* Draw a triangle */ 147 glUseProgram(program); 148 glUniformMatrix4fv(MLocation, 1, GL_FALSE, identity); 149 glUniformMatrix4fv(VLocation, 1, GL_FALSE, identity); 150 glUniformMatrix4fv(PLocation, 1, GL_FALSE, glm::value_ptr(projection)); 151 152 glBindBuffer(GL_ARRAY_BUFFER, vbo); 153 glEnableVertexAttribArray(posLocation); 154 glVertexAttribPointer(posLocation, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0); 155 glEnableVertexAttribArray(colorLocation); 156 glVertexAttribPointer(colorLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float)*3)); 157 158 //glDrawArrays(GL_TRIANGLES, 0, 3); 159 //glBindBuffer(GL_ARRAY_BUFFER, 0); 160 glBindBuffer(GL_ARRAY_BUFFER, 0); 161 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 162 glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0); 163 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 164 165 166 glUseProgram(0); 167 /* Swap front and back buffers */ 168 glfwSwapBuffers(window); 169 170 /* Poll for and process events */ 171 glfwPollEvents(); 172 } 173 174 glfwTerminate(); 175 return 0; 176}
效果和上一节一样。