OpenGL 顶点数组对象存储顶点缓冲区名称和索引,还是仅存储索引?

2023-12-02

创建后,VAO 是否仅跟踪 VBO 索引(通过glBindVertexBuffer),或者哪些 VBO 名称与这些索引绑定?如果我使用指定绑定索引,例如 0glVertexAttribBinding在 VAO 创建期间,我可以在绘制调用之前将不同的 VBO 绑定到索引 0 并让它使用该 VBO 的内容,还是始终使用创建 VAO 时绑定到索引 0 的任何 VBO?

我问这个问题是因为我发现很多例子都在调用之前glVertexAttribFormat and glVertexAttribBinding打电话给glBindVertexBuffer,如果 VAO 仅跟踪索引,则不需要这样做(因为绑定索引在glVertexAttribBinding).


您可能知道,这是 OpenGL 4.3 中引入的相当新的功能。按照我阅读规范的方式,属性和缓冲区之间的映射现在具有一定程度的间接性:

  1. 每个属性都有一个属性指定它使用哪个绑定索引。
  2. 缓冲区绑定到绑定索引。

您可以将其视为两个表,一个定义从属性索引到绑定索引的映射,另一个定义从绑定索引到缓冲区名称的映射。这两个表都是 VAO 状态的一部分。

我相信这些可以完全独立地以任何顺序指定。glVertexAttribBinding()在属性索引和绑定索引之间建立第一个关联。glBindVertexBuffer()建立绑定索引和缓冲区名称之间的关联。

规范中的状态表证实了这一理解。 GL 4.4 规范中的表 23.4 标题为“顶点数组对象状态”,列出了:

  • VERTEX_ATTRIB_BINDING,可以通过以下方式查询glGetVertexAttribiv(),是给定属性索引的绑定索引的值。
  • VERTEX_BINDING_BUFFER,可以通过以下方式查询glGetIntegeri_v(),是给定绑定索引的缓冲区名称的值。

在此基础上,解决您的具体问题:

创建后,VAO 是否仅跟踪 VBO 索引(通过glBindVertexBuffer),或者哪些 VBO 名称与这些索引绑定?

他们追踪两者。

我可以在绘制调用之前将不同的 VBO 绑定到索引 0 并让它使用该 VBO 的内容吗

是的,如果将不同的 VBO 绑定到绑定索引 0,则绑定索引 0 的所有属性都将使用该 VBO 的内容。

我发现很多例子都在调用之前glVertexAttribFormat and glVertexAttribBinding打电话给glBindVertexBuffer,如果 VAO 仅跟踪指数,则没有必要

VAO 跟踪所有这些调用设置的状态,因此使用所有这些调用作为设置 VAO 的一部分确实有意义。跟踪 VAO 中的整个顶点设置状态是使用 VAO 的主要目的。它允许您在初始化期间设置一次状态,然后您只需要一次调用glBindVertexArray()在您的绘制调用再次设置整个状态之前。

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

OpenGL 顶点数组对象存储顶点缓冲区名称和索引,还是仅存储索引? 的相关文章

  • OpenGL alpha 测试 - 如何替换已弃用的 AlphaFunc?

    我正在尝试用 Alpha 绘制球体 但我的 Z 缓冲区有问题 有些像素是透明的 但会写入 Zbuffer 因此后面的不透明像素会被隐藏 这是我的设置 gl Enable gl DEPTH TEST gl DepthFunc gl LEQUA
  • cmake 在 OS X 上找不到 gl.h

    我在 OS X 10 10 上并尝试使用 GLUT 和 OpenGL 构建一个 C 项目 我将其简化为展示我的问题的最小示例 我有以下内容CMakeLists txt cmake minimum required VERSION 2 8 F
  • 如何读取 Windows 特定扩展名

    在 OpenGL superible 中 示例说我可以通过以下方式读取 Windows 特定扩展 Type defined in the book as char but that is not what glGetString retur
  • 使用帧缓冲区将深度缓冲区渲染为纹理

    我正在使用 JOGL 但这个问题通常适用于 OpenGL 似乎也有类似的问题 但它们要么是针对 GLSL 代码 与复制帧缓冲区的内容有关 要么是一般建议 使用帧缓冲区对象而不是glCopyTexSubImage2D Question 我正在
  • OpenGL 超级采样抗锯齿?

    在办公室 我们正在使用旧的 GLX Motif 软件 该软件使用 OpenGL 的 AccumulationBuffer 来实现保存图像的抗锯齿功能 我们的问题是Apple从其所有驱动程序中删除了AccumulationBuffer 从OS
  • VBO - 没有指数化的指数化

    我正在尝试将 VBO 与元素数组缓冲区一起用于我的三角形 如下所示 glBindBuffer GL ARRAY BUFFER g Buffer 0 glVertexPointer 3 GL FLOAT 0 BUFFER OFFSET 0 g
  • 将glm四元数转换为旋转矩阵并与opengl一起使用

    所以我将对象的方向存储在 glm fquat 中 我想用它来旋转我的模型 我怎么做 我试过这个 glPushMatrix glTranslatef position x position y position z glMultMatrixf
  • Opengl 非同步/非阻塞地图

    我刚刚找到以下内容OpenGL 规范ARB map buffer range http www opengl org registry specs ARB map buffer range txt 我想知道是否可以使用此扩展进行非阻塞地图调
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • gluPerspective 与 gluOrtho2D

    我查看了 MSDN 上关于这两个函数的文档 但是 我不太明白这两个功能之间的区别 一个是用于设置 3D 相机视图 另一个是用于设置 2D 相机视图 如果能得到解答就太好了 预先感谢您的评论 正交投影基本上是没有透视的 3D 投影 本质上 这
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • OpenGL 与 Eclipse CDT + MinGW + GLEW + GLFW:未定义的参考

    Edit 与此同时 我已经弄清楚了这一点 并在下面写了详细的答案 我刚刚尝试在 Win7 上从 Express 版本的 MSVC 10 切换到 Eclipse CDT 在配置时遇到了以下简单 OpenGL 代码的问题 在 Visual St
  • glut 库中缺少 glutInitContextVersion()

    我正在练习一些 opengl 代码 但是当我想通过以下方式强制 opengl 上下文使用特定版本的 opengl 时glutInitContextVersion 它编译过程失败并给出以下消息 使用未声明的标识符 glutInitContex
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的

随机推荐

  • mod_rewrite 重定向不存在的 URL

    我有一个旧网站 我已经接管了 新用户基本上会获得为他们创建的自定义页面 这是以一种不太奇妙的方式完成的 目前 它实际上生成一个以创建的 slug URL 命名的文件 并将其符号链接到名为 main 的文件夹 显然我想改变这一点 我的计划只是
  • FsUnit“should equal”在“Some []”上失败

    当我使用 NUnit 2 6 3 运行 FsUnit 测试时 let f xs Some List map 2 xs
  • jQuery 通过一个操作在三个 SELECT 下拉列表中选择相同的选项

    我有 3 个 SELECT 下拉菜单 SELECT 1
  • 在 iOS 9 仅快捷栏模式下,与键盘顶部对齐的视图出现在错误的位置

    iOS 9 添加了一个快捷栏到 iOS 8QuickType 栏 作为此更改的一部分 如果您将蓝牙键盘连接到 iPad 键盘将处于最小化的仅限快捷栏模式 可以通过在模拟器中按 command k 来模拟 我有使用类似于以下方法获取键盘高度的
  • CollectionView 中用于评论和回复的多个单元格

    我有两种不同的单元格类型 一种用于评论 另一种用于回复 我正在尝试以相同的方式呈现它们collectionView然后也许可以像这样对它们进行分组 每个具有特定 id 的评论下面都有其回复 然而 无论什么尝试 我都失败了 你会怎样做呢 pr
  • 解析日期并将其存储在 SQLite 数据库中

    我正在使用 SAXParser 解析 xml 文件 并在处理程序内部创建对象 其中数据成员之一是日期 我的 XML 文件上的日期采用以下格式 2010 12 28 但我找不到如何将这样的字符串转换为 Date 对象 而且我也不明白如何将它存
  • 如何最好地表示数据库中属性数量可变的项目?

    假设您想创建小部件列表 小部件制造商都创建具有不同数量和类型属性的小部件 Widget 卖家对于想要在数据库中存储和显示的属性类型和数量都有不同的偏好 现在的问题是 每次添加新的小部件时 它可能具有当前任何其他小部件都不存在的属性 当前您通
  • 从java调用ant,ant终止后返回java

    到目前为止 我已经从java调用了ant脚本 现在的问题是 ant构建终止后是否可以恢复java执行 我该怎么做 org apache tools ant Main s main and startAnt 方法调用exit 方法依次调用Sy
  • 使用 angular.js 将自定义标头添加到 HTTP 请求

    我是 angular js 的新手 我正在尝试向请求添加一些标头 var config headers Authorization Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ Accept applicatio
  • VBA 中的 while 循环

    我的数据如下表所示 该数据集中的观察数量每个月都有所不同 列保持不变 我想在每一行中循环我的代码 直到该行为空 我认为 do while 循环是合适的 但到目前为止我还没有成功执行它 值得注意的是 我是一个完全的 VBA 新手 其他一些注意
  • 如何获取两个日期时间之间的小时和分钟差异

    如果我有两个这样的日期时间 transtime in transtime out 如何以以下格式获取这些日期时间之间的差异 hh mm I use DATEDIFF hour transtime in transtime out 但我只得到
  • 使用 InvokeScript 更改 C# 变量

    我需要检查 Windows Phone 应用程序中的 WebBrowser 控件是否有历史记录 我想出的方法是使用browser InvokeScript eval if history length gt 0 history go 1 我
  • 一次更新两个表

    我的 MySQL 版本使用的是 5 1 41 3ubuntu12 10 UPDATE profiledata SET aboutyou aboutyou quotes quotes WHERE uid sess uid and UPDATE
  • 如何使用OpenFeign获取pojo数组?

    我正在尝试使用 OpenFeign 客户端访问 API 获取一些 JSON 并将其转换为 POJO 数组 以前我只是简单地获取一串 JSON 并使用 Gson 将其转换为数组 如下所示 FeignInterface String get R
  • 如何在ASP.NET中实现实时更新

    我见过几个网站向您展示数据库中发生的情况的实时更新 一个例子可以是 实时显示股票价格的股票行情网站 显示诸如 其他用户当前正在搜索什么 之类的数据 我认为这将涉及某种轮询机制 每隔几秒钟查询数据库并将其呈现在网页上 但当我从性能的角度思考时
  • D3 生成的 LinearGradient 在 Firefox/IE 中不起作用

    我正在开发一个 D3 库 它将 D3 与 AngularJS 指令集成在一起 称为角D3 最近的指令之一允许生成可以绑定到数据并动态更新的梯度 这似乎适用于除 Firefox 之外的所有浏览器 但是 如果我将输出 SVG 复制 粘贴到 JS
  • 在 Dialogflow 中使用 NodeMailer

    我想发送一封电子邮件 要求在 Dialogflow 中制作的程序中进行操作 我想使用 NodeMailer 但是当我部署项目时 出现以下错误消息 您的云函数部署失败 函数加载错误 无法加载文件index js 中的代码 您是否列出了所有必需
  • Java SQL 时间戳到 ZonedDateTime

    我想将 ZonedDateTime 对象转换为 java sql Timestamp 对象 而不使用本地日期 例如 假设我有以下日期时间 System out println myZonedDateTime gt 2018 09 02T23
  • ASP.NET PostBack 选择树视图的复选框

    我有一个 asp net 项目并使用 C 工作 在我的项目中 我有一个带有复选框的数据绑定列表框 例如 当用户单击复选框时 它应该更新标签 文本框 问题是 它不会更新标签 文本框 直到我单击执行回发的按钮 我将如何调用复选框更改事件的回发
  • OpenGL 顶点数组对象存储顶点缓冲区名称和索引,还是仅存储索引?

    创建后 VAO 是否仅跟踪 VBO 索引 通过glBindVertexBuffer 或者哪些 VBO 名称与这些索引绑定 如果我使用指定绑定索引 例如 0glVertexAttribBinding在 VAO 创建期间 我可以在绘制调用之前将