2011-12-20 19 views
6

En lugar de usar glGenTextures() para obtener una ID de textura sin usar. ¿Puedo elegir aleatoriamente un número, digamos, 99999 y usarlo?¿Está bien usar una ID de textura aleatoria?

lo haré, por supuesto, consulta:

glIsTexture(m_texture) 

y asegurarse de que es falsa antes de continuar.

He aquí algunos antecedentes:

Estoy desarrollando una aplicación presentación de diapositivas de imágenes para el mac. La vista previa de la presentación de diapositivas es perfecta. Para guardar la presentación de diapositivas, estoy renderizando a un FBO. Creo un contexto AGL, instancia una textura con glGenTextures() y la renderizo en un buffer de cuadros. Todo está bien, excepto por un problema menor.

Después de guardar la presentación de diapositivas y volver a la ventana principal, todas las miniaturas de mis imágenes son grises, es decir, las texturas se han borrado.

Lo he investigado y descubrí que las miniaturas de la imagen y mi textura FBO de alguna manera tienen el mismo ID de textura. Cuando elimino mi textura FBO al final de la operación de guardado de diapositivas, las texturas de las miniaturas también se pierden. Esto es extraño porque tengo un contexto AGL durante el guardado, y la interfaz de usuario principal tiene otro contexto AGL, presumiblemente creado en segundo plano por Core Image y sobre el cual no tengo control.

Así que mis opciones, como lo veo ahora, es:

  1. no elimina la textura FBO.
  2. Elija al azar una ID de alta textura con la esperanza de que la interfaz de usuario principal no la vaya a usar.

En realidad he leído que no necesariamente tienen que eliminar su textura si se está eliminando el contexto OpenGL AGL. Debido a que eliminar su contexto de OpenGL elimina automáticamente todas las texturas asociadas. ¿Es esto cierto? Si es así, la opción 1 tiene más sentido.

Me doy cuenta de que aquí ocurren cosas divertidas que realmente no puedo explicar. Por ejemplo, después de guardar mi presentación de diapositivas de imágenes en un archivo .mov, elimino el contexto, que se creó en la misma clase. Por derecho, no debería afectar las texturas creadas en otro contexto. Pero lo hace, y realmente no puedo explicar eso.

Respuesta

11

Primero déjame responder tu pregunta básica: sí, es legal en OpenGL 2.1 para simplemente elegir un nombre de textura arbitrariamente y usarlo como una textura. Tenga en cuenta que es no legal en 3.2 núcleos. El hecho de que OpenGL ARB elimine esta capacidad debería ayudar a ilustrar si es una buena idea o no.

Ahora, parece que se encontró con un extraño error. glGenTextures nunca debe devolver un nombre de textura que ya esté en uso. Después de todo eso es para lo que es. Parece que de alguna manera obtendrás texturas que ya están en uso. No sé cómo sucede eso.

Un contexto OpenGL, cuando se destruye, eliminará todos los recursos específicos de ese contexto. Si ha creado un segundo contexto que comparte recursos con el primero, al eliminar el segundo contexto se eliminarán los recursos compartidos (texturas, búferes, etc.). Eliminará los recursos no compartidos (VAO, etc.), pero todo lo demás permanecerá.

Sugeriría no crear y eliminar la textura FBO constantemente. Simplemente créelo en el inicio de la aplicación. En el peor de los casos, tendrá que reasignar el almacenamiento para el objeto según sea necesario (a través de glTexImage2D), si necesita un tamaño diferente o algo así.

+0

Gracias por su respuesta. La asignación manual de una ID de textura está fuera de cuestión, ya que debemos admitir OpenGL 1.4 hasta 3.2. Mi mejor apuesta ahora es no eliminar la textura en absoluto. Por cierto, no puedo votar por tu respuesta porque no tengo suficientes puntos. –

+0

@Nicol: Su segundo párrafo parece bastante * incompleto *. – genpfault

+0

@genpfault: reparado. ¡Gracias! –

0

Para cualquiera que tenga este problema, asegúrese de que su contexto esté completamente inicializado; hasta que sea glGenTextures siempre devolverá 0. No me di cuenta de lo que estaba sucediendo al principio porque parece que 0 sigue siendo una ID de textura válida.

Cuestiones relacionadas