opengl - 在 OpenGL 中使用 GL_ARRAY_BUFFER 创建索引缓冲区和使用 GL_ELEMENT_ARRAY_BUFFER 创建索引缓冲区之间有什么区别吗?
问题描述
我一直在研究 OpenGL,现在,在一个项目上工作时,我发现,当我创建一个索引缓冲区时,如果我将它绑定到 aGL_ARRAY_BUFFER
而不是 aGL_ELEMENT_ARRAY_BUFFER
具有(显然)相同的结果。
我的意思是,顶点缓冲区总是绑定到GL_ARRAY_BUFFER
,但是如果我创建一个像这样的索引缓冲区:
glCreateBuffers(1, &m_BufferID);
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID);
glBufferData(GL_ARRAY_BUFFER, count * sizeof(uint), vertices, GL_STATIC_DRAW);
然后,例如,在绘制几何图形时,我将它绑定到 a GL_ELEMENT_ARRAY_BUFFER
,工作得很好,我不知道为什么我认为索引缓冲区也必须创建GL_ELEMENT_ARRAY_BUFFER
,但是......实际上是否有任何“内部”差异?
解决方案
就缓冲区对象本身的性质而言?不可以。所有缓冲区对象都是相同的,可以用于任何适合缓冲区对象的任务。缓冲区对象不具有最初用于绑定的特殊属性。
但是,GL_ELEMENT_ARRAY_BUFFER
绑定点本身就有点不寻常。它不是全局上下文状态的一部分;它是 VAO 状态的一部分。因此,如果您没有绑定 VAO(在核心配置文件上下文中),那么您无法将任何内容绑定到该绑定点。当你绑定到那个绑定点时,你正在影响当前绑定的 VAO 的状态。如果您更改当前绑定的 VAO,您将更改绑定到元素数组绑定点的缓冲区。
因此,一般来说,如果您打算将缓冲区附加到当前绑定的 VAO,则应该只绑定到该点。
推荐阅读
- laravel - Laravel:检查数据库中是否存在记录
- python - 在烧瓶中执行后台操作时如何显示加载消息?
- node.js - NPM 和 Yarn 无法安装任何东西
- elasticsearch - Elasticsearch 查询以查找丢失的记录
- sql - 可能值分布不均匀的低基数指数
- python - Python - 使用递归找出字符串的内容
- sqlite - QAbstractItemModel::removeRow 不删除相关表中的记录
- c# - 如何在 ASP.NET Core 3.1 中获取当前的 JsonSerializerOptions?
- .htaccess - 用 {QUERY_STRING} 和参数重写问题
- gcc - rpath 和 sys/types.h 有什么关系?