OpenGL_6:用两个VBO和VAO分别画2个三角形
2017-10-16 21:21
471 查看
#include <stdio.h> #include <GLAD/glad.h> #include <GLFW/glfw3.h> const char *vertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec3 aPos;\n" "void main(){\n" "gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0f);\n" "}\n\0"; const char *fragmentShaderSource = "#version 330 core\n" "out vec4 FragColor;\n" "void main(){\n" "FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0"; void processInput(GLFWwindow *glfWwindow); void framebuffer_size_callback(GLFWwindow* glfWwindow, int width, int height); int main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow *glfWwindow = glfwCreateWindow(800, 600, "Square", NULL, NULL); if (NULL == glfWwindow){ printf("Failed to create window \n"); glfwTerminate(); return -1; } glfwMakeContextCurrent(glfWwindow); glfwSetFramebufferSizeCallback(glfWwindow, framebuffer_size_callback); if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){ printf("Failed to initialize GLAD\n"); } unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); int success; char infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success){ glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); printf("Failed to compile vertexShader:%s 4000 \n", infoLog); } unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success){ glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); printf("Failed to compile fragmentShader:%s \n", infoLog); } unsigned int shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); glGetShaderiv(shaderProgram, GL_LINK_STATUS, &success); if (!success){ glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); printf("Failed to link shaderProgram:%s \n", infoLog); } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); float vertices_1[] = { // first triangle -0.9f, -0.5f, 0.0f, // left -0.0f, -0.5f, 0.0f, // right -0.45f, 0.5f, 0.0f // top }; float vertices_2[] = { // second triangle 0.0f, -0.5f, 0.0f, // left 0.9f, -0.5f, 0.0f, // right 0.45f, 0.5f, 0.0f // top }; unsigned int VBO[2], VAO[2]; glGenVertexArrays(2, VAO); glGenBuffers(2, VBO); glBindVertexArray(VAO[0]); glBindBuffer(GL_ARRAY_BUFFER, VBO[0]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices_1), vertices_1, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // glBindVertexArray(0); //no need to unbind at all as we directly bind a different VAO the next few lines // glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(VAO[1]); glBindBuffer(GL_ARRAY_BUFFER, VBO[1]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices_2), vertices_2, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // glBindVertexArray(0); // not really necessary as well, but beware of calls that could affect VAOs while this one is bound (like binding element buffer objects, or enabling/disabling vertex attributes) // glBindBuffer(GL_ARRAY_BUFFER, 0); /** * 当目标是GL_ELEMENT_ARRAY_BUFFER的时候,VAO会储存glBindBuffer的函数调用。 * 这也意味着它也会储存解绑调用,所以确保你没有在解绑VAO之前解绑索引数组缓冲, * 否则它就没有这个EBO配置了。 * */ //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); while (!glfwWindowShouldClose(glfWwindow)){ processInput(glfWwindow); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram); glBindVertexArray(VAO[0]); glDrawArrays(GL_TRIANGLES, 0, 3); glBindVertexArray(VAO[1]); glDrawArrays(GL_TRIANGLES, 0, 3); // glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glfwSwapBuffers(glfWwindow); glfwPollEvents(); } glDeleteVertexArrays(2, VAO); glDeleteBuffers(2, VBO); glfwTerminate(); return 0; } void processInput(GLFWwindow *glfWwindow){ if (glfwGetKey(glfWwindow, GLFW_KEY_ESCAPE)) glfwSetWindowShouldClose(glfWwindow, GLFW_TRUE); } void framebuffer_size_callback(GLFWwindow* glfWwindow, int width, int height){ glViewport(0, 0, width, height); }
运行结果:
相关文章推荐
- OpenGL_7:用两个片段着色器和着色器程序分别画2个不同颜色的三角形
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形 【转】
- OpenGL VAO和VBO画三角形-1
- OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
- OpenGL进阶(九) - GLSL中VAO和VBO的使用
- GLSL(6)分别使用可编程渲染管线编程和固定渲染管线编程来画点(理解VAO&VBO)
- opengl中VAO,VBO,IBO用法小结
- opengl VAO and VBO
- OSG与OPENGL分别绘制同一个应用的两个窗口的问题
- OpenGL——VAO,VBO,EBO等对象的使用
- OpenGL_5:画两个三角形
- opengl中VAO,VBO,IBO用法小结(zz)
- OpenGL红宝书第一个例子:绘制两个三角形
- OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别