OpenGL——VAO,VBO,EBO等对象的使用
2017-06-08 21:35
411 查看
OpenGL——VAO,VBO,EBO等对象的使用
最近在学OpenGL为接下来的秋招做准备。OpenGL的对象让我花了很大的脑筋去理解,这里整理我现在遇到的常用对象。VBO(Vertex Buffer Object):顶点缓冲对象
VAO(Vertex Array Object):顶点数组对象
EBO(Element Buffer Object):索引缓冲对象
着色器对象
VBO(Vertex Buffer Object):顶点缓冲对象
使用OpenGL要定义很多顶点,这些顶点存储在GPU的显存上。VBO就是用来管理这些内存的。换句话说,VBO代表着我们定义的顶点。这样做的好处就是我们可以一次性发送大量顶点数据到显卡上,而不用每次发送一个。从CPU发送数据到显卡可是很慢的。
——我自己说的
VBO的使用方法:
gluint VBO; //定义一个无符号整形VBO对象,其值为其ID glGenBuffers(num, &VBO);//分配num个缓冲给VBO
至此对象创建完毕,VBO的值即为缓冲的ID。
glBindBuffer(GL_ARRAY_BUFFER,VBO);//将VBO对象绑定到顶点缓冲
从此起,任何作用于顶点缓冲的操作,都会配置当前绑定的缓冲(VBO)。相当于状态设置。
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);//将我们定义的顶点数据复制到当前缓冲
不解释API,可以去这里查看。我们自己定义的顶点数据被复制到了当前的顶点缓冲,因为之前我们把VBO绑定到了当前的顶点缓冲,这些顶点数据也就被绑定到了VBO。
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(GLfloat),(GLvoid*)0);//告诉OpenGL如何解释顶点数据
具体细节就不解释了,API在这里。我们确实定义了顶点数据,也绑定了顶点数据,但是我们还没有告诉愚蠢的计算机如何解释这些数据。这个函数用来解决这个问题。注意:VBO不会记录这一行为(所以我们需要VAO)。
glEnableVertexAttribArray(0);//启用顶点属性
上一个函数我们设置了顶点属性,这里告诉愚蠢的计算机“嗨,设置好了!”注意:VBO不会记录这一行为(所以我们需要VAO)。
VAO(Vertex Array Object):顶点数组对象
VAO是VBO的升级版。顶点我们存储在VBO里面了,但是每次切换顶点缓冲对象都要重新配置其属性,这样很不方便不是吗?VAO就是为了解决这个问题出现的,它记录了VBO及其属性配置。这样我们绘制一个物体时,只需要绑定相应的VAO就行了。
——也是我自己说的
VAO的使用方法:
//定义并绑定VAO gluint VAO; glGenVertexArrays(1,&VAO); glBindVertexArray(VAO); //绑定VBO并设置其属性 glBindBuffer(GL_ARRAY_BUFFER,VBO); glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW); glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(GLFloat),(GLvoid*)0); glEnableVertexAttribArray(0); //解绑VAO glBindVertexArray(0);
生成一个VAO和VBO很类似。绑定VAO后,一切的VBO操作都会记录在当前绑定的VAO上。
EBO(Element Buffer Object):索引缓冲对象
有时候我们不想按照12345这样刻板的顺序使用我们定义的数据,比如说我们定义了四个顶点,想画两个同边的三角形来组成一个矩形,那么我们将希望我们的顶点按照123,234这样的顺序被使用。这时候EBO就派上用场了!EBO被设计用来存储顶点的顺序(索引)。
——还是我自己说的
EBO的使用方式与VBO几乎完全一样,这里就不赘述了。需要注意的是,EBO所绑定的数组并非顶点数据,而是记录顺序的数组。
着色器对象
着色器对象用来绑定着色器程序,如果你不知道着色器是什么,建议你先去好好看书。着色器对象的使用方法:
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);//创建着色器对象 glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);//绑定着色器源代码 glCompileShader(vertexShader);//编译程序 GLuint shaderProgram = glCreateProgram();//创建着色器程序 glAttachShader(shaderProgram, vertexShader);//将着色器对象绑定到着色器程序 glLinkProgram(shaderProgram);//连接程序 glUseProgram(shaderProgram);//使用程序 glDeleteShader(vertexShader);//删除着色器对象
这里只定义了一个顶点着色器,很好理解。事实上真实情况一定不止这一个着色器对象。
批判的武器不能代替武器的批判。——始皇帝
这篇博客肯定不能完全说清这几种对象,还是需要认真去看书。这里只是希望给被书上的内容搞得团团转的朋友做个简单的梳理。
新手上道,内容可能有错误,欢迎大家指正。
相关文章推荐
- 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的关系,介绍Qt如何使用OpenGL
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
- OpenGL进阶(九) - GLSL中VAO和VBO的使用
- OpenGL中的VBO与VAO的使用
- OpenGL进阶(九) - GLSL中VAO和VBO的使用
- 在macOS上学习OpenGL | VBO、VAO 和 EBO
- OpenGL VAO, VBO 使用简介
- OpenGL进阶(九) - GLSL中VAO和VBO的使用
- OpenGL(二十四) VAO、VBO和着色器使用示例
- opengl VAO ,VBO
- OpenGL系列教程之八:OpenGL顶点缓冲区对象(VBO)
- OpenGL顶点缓冲区对象(VBO)
- OpenGL 4.0 GLSL 基础教程概览——VAO和VBO常用操作接口