如何解决在不更改VAO状态的情况下上载索引缓冲区
为了将索引缓冲区上传到GPU,我必须调用GL_ELEMENT_ARRAY_BUFFER的glBindBuffer,然后在其上调用glBufferData等。
但是,对于我的引擎设计而言,其中所有内容都浓缩为尽可能少的功能,这不方便,因为将GL_ELEMENT_ARRAY_BUFFER与glBindBuffer一起使用会更改VAO状态,我想在不更改VAO状态的情况下处理缓冲区。
有人可以告诉我是否可以在不触及VAO状态的情况下分配和上传索引缓冲区吗?还是我必须手动恢复GL_ELEMENT_ARRAY_BUFFER状态?
解决方法
以下内容假设您无法使用direct state access功能。如果是这样,则应该使用它,这样就不必只为了修改对象而绑定对象。
在OpenGL API中没有“索引缓冲区”之类的东西。仅有缓冲对象,可以在任何时候用于任何数量的用途(其中一个用于渲染命令中的顶点索引)。没有缓冲区会被束缚于专门用于索引数据的概念。
因此,缓冲区绑定点仅在您使用与这些绑定点关联的功能的程度上有意义。 GL_ARRAY_BUFFER
仅在glVertexAttribPointer
调用查看绑定到该绑定点的缓冲区时才有意义。但是,如果您实际上并没有进行glVertexAttribPointer
调用,那么GL_ARRAY_BUFFER
只是一个绑定点,与其他地方没有什么不同。
对于常规缓冲区对象管理,因此可以将任何缓冲区绑定到 any 绑定点。 GL_UNIFORM_BUFFER
,GL_COPY_READ_BUFFER
,等等。如果您不是出于特殊目的使用绑定,则没有别的绑定(GL_ELEMENT_ARRAY_BINDING
是VAO状态的一部分除外)。
因此,只需将“索引缓冲区”绑定到某个无害的绑定点(indexed ones like GL_UNIFORM_BUFFER
尤其无害,因为它们仅在您使用glBindBufferRange
时才具有特殊功能)并从那里进行上传。 / p>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。