我面临的事实是,有时我的 OpenGL 上下文会被重新创建,而我的初始化需要重做以重新初始化重新创建的 OpenGL 上下文。现在我没有使用很多元素,但我提到我从 glGenX 收到的 ID(或名称或什么)总是相同的,只要我以相同的顺序调用函数:我创建的第一个纹理获得 ID 1 ,第二个 ID 2 等等。
这是有保证的吗?因为在这种情况下,我不需要重新组织这些 OpenGL 元素的内部组织,因为即使 OpenGL 上下文是另一个上下文,只要该纹理重新获得,对纹理 ID 4 的引用将始终指向正确的纹理-加载到 GPU 中的第 4 行?
不,我从未见过保证每次生成对象名称都会产生相同的结果。glGen*()通话的语言听起来总是这样:
返回n 个先前未使用的 [..] 对象名称
它从不详细说明这些对象名称是如何构造的。
现在,实际上,如果您以完全相同的顺序调用所有内容,则很可能会得到相同的名称。在这种情况下,软件往往是确定性的。但是依赖它对我来说仍然是一个坏主意。这将是这些事情之一,可能会持续最长时间,然后在最不幸的时间(例如您计划发货的前一天或已经发货后)在您最不希望它的时候回来咬您。
我不认为这完全在您的问题范围内,只是为了确保您没有做出任何错误的假设:您绝对不能期望名称是连续的。它们在某些平台/供应商上,但不在其他平台/供应商上。对于不同的对象类型是否使用不同的名称,或者它们是否使用相同的值,也没有有效的期望。例如,如果您调用glGenTextures()以创建纹理名称并glGenBuffers()创建缓冲区名称,则可以为这两个名称获得相同的值。
此外,为了避免可能的误解:即使您假设您已经知道将glGen*()要生成的名称,如果您使用 OpenGL 核心配置文件,您仍然需要调用函数来生成名称。过去只使用您想要的任何值作为对象名称是合法的,但这在现代 OpenGL 中不再合法。或者用规范的话,从删除的功能附录中:
应用程序生成的对象名称 - 所有对象类型的名称,例如缓冲区、查询和纹理对象,必须使用相应的 Gen* 命令生成。尝试绑定 Gen* 命令未返回的对象名称将导致 INVALID_OPERATION 错误。
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |