当前位置: 首页 > 知识库问答 >
问题:

顶点数组对象和顶点缓冲区对象的使用

韩寂离
2023-03-14

我正在努力理解这两个,如何使用它们,以及它们是如何联系的。假设我想创建一个简单的地形和一个有纹理的立方体。对于这两个对象,我有三角形、顶点的数组,对于立方体,我有一个包含纹理数据的数组。我的问题是:我如何使用VAOs和VBOs来创建和呈现这两个?

    null

共有1个答案

宋高谊
2023-03-14

>

  • 顶点数组对象在概念上只不过是瘦状态包装器。

    顶点缓冲区对象存储实际数据。

    对此的另一种思考方式是,VAO描述存储在一个或多个VBO中的数据。

    将VBO(以及一般的缓冲区对象)视为存储在服务器(GPU)内存中的非结构化数据数组。如果需要,可以在多个数组中布局顶点数据,也可以将它们打包到单个数组中。在任何一种情况下,缓冲区对象都可以归结为存储数据的位置。

    顶点数组对象跟踪绘制命令所需的指向VBO内存的实际指针。

    但是,它们比指针稍微复杂一点,就像在C语言中所知道的那样。顶点指针跟踪指定时绑定的缓冲区对象、到其地址空间的偏移量、顶点属性之间的步长以及如何解释基础数据(例如,是保留整数值还是通过规范化到数据类型的范围将其转换为浮点[0.0,1.0])。

    例如,整数数据通常被转换为浮点数据,但决定这种行为的是用于指定顶点指针(GLVertexattribPointer(...)GLVertexattribPointer(...))的命令。

    顶点数组对象还跟踪当前绑定到gl_element_array_buffer的缓冲区对象。

    gl_element_array_buffer是命令gldrawelements(...)的索引列表的来源(假设为非零绑定),并且没有glelementarraypointer(...)命令。gldrawelements(...)将指针和draw命令组合成一个操作,并将使用活动顶点数组对象中存储的绑定来完成此操作。

    这样,除非您的对象共享顶点数据,否则您通常需要为每个对象提供一组唯一的VBO。

    如果需要,您可以对整个软件使用一个VAO,或者您可以利用这样一个事实,即更改绑定的VAO几乎会更改绘制不同对象所需的整个状态集。

    因此,绘制地形和立方体就像更改绑定的VAO一样简单。如果您需要对每个纹理应用不同的纹理,您可能需要做更多的工作,但VAO负责所有顶点数据相关的设置。

  •  类似资料:
    • 我目前正在使用LWJGL / OpenGL创建一个2D,自上而下的游戏,但是在绘制实体之后,在使用顶点缓冲区对象渲染实体后,在让它们四处移动的过程中,我遇到了一些问题。这是渲染线程的 run() 方法,以及设置方法: 实体从抽象超类继承这些方法来设置 VBO 并绘制实体(呈现线程中的 drawEntities 方法仅调用该方法,实体更新方法(见下文),而 setUpEntities 调用 setU

    • 我正在尝试从ArrayList读取并创建VBO,然后对其进行渲染。问题是我只是渲染了一个空白屏幕。当我立即渲染时,一切都很好;只有现在VBO的才不起作用。 游戏循环如下所示,相机调用glTranslate和glRotate函数。 渲染方法: 阵列列表具有顶点和链接的颜色。每个体素将其顶点添加到ArrayList(而不是立即渲染)。

    • 下面的lwjgl3代码设置缓冲区等,用于呈现三角形。我能看到三角形。现在我正努力弄明白到底是怎么回事。 下面是我对代码的理解。我们首先创建一个顶点缓冲区对象,它只是一个数组的容器。glBindBuffer()和glBufferData()使用顶点数组填充顶点缓冲区对象。我们再次对第二个顶点数组执行此操作。然后我们编译顶点和片段着色器,并将它们添加到着色器程序中。不知怎么的,这个程序访问第二个顶点缓

    • 我正在努力学习LWJGL (OpenGL)不得不说我很艰难。 我试着在窗户上画一个三角形和一个四边形,最后我设法做到了。 但我还有一个问题 如果您觉得这个问题很愚蠢,请提前表示歉意,但我在网上找不到非常详细的教程,所以很难理解,因为这是我第一次使用OpenGL。 话虽如此,这是代码的相关部分: 假设程序以60 fps的速度运行。< br >这意味着渲染方法每秒钟被游戏循环调用60次。 该渲染方法的

    • 我想知道什么等效的和帧缓冲区对象(FBO)。是否存在等价物,或者我需要自己实现一些东西?

    • 顶点数组对象( VAO )是一种特殊类型对象,它封装了与顶点处理器有关的所有数据,它仅仅是记录顶点缓存区和索引缓冲区的引用,以及顶点的各种属性的布局而不是实际的数据。这样做的好处是一旦你为一个 mesh 设置一个 VAO ,你就可以通过简单的绑定 VAO 来导入 mesh 的所有状态。之后你就可以直接渲染 mesh 对象而不需要担心它的状态,VAO 为你记住了它。如果你的程序需要对顶点属性布局不同