OpenGL id值保证

时间:2014-09-05 04:03:53

标签: opengl resources

我遇到的事实是,有时我的OpenGL上下文被重新创建,我的初始化需要重做以重新初始化重新创建的OpenGL上下文。 现在我没有使用很多元素,但我提到我从glGenX收到的ID(或名称或者是什么)总是相同的,只要我按相同的顺序调用函数:我创建的第一个纹理获得ID 1 ,第二个ID 2等等。

这有保证吗?因为当它是,我的内部组织不需要重新完成那些OpenGL元素,因为即使OpenGL上下文是另一个,对纹理ID 4的引用总是指向正确的纹理,只要该纹理得到重新 - 加载到GPU第4行?

1 个答案:

答案 0 :(得分:4)

不,我从未见过保证每次生成对象名称都会产生相同的结果。 glGen*()调用的语言总是如下:

  

返回 n 以前未使用的[..]对象名称

它从未说明如何构建这些对象名称。

现在,实际上,如果您以完全相同的顺序调用所有内容,您似乎很可能会获得相同的名称。在这种情况下,软件往往是确定性的。但依靠它对我来说仍然是一个坏主意。这将是其中一件可能会工作时间最长的事情之一,然后在最不幸的时候(比如您计划发货的前一天或您已经发货之后)最不期望的时候回来咬你。

我不认为这完全在你的问题范围内,只是为了确保你没有做出任何错误的假设:你绝对不能指望这些名字是连续的。它们位于某些平台/供应商上,但不存在于其他平台上。对于不同的对象类型是否使用不同的名称,或者它们是否使用相同的值,也没有有效的期望。例如,如果您调用glGenTextures()来创建纹理名称,并使用glGenBuffers()来创建缓冲区名称,则可以为这两个名称获取相同的值。

另外,为了避免可能的误解:即使您假设您已经知道将要生成的名称,如果您使用OpenGL Core,仍需要调用glGen*()函数来生成名称轮廓。以前使用对象名称所需的任何值都是合法的,但在现代OpenGL中这不再合法。或者用规范的话来说,从删除的功能附录:

  

应用程序生成的对象名称 - 必须使用相应的Gen *命令生成所有对象类型的名称,例如缓冲区,查询和纹理对象。尝试绑定Gen *命令未返回的对象名称将导致INVALID_OPERATION错误。