C++ 使用随机纹理ID可以吗?

C++ 使用随机纹理ID可以吗?,c++,opengl,graphics,C++,Opengl,Graphics,不要使用glGenTextures()获取未使用的纹理ID。我可以随机选择一个数字,比如99999并使用它吗 当然,我会问: glIsTexture( m_texture ) 在继续之前确保它是假的 以下是一些背景: 我正在为mac开发一个图像幻灯片应用程序。预览幻灯片是完美的。要保存幻灯片,我将渲染到FBO。我创建一个AGL上下文,用glGenTextures()实例化一个纹理,并渲染到一个帧缓冲区。除了一个小问题,一切都好 保存幻灯片并返回主窗口后,所有图像缩略图均为灰色,即纹理已清除 我

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

当然,我会问:

glIsTexture( m_texture )
在继续之前确保它是假的

以下是一些背景:

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

保存幻灯片并返回主窗口后,所有图像缩略图均为灰色,即纹理已清除

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

因此,我现在的选择是:

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


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

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

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

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


    我建议不要经常创建和删除FBO纹理。只需在应用程序启动时创建它。最糟糕的情况是,如果您需要不同的大小或其他东西,您必须根据需要重新分配对象的存储(通过
    glTexImage2D
    );直到
    glGenTextures
    返回0。起初我不知道发生了什么,因为0似乎仍然是一个有效的纹理ID。

    谢谢你的回答。手动指定纹理ID是不可能的,因为我们需要支持OpenGL 1.4到3.2。我现在的最佳选择是根本不删除纹理。顺便说一句,我不能投票赞成你的答案,因为我没有足够的分数。@Nicol:你的第二段似乎很不完整。