OpenGL中VBO、VAO、EBO的区别以及作用

本文介绍了VBO在提高渲染效率中的角色,以及如何将VBO数据与顶点着色器属性映射。后续讨论了VAO用于简化设置和重复使用数据,以及EBO如何通过索引减少重复顶点的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 一、VBO(顶点缓冲对象)的作用

由于在渲染绘制图形时,顶点数据从CPU发送到GPU进行渲染显示效率太低,这样我们就需要尽可能先把所有顶点缓存下来,一起发送给GPU,当数据发送到GPU的内存后,着色器就能很快访问到了。那么VBO就诞生了,它可以管理CPU内存中的数据,可以理解为CPU 和 GPU 之间传递信息的桥梁,先把数据存入VBO(这一步在CPU执行),然后VBO会自动把数据送入GPU。送入GPU这一步,不需任何人为操作,用户只负责往VBO中存入数据就可以了。大致过程如下图:

 。然而有了数据后,这些数据有什么含义,哪些是一组,哪些是一类,着色器并不知道,这就需要我们在程序中指定怎样解释VBO中的数据,将这些数据和着色器中的顶点属性一一对应起来,也就是链接顶点属性。

二、VBO中的数据与顶点着色器的顶点属性之间的关系进行映射

(1)顶点属性可以理解为一个点的所拥有的特征,比如说点的位置、点的纹理、点的颜色等,这些都可以称之为顶点属性。

(2)表示一个顶点属性可能需要1到n个数据为一组进行表示,比如说点位置(三维坐标),就是由3个数据为一组进行表示(x,y,z),点颜色就是由4个数据为一组进行表示(r,g,b,a)进行表示,那么就需要把VBO的数据和这些顶点属性进行映射链接。比如我们在VBO中存了这样一组数据:

float datas[] = 
{
    //顶点位置坐标(3个一组)     //颜色坐标(4个一组)     
    x1,y1,z1,                   r1,g1,b1,a1,  
    x2,y2,z2,                   r2,g2,b2,a2, 
    x3,y3,z3,                   r3,g3,b3,a3,                              
}

在opengl中可以通过设置顶点属性指针来向GPU解释上面的与顶点属性之间的映射关系,代码如下:

glVertexAttribPointer(0,3,GL_FLOAT,GL_FLASE,7*sizeof(GLfloat),(GLvoid*)0);

 

glVertexAttribPointer(1,4,GL_FLOAT,GL_FALSE,7*sizeof(GLfloat),(GLvoid*)*3*sizeof(GLfloat));

不同该函数的每个参数的意义可以去网上查询,这里不再做过多的赘述,现在我们已经定义了OpenGL该如何解释顶点数据。但每当我们绘制一个物体的时候必须重复向VBO写入数据、解释顶点数据。

三、VAO(顶点数组对象)

      (1)当属性较多,需要绘制的物体较多,这将会非常麻烦,为此VAO就诞生了,它可以将上述的步骤给保存起来,只需设置一遍就足够了,后面每当绘制新的一帧时,只需绑定VAO就行,关系图大致如下。

 (2)在一些复杂的OpenGL程序中,VBO可能会有多个,那么如何用一个VAO来解释多个VBO?

四、一个VAO解释多个VBO

        大致流程如下:

        (1)绑定VAO

 五、EBO(索引缓冲对象)

        当我们要绘制一个四边形,可与通过绘制两个三角形来组合成一个四边形,顶点数据如下图:

 

         可以看到当组合成一个四边形,会有两组点会重复,也就是v1和v6,v3和v4。这样会造成不必要的浪费,那么有没有一种办法只通过这4个不同的顶点来绘制。其实是可以的,通过VBO储存4个顶点,EBO也像VBO那样,也是个缓冲对象,它专门存储点的索引,通过点的索引来绘制,这样就可以重复利用那些唯一的点,上面的四边形可以通过下面的索引来创建:

GLfloat vertices[] = {
         0.5f,  0.5f, 0.0f,  // Top Right(索引为0)
         0.5f, -0.5f, 0.0f,  // Bottom Right(索引为1)
        -0.5f, -0.5f, 0.0f,  // Bottom Left(索引为2)
        -0.5f,  0.5f, 0.0f   // Top Left (索引为3)
    };
    GLuint indices[] = {  // Note that we start from 0!
        0, 1, 3,  // 第一个三角形
        1, 2, 3   //第二个三角形
    };

        还有一点需要注意的是,当我们绑定EBO时,与VBO一样,也会自动保存到VAO中,因此只需要设置一遍就够了。

至此,有关VAO和EBO以及VBO之间的作用及其区别已赘述完,也是个人的一点见解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值