可以使用随机纹理ID吗?

时间:2011-12-20 04:21:58

标签: c++ opengl graphics

而不是使用glGenTextures()来获取未使用的纹理ID。我可以随机选择一个数字,例如99999并使用它吗?

我当然会查询:

glIsTexture( m_texture )

并确保它在继续之前是假的。

以下是一些背景知识:

我正在为mac开发一个图片幻灯片应用程序。预览幻灯片是完美无缺的。为了保存幻灯片,我正在渲染一个FBO。我创建了一个AGL上下文,用glGenTextures()实例化一个纹理并渲染到帧缓冲区。一切都很好,除了一个小问题。

在我保存幻灯片并返回主窗口后,我的所有图像缩略图都是灰色的,即纹理已被清除。

我调查了它,发现图像缩略图和我的FBO纹理在某种程度上具有相同的纹理ID。当我在幻灯片保存操作结束时删除我的FBO纹理时,缩略图纹理也会丢失。这很奇怪,因为我在保存期间有一个AGL上下文,主UI有另一个AGL上下文,可能是在后台由Core Image创建的,我无法控制。

所以我现在看到的选择是:

  1. 不删除FBO纹理。
  2. 随意选择高纹理ID,希望主UI不会使用它。
  3. 实际上,我读到如果要删除AGL opengl上下文,则不一定需要删除纹理。因为删除openGL上下文会自动删除所有关联的纹理。这是真的?如果是,则选项1更有意义。

    我确实意识到这里发生了一些有趣的事情我无法解释。例如,在我将图像幻灯片保存到.mov文件后,我删除了在同一个类中创建的上下文。通过右键,它不应该影响在另一个上下文中创建的纹理。但确实如此,我真的无法解释这一点。

2 个答案:

答案 0 :(得分:11)

请允许我首先回答您的基本问题:是的,OpenGL 2.1中的 legal 只是随意选择一个纹理名称并将其用作纹理。请注意,3.2核心中合法。 OpenGL ARB删除此功能的事实应该有助于说明这是否是一个好主意。

现在,你似乎遇到了一个奇怪的错误。 glGenTextures永远不应返回已在使用的纹理名称。毕竟这就是它的意义所在。你似乎以某种方式得到已经在使用的纹理。我不知道会发生什么。

OpenGL上下文在销毁时将删除特定于该上下文的所有资源 。如果您创建了与第一个共享资源的第二个上下文,则删除第二个上下文将删除共享资源(纹理,缓冲区等)。它将删除未共享资源(VAO等),但其他所有资源都将保留。

我建议不要不断创建和删除FBO纹理。只需在应用程序启动时创建它。最糟糕的情况是,如果您需要不同的尺寸或其他东西,您必须根据需要(通过glTexImage2D)重新分配对象的存储空间。

答案 1 :(得分:0)

对于遇到此问题的任何人,请确保您的上下文已完全初始化;直到它glGenTextures将始终返回0.我没有意识到最初发生了什么,因为看起来0仍然是一个有效的纹理ID。

相关问题