当我更新顶点缓冲区对象时,应该如何更新它使用的顶点数组对象?

2024-03-25

通过 glBufferData() 更新 VBO(尤其是其大小)可能会更改其物理内存地址,但不会更改 glGenBuffers() 设置的缓冲区对象名称。 VBO 通过调用 glVertexAttribPointer() 链接到 VAO,其中有关 VBO 的信息(缓冲区对象名称?内存地址?)存储在 VAO 中。 当通过 glBindVertexArray() 绑定 VAO 时,它就可用于更新和绘制。 GL当时是否重新计算VBO地址? 当 VAO 链接到的 VBO 通过 glBufferData() 更新时,VAO 可能会或可能不会被绑定。

根据缓冲区对象名称何时转换为物理内存地址,我可以想象,只需在更改 VBO 后再次绑定 VAO 即可为更改后的 VBO 更新 VAO;或者,可能需要通过再次调用 glVertexAttribPointer() 来更彻底地更新 VAO。

所以这个问题的一部分是:VAO 中存储了有关 VBO 的哪些信息?如果只是缓冲区对象名称,则在更改 VBO 内容后无需再次调用 glVertexAttribPointer()。

也许这些细节不是 API 规范的一部分,因此唯一安全的做法是在每次更新链接的 VBO 后通过 glVertexAttribPointer() 更新 VAO。


您不必担心这一点,因为 VBO 永远不会向您公开底层服务器内存空间。顶点属性指针相对于绑定到的对象的开头GL_ARRAY_BUFFER在你设置它们的时候。

即使您通过调用重新分配缓冲区glBufferData (...)(这会创建一个new数据存储,而不是按照您的问题建议更新它),您的顶点属性指针不会失效。这是因为它们实际上是命名缓冲区内存中的偏移量,而不是任意地址;它需要两条信息(缓冲区名称andoffset) 来建立顶点指针。


UPDATE: (Citing implementation details)

以下内容来自GL_ARB_vertex_attrib_binding https://www.opengl.org/registry/specs/ARB/vertex_attrib_binding.txt:

修改第 2.9.6 节“缓冲区对象中的顶点数组”

当数组被获取时从缓冲区对象中,顶点属性的 VERTEX_ATTRIB_BINDING 指示使用哪个顶点缓冲区绑定。这 属性的 VERTEX_ATTRIB_RELATIVE_OFFSET 和顶点的总和 缓冲区绑定的 VERTEX_BINDING_OFFSET 用作偏移量(在基本中 机器单位)该缓冲区数据存储中的第一个元素。

    bindingIndex = VERTEX_ATTRIB_BINDING[attribIndex];
    buffer = VERTEX_BINDING_BUFFER[bindingIndex];

    if (buffer->name != 0) {
        address = buffer->baseAddress + 
                  VERTEX_BINDING_OFFSET[bindingIndex] + 
                  VERTEX_ATTRIB_RELATIVE_OFFSET[attribIndex];
    }

这段代码来自 OpenGL (4.3) 的扩展/版本,不属于原始讨论的一部分,但我认为值得一提,因为无论如何,这就是顶点属性指针在幕后工作的方式。新的 API 使您可以自由地指定独立于顶点缓冲区的顶点属性格式(它不关心绑定到什么)GL_ARRAY_BUFFER在您设置属性格式时)。

当命令来源数组存储器时(例如,glDrawArrays (...)).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我更新顶点缓冲区对象时,应该如何更新它使用的顶点数组对象? 的相关文章

  • glBitmap 问题

    我正在使用一些遗留代码来工作 它使用 glBitmap 调用来绘制位图图标 我的问题是 一旦你一次绘制大约 1000 个图标 它就会变得相当慢 它会减慢到大约 1 到 2 秒的刷新率 我想看看是否可以让它更快 首先我应该描述当前代码是如何工
  • 模拟绘画应用的笔触

    我正在尝试编写一个应用程序 可用于使用模拟笔触创建看起来像绘画的图片 是否有任何好的资源可以提供模拟笔触的简单方法 例如 给定用户拖动鼠标经过的鼠标位置列表 画笔宽度和画笔纹理 如何确定要在画布上绘制的内容 我尝试将画笔纹理倾斜到鼠标移动的
  • 从文件中读取 GLSL 着色器

    我正在尝试从如下所示的文件中读取顶点和片段着色器 version 330 core in vec3 ourColor out vec4 color void main color vec4 ourColor 1 0f but when i
  • OpenGL NURBS 曲面

    我正在学习 OpenGL 我想要一个中间有轻微驼峰的表面 我目前正在使用这段代码 但我不确定如何调整 ctrl 点以使其达到我想要的方式 它目前就像 我想要这样的 我不完全确定我应该使用哪些控制点 并且我对其工作原理感到困惑 include
  • 交错顶点提交如何提高性能?

    我已经阅读并看到了其他问题 这些问题通常都指向将顶点位置和颜色等交错到一个数组中的建议 因为这可以最大限度地减少从 cpu 发送到 gpu 的数据 我不清楚的是 即使使用交错数组 您仍然必须对位置和颜色指针进行单独的 GL 调用 OpenG
  • 使用 openGL、SOIL 加载图像

    我尝试了很多使用 SOIL 在 openGL 中加载和显示图像的示例 运行下面的源代码时 它仅显示一个没有图像的白色四边形 我尝试打开一个名为 foto 的图像 我将图像文件放在程序的文件夹中 bool keyStates new bool
  • OpenGL 说“from_param 收到了一个不连续的数组”

    安装 Yosemite 后 我必须升级 numpy PyOpenGL 等 现在 以前运行的程序给了我以下堆栈跟踪 file latebind pyx line 44 in OpenGL accelerate latebind Curry c
  • 纹理openGl。 C++、qt

    我试图用草纹理覆盖我的地形 由高度图制成 但它没有按预期工作 我什至无法在简单的 GL QUAD 上获取纹理 结果是多色网络 void GLWidget initializeGL glEnable GL TEXTURE 2D 在 QGLwi
  • glEnableVertexAttribArray 中“index”参数的含义以及(可能)OS X OpenGL 实现中的错误

    1 我是否正确理解 要使用顶点数组或VBO进行绘制 我需要所有属性在着色器程序链接之前调用glBindAttribLocation 或者在着色器程序成功链接后调用glGetAttribLocation 然后使用glVertexAttribP
  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • lnk1104:无法打开“LIBC.lib”链接

    使用 GLee 将着色器写入我的 OpenGL 项目并编译后 我收到了错误LNK1104 cannot open file LIBC lib 我尝试按照其他人的建议添加它并忽略它 但没有解决问题 有没有其他方法可以解决我错过的这个问题 以下
  • Eclipse 标记 OpenGL 函数无法解析

    我尝试在 Eclipse C C 中使用一些 OpenGL 函数 一些 标准 函数如 GlClear 可以被 eclipse 识别 而其他函数如 glBindBuffer 和 glEnableVertexAttribArray 则不能 它们
  • 为什么 OpenGL 给对象提供句柄而不是指针?

    OpenGL 的传统是让用户使用 unsigned int 句柄来操作 OpenGL 对象 为什么不直接给出一个指针呢 与指针相比 唯一 ID 有何优点 TL DR OpenGL ID 不会双射映射到内存位置 单个 OpenGL ID 可能
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • NV_path_rendering替代方案[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚观看了 Siggraph 2012 的一个非常令人印象深刻的演示 http nvidia fullviewmedia com sig
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi
  • 为什么OpenGL使用float而不是double? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • GL_CULL_FACE使所有对象消失

    我正在尝试在 openGL3 3 中创建一些简单的多边形 我有两种类型的对象 具有以下属性 对象 1 10 个顶点 按顺序在下面列出 存储在GL ARRAY BUFFER并使用GL TRIANGLE FAN v x y z w v 0 0
  • Glew+GLFW Win32 无依赖项 Visual Studio

    是否可以在不将文件复制到 C 的情况下构建并链接 Glew 和 GLFW 我找不到任何说明如何在不将 DLL 复制到 C 上的 Visual Studio 目录的情况下使用这些库的文档 我只想包含项目目录中所需的所有 dll 和 lib 文
  • 在 2D 纹理上绘制的红色矩形在绘制后立即消失

    跟随我的另一个问题 https stackoverflow com questions 18477291 render an outlined red rectangle on top a 2d texture in opengl 1847

随机推荐