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

xiaoxiao2021-02-28  76

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。

//将VBO对象绑定到顶点缓冲 glBindBuffer(GL_ARRAY_BUFFER,VBO);

从此起,任何作用于顶点缓冲的操作,都会配置当前绑定的缓冲(VBO)。相当于状态设置。

//将我们定义的顶点数据复制到当前缓冲 glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);

不解释API,可以去这里查看。我们自己定义的顶点数据被复制到了当前的顶点缓冲,因为之前我们把VBO绑定到了当前的顶点缓冲,这些顶点数据也就被绑定到了VBO。

//告诉OpenGL如何解释顶点数据 glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(GLfloat),(GLvoid*)0);

具体细节就不解释了,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);//删除着色器对象

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


这篇博客肯定不能完全说清这几种对象,还是需要认真去看书。这里只是希望给被书上的内容搞得团团转的朋友做个简单的梳理。

新手上道,内容可能有错误,欢迎大家指正。

转载请注明原文地址: https://www.6miu.com/read-96874.html

最新回复(0)