c++ - 是否可以在 OpenGL 的同一个调用中渲染两个具有不同索引起点的不同缓冲区?
问题描述
我有这两个对象,定义如下:对象 1:
vertices = {...}
indices = {1, 2, 3, 4, 5, ...}
对象 2:
vertices = {...}
indices = {1, 2, ...}
其中 vertices 是被推送到 的浮点向量,GL_ARRAY_BUFFER
indices 是被推送到 的无符号向量GL_ELEMENT_ARRAY_BUFFER
。
这些对象没有需要对其应用的转换,并且是相对静态的,但可以由用户修改。
我不想创建包含两个对象的所有顶点的单个对象,因为我希望对这些对象的修改尽可能快,因此对象越小,重建网格的速度就越快。我知道两个小对象上的两个绘图调用比单个对象上的一个绘图调用慢,即使对象有点大,所以我想将它们批处理在一起。
我的问题是我可以用 推入或删除缓冲区中的顶点glBufferSubData
,但是对于索引,我需要遍历第二个对象的每个值并偏移它以考虑第一个对象的索引,所以它最终会可能会变慢。
这些对象可以有非常不同的大小,所以我认为固定偏移也不是一个可行的解决方案。
是否可以告诉 OpenGL 第一个对象的索引引用第一个对象的顶点,而第二个对象的索引引用第二个对象的顶点?在这种情况下,我将能够只修改缓冲区对象的一部分,而无需每次都偏移每个对象的索引。
解决方案
各种渲染命令的baseVertex
参数基本上是为了做你所要求的。该参数是一个整数,在从顶点缓冲区中获取任何顶点属性之前,它会被添加到渲染命令中的每个索引。BaseVertex
baseVertex
假设这是您的索引缓冲区:
0 1 2 1 3 2 0 1 2 1 3 2
| Mesh 0 | Mesh 1 |
如果网格 0 有 4 个顶点,则将 4 作为baseVertex
toglDrawElementsBaseVertex
或类似命令传递。这有效地使网格 1 中的索引4 5 6 5 7 6
。
推荐阅读
- amazon-web-services - 如何使用 AWS Route 53 中的域名在 ec2(Ubuntu 18.04)中配置 nginx
- javascript - 如何正确使用 ES6 进行咖喱?
- katalon-studio - 如何在 Katalon Studio 中开发代码以生成 HTML 报告?
- node.js - Mocha 在测试预期错误条件中抛出 Promise 拒绝错误。如何解决这个问题?
- tensorflow - 将 tensorflow 模型冻结为 .pb 文件
- java - 如何编写 ANTLR 语法翻译器以返回带有方法的 java 类?
- django - OperationalError:在 Django 中使用 ForeignKey 时“没有这样的列”
- android - 绑定参数类型只接受上下文对象而不是活动对象
- python - 从查询集中提取数据
- mysql - MySQL以最大到最小顺序获得连续存在