OpenGL 3:​​glBindVertexArray 使 GL_ELEMENT_ARRAY_BUFFER 无效

2024-03-13

我确信如果你通过绑定缓冲区glBindBuffer(),您可以放心地假设它保持绑定状态,直到目标通过另一个调用反弹glBindBuffer()。因此,当我发现调用时,我感到非常惊讶glBindVertexArray()将绑定到 GL_ELEMENT_ARRAY 目标的缓冲区设置为 0。

这是最小的 C++ 示例代码:

GLuint buff;
glGenBuffers(1, &buff);
std::cout << "Buffer is " << buff << "\n";
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buff);
GLuint vao;
glGenVertexArrays(1, &vao);

GLint bound_buff;
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff);
std::cout << "Bound before glBindVertexArray: " << bound_buff << "\n";

glBindVertexArray(vao);    
  // ^- an implicit glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); ?

glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff);
std::cout << "Bound after glBindVertexArray: " << bound_buff << "\n";

我在初始化 OpenGL 3.2 设备上下文后立即运行此代码并获得以下输出:

 Buffer is 1
 Bound before glBindVertexArray: 1
 Bound after glBindVertexArray: 0

另一方面,GL_ARRAY_BUFFER 是not因通话而改变。我检查了 OpenGL 3.2 规范 (2.10)glBindVertexArray并没有发现任何提及这种意想不到的副作用。

  1. 这种行为符合规范吗?
  2. 如果是这样,调用以下命令还会产生哪些其他副作用glBindVertexArray?
  3. 这背后的理由是什么?

我在带有 296.10 WHQL 驱动程序的 Win XPx64 机器上的 nvidia 卡上进行了测试。 使用 nvidia GT330M 在 OS X Lion 上进行的快速测试得出了相同的结果。


顶点数组对象 http://www.opengl.org/wiki/Vertex_Array_Object封装渲染顶点数据所需的所有状态*。因此,它们必须封装与属性关联的缓冲区(通过glVertexAttribPointer), GL_ELEMENT_ARRAY_BUFFER (需要glDrawElement*调用)等。

然而,我仍然感到有点困惑,因为我在文档中找不到任何关于这种副作用的提及。

规范清楚地解释了这一点,尽管需要了解规范的工作原理才能了解其工作原理。

OpenGL 是状态的集合,这意味着所有 OpenGL 函数(除了那些实际渲染某些内容的函数)都会修改 OpenGL 状态。你打电话时glVertexAttribPointer,这个函数从概念上修改了一些内部 OpenGL 状态。

OpenGL对象 http://www.opengl.org/wiki/OpenGL_Object由它们封装的 OpenGL 状态片段定义。因此,如果函数修改对象封装的状态,那么该函数也会修改对象本身。绑定对象意味着用该对象的当前状态替换它们封装的当前状态。

The ARB_顶点_数组_对象 http://www.opengl.org/registry/specs/ARB/vertex_array_object.txt规范根据 VAO 封装的状态来定义它们。它基本上指向一个 OpenGL 状态表并说:“VAO 就是所有这些。”此功能的核心 3.x 版本实际上修改了状态表以使其更加清晰(相同的行为,其解释略有不同):

OpenGL 3.3 规范,第 2.10 节:

生成的顶点数组对象是一个新的状态向量,包含表 6.4 和 6.5 中列出的所有状态值。

我不打算重印表 6.4 和 6.5;你可以自己查一下。但它们显然包括GL_ELEMENT_ARRAY_BUFFER_BINDING以及各种GL_VERTEX_ATTRIB_ARRAY_BUFFER_BIDNING(它们是缓冲区对象)。

* 注意:VAO 不包含由glVertexAttrib http://www.opengl.org/wiki/GLAPI/glVertexAttrib功能。如果未启用属性数组,这些可能会影响渲染。

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

OpenGL 3:​​glBindVertexArray 使 GL_ELEMENT_ARRAY_BUFFER 无效 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • 确定新日期是否是默认的 new DateTime()

    这是我的问题 DateTime previousDate new DateTime DateTime currentDate new DateTime foreach ApproverVo approver in approvers if
  • 出错时再次循环

    我试图阅读所有内容 但我有点陷入了一个问题 通过使用 bigrquery 我创建了对 Google BigQuery 的查询来获取数据 不幸的是 有时我的查询由于超时而无法工作 Q 是一个 SQL 查询 BQ 应该存储从 BigQuery
  • 如何从 iOS 应用程序上的自定义键盘检索击键?

    我需要为我的 iPhone 应用程序构建一个自定义键盘 之前的问题和答案 https stackoverflow com questions 4643167 iphone objc how to create a custom keyboa
  • mvn:找不到命令

    我正在尝试使用 jenkinsfile 在我无权管理路径的特定对象上运行管道 但我遇到了这个错误 有人知道如何解决这个问题吗 您需要在执行作业的构建代理上安装 Maven Jenkins 的另一种选择是它可以为您安装 Maven 这可以在全
  • C# 中未知长度的数组

    我刚刚开始学习 C 在数组简介中 他们展示了如何将变量建立为数组 但似乎必须在赋值时指定数组的长度 那么如果我不知道数组的长度怎么办 大批 数组必须指定长度 要允许任意数量的元素 请使用List http msdn microsoft co
  • 如何使用 gspread 缓存 Google Sheets 的授权?

    我正在尝试创建一个简单的函数 将一些数据发布到 Google Sheets 电子表格中 我在 AWS Lambda 中托管此函数 无论如何 代码看起来有点像这样 import gspread from oauth2client servic
  • 添加到数据库后保持在同一页面而不刷新

    我有 PHP 网页 需要在其中插入一些信息到我的数据库中 插入完成后 它会刷新同一页面 但我被告知这个过程不切实际 因为你正在加载所有HTML CSS and JS每次都会显示您的页面 我应该你AJAX要做到这一点 我搜索它 并尝试了这段代
  • find_in_set 与 laravel 中的 join

    如何使用 Laravel 查询获取所需的输出 尝试过这种方式没有成功请指导提前非常感谢 如果可能的话 我们有什么方法可以在模型中设置它 请指导 User id name b id 1 Alax 1 3 2 Rex 2 4 3 Lex 2 3
  • jQuery droppable out 事件无法触发?

    LWdrop droppable accept LW drop function event ui ui draggable addClass LWactive this droppable option accept this css b
  • 如何避免重复出现消息“更新被拒绝,因为远程包含您所做的工作...”?

    我正在与另外三个合作者一起参与一个项目 我的情况是 每次我尝试添加新提交并且远程中存在一些更改 即使它是我未在本地工作过的文件 时 我都会收到以下消息 迫使我使用以下默认消息创建合并 error failed to push some re
  • 从表单生成表格

    我有一个表单组 public transactionOrRefundRequestForm FormGroup new FormGroup SaleRequest new FormGroup Header new FormGroup Typ
  • Perl 中有 zip 和 Fold 等函数吗?

    我想使用一些功能 例如 zip http zvon org other haskell Outputprelude zip f html fold http www haskell org haskellwiki Fold and map
  • Java:使用 double 不准确[重复]

    这个问题在这里已经有答案了 可能的重复 在java中使用双精度数保持精度 https stackoverflow com questions 322749 retain precision with doubles in java Java
  • 混淆 ASP.Net dll 破坏 Web 应用程序

    我通常不会费心去混淆 Web 应用程序 DLL 但现在我必须与可能有利益冲突的人共享一些服务器空间 并且可能会试图窃取交易并反编译它 我知道这不是一个理想的解决方案 但是嘿 因此 我使用 VS 2005 一个 Web 部署项目 编译为单个
  • Getpass输入Python 3

    我正在尝试创建密码输入 我知道getpass getpass但是当我将其置于闲置状态时 它会出现错误 提示 密码可能会被回显 My code import getpass p getpass getpass print You entere
  • gremlin 语法计算 Jaccard 相似度度量

    我有兴趣计算图中未直接连接的所有顶点对的杰卡德相似度度量 Jaccard度量定义为两个顶点的邻居交集的范数除以相同集合的并集的范数 where 到目前为止 我已经能够获得所有未直接连接的节点对 仅对这种情况下的链接预测感兴趣 如果直接链接已
  • 其可能的 Google 表单脚本每天上午 00:01 至中午 12:00 自动打开和关闭

    我想每天 00 01 打开 google 表单并在 12 00 关闭 这是我的代码 function createDailyTrigger ScriptApp newTrigger openCloseFormTrigger timeBase
  • 由于 Integer.parseInt 导致崩溃

    我正在尝试从另一个文本文件中生成的文本导入文本Activity 生成的文本文件由String ArrayList其中仅包含数字和 Android 生成的其他随机文本 当我从文件导入文本时 我使用的是BufferedReader and re
  • 如何在Python中检查神经网络的层数以及何时应该增加层数?

    请对您的想法添加最少的评论 以便我可以改进我的查询 谢谢 我正在研究MNIST数据集并写一些CNN代码 然而 我对其中的一些观点感到困惑CNN代码 如何知道神经网络的层数 根据我目前的理解 我认为它有 6 层和 4 个隐藏层 是对的吗 如果
  • OpenGL 3:​​glBindVertexArray 使 GL_ELEMENT_ARRAY_BUFFER 无效

    我确信如果你通过绑定缓冲区glBindBuffer 您可以放心地假设它保持绑定状态 直到目标通过另一个调用反弹glBindBuffer 因此 当我发现调用时 我感到非常惊讶glBindVertexArray 将绑定到 GL ELEMENT