OpenGL——VAO,VBO,EBO等对象的使用

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);//删除着色器对象

这里只定义了一个顶点着色器,很好理解。事实上真实情况一定不止这一个着色器对象。


批判的武器不能代替武器的批判。——始皇帝

这篇博客肯定不能完全说清这几种对象,还是需要认真去看书。这里只是希望给被书上的内容搞得团团转的朋友做个简单的梳理。
新手上道,内容可能有错误,欢迎大家指正。

猜你喜欢

转载自blog.csdn.net/dreamiond/article/details/72935213