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

标签 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 不会使用它。

实际上,我读到如果要删除 AGL opengl 上下文,则不一定需要删除纹理。因为删除 openGL 上下文会自动删除所有关联的纹理。这是真的?如果是,选项 1 更有意义。

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

最佳答案

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

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

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

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

关于c++ - 使用随机纹理 ID 可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8570781/

相关文章:

c++ - OpenCV:如何混合多个不同颜色的半透明多边形?

android - Qt 安卓 : How to show the native file dialog?

c++ - C++中的扫描线填充OpenGL/GLUT算法

R 中的 rasterImage() 创建带有白色边框的图像

javascript - 如何在 RaphaelJS 中使用矩阵

c++ - 在命名空间中定义模板类成员函数?

c++ - 如何在 Microsoft C++ 构建工具中抑制 D9025 警告

c++ - GLSL 纹理函数只为天空盒返回黑色

c++ - OpenGL 中的纹理贴图

java - 图形绘制策略(表演)