OpenGL_6:用两个VBO和VAO分别画2个三角形
来源:互联网 发布:淘宝手机模板 编辑:程序博客网 时间:2024/06/03 05:36
#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 \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);}
运行结果:
阅读全文
1 0
- OpenGL_6:用两个VBO和VAO分别画2个三角形
- 使用vbo、vao、ebo画三角形
- VBO和VAO
- OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
- OpenGL_7:用两个片段着色器和着色器程序分别画2个不同颜色的三角形
- OpenGL ES VBO 和 VAO
- VA、VAO和VBO API备忘
- VA、VAO和VBO API备忘
- VA、VAO和VBO API备忘
- 2017.08.05 vao和vbo使用
- GLSL(6)分别使用可编程渲染管线编程和固定渲染管线编程来画点(理解VAO&VBO)
- 多个顶点属性使用一个类型的VBO & VAO的使用和操作
- VBO,VAO、glVertexPointer()、glVertexAttribPointer()
- VBO与VAO
- VAO与VBO
- VBO与VAO
- opengl VAO ,VBO
- opengl VAO and VBO
- 事务的隔离级别
- 在windowns下安装Anaconda3运行spark
- 算法001号:栈顶的压入弹出序列
- 2017.10.16
- hive表信息查询:查看表结构、表操作等
- OpenGL_6:用两个VBO和VAO分别画2个三角形
- 第二十一课、结构体
- Android View深入解析(二)事件分发机制
- hdu 4751 Divide Groups(图的二染色)
- 关于java的注解
- 重载重写和重定义
- java 抽象类
- LeetCode3 Longest Substring Without Repeating Characters
- LED多通道颜色混色,求解每个通道所需要的占空比