OpenGL学习笔记(四)OpenGL 你好,三角形(2)
2020-02-13 21:17
741 查看
顶点数组对象(Vertex Array Object, VAO)可以像顶点缓冲对象那样被绑定,任何随后的顶点属性调用都会储存在这个VAO中。这样的好处就是,当配置顶点属性指针时,只需要将那些调用执行一次,之后再绘制物体的时候只需要绑定相应的VAO就行了。怀着面向对象的思想去看就很容易理解这一点了。
注意:如果绑定VAO失败,OpenGL会拒绝绘制任何东西。
创建VAO:
[code]unsigned int VAO; glGenVertexArrays(1, &VAO);
使用VAO(示例):
[code]// ..:: 初始化代码(只运行一次 (除非你的物体频繁改变)) :: .. // 1. 绑定VAO glBindVertexArray(VAO); // 2. 把顶点数组复制到缓冲中供OpenGL使用 glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 3. 设置顶点属性指针 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); [...] // ..:: 绘制代码(渲染循环中) :: .. // 4. 绘制物体 glUseProgram(shaderProgram); glBindVertexArray(VAO); someOpenGLFunctionThatDrawsOurTriangle();
接下来是绘制函数:glDrawArrays函数。
它使用当前激活的着色器,之前定义的顶点属性配置,和VBO的顶点数据(通过VAO间接绑定)来绘制图元。
[code]glUseProgram(shaderProgram);//使用着色器 glBindVertexArray(VAO);//绑定到VAO glDrawArrays(GL_TRIANGLES, 0, 3);//绘制图元
绘制结果:
提高代码效率:索引缓冲对象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO)。
作用:只储存不同的顶点,并设定绘制这些顶点的顺序。
定义顶点和索引:
[code]float vertices[] = { 0.5f, 0.5f, 0.0f, // 右上角 0.5f, -0.5f, 0.0f, // 右下角 -0.5f, -0.5f, 0.0f, // 左下角 -0.5f, 0.5f, 0.0f // 左上角 }; unsigned int indices[] = { // 注意索引从0开始! 0, 1, 3, // 第一个三角形 1, 2, 3 // 第二个三角形 }; //创建索引缓冲对象 unsigned int EBO; glGenBuffers(1, &EBO); //绑定EBO并复制索引到缓冲中 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); //进行索引绘制 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
常见用法样例:
[code]// ..:: 初始化代码 :: .. // 1. 绑定顶点数组对象 glBindVertexArray(VAO); // 2. 把我们的顶点数组复制到一个顶点缓冲中,供OpenGL使用 glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 3. 复制我们的索引数组到一个索引缓冲中,供OpenGL使用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); // 4. 设定顶点属性指针 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); [...] // ..:: 绘制代码(渲染循环中) :: .. glUseProgram(shaderProgram); glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0) glBindVertexArray(0);
pis:线框模式:glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【笔记】《WebGL编程指南》学习-第3章绘制和变换三角形(2-你好三角形))
- Android OpenGL学习笔记(二)之----三角形的绘制.
- Android OpenGL学习笔记(二)之----三角形的绘制.
- learnopengl cn 学习笔记(三) 三角形
- OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
- openGL画三角形---openGL学习笔记(四)
- openGL学习笔记--第一个三角形
- opengl es3.0游戏开发学习笔记1-绘制旋转的三角形
- Android OpenGL学习笔记(二)之----三角形的绘制.
- openGL学习笔记--第一个三角形
- OpenGL SUPERBIBLE Fifth Edition 学习笔记1
- OpenGL学习笔记(二)
- 一、openGL 学习笔记 (基础问题)
- OpenGL学习笔记 (2) —— 绘制多边形
- openGL学习笔记 简单概念
- OpenGL学习笔记(5)之VBO
- OpenGL学习笔记(6)之变换矩阵
- OpenCV学习笔记(19)双目测距与三维重建的OpenCV实现问题集锦(四)三维重建与OpenGL显示
- OpenGL学习笔记1:环境配置和基本流程
- OpenCV for Ios 学习笔记(9)-用OPENGL渲染AR场景2