shadertoy - opengl triangle
La forma correcta de eliminar el sombreador GLSL? (4)
Mi código se acerca a la administración del sombreador GLSL de la misma manera, crea cada sombreador y el programa asociado y elimina cada sombreador y programa. Recientemente leí http://www.opengl.org/wiki/GLSL_Object y allí se afirma que:
El objeto de sombreado, debido a su conexión al objeto de programa, continuará existiendo incluso si elimina el objeto de sombreado. Solo será eliminado por el sistema cuando ya no esté adjunto a ningún objeto del programa (y cuando el usuario haya pedido eliminarlo, por supuesto).
¿Lo entiendo correctamente, si llamo glDeleteShader()
al objeto shader luego de vincularlo al programa, solo necesito seguir el programa? ¿Es seguro asumir que esto es siempre cierto?
En general, la forma en que funciona la gestión de objetos de sombreado es simple. Los objetos de Shader realmente no hacen nada, por lo que no tiene sentido seguirlos en absoluto. Los objetos Shader deberían existir por el tiempo suficiente para vincular con éxito un objeto de programa. Después de ese tiempo, los sombreadores deberían separarse del programa y eliminarse.
Lo anterior asume que no estás tratando de usar el objeto shader para vincularlo con un programa diferente, por supuesto. Eso es ciertamente posible. En ese caso, debe eliminar sus objetos de sombreado después de haber vinculado todos sus programas.
En resumen: después de glLinkProgram()
llame a glDeleteShader()
para cada sombreador, esto los marca para eliminación y cuando el programa ya no es necesario, llame glDeleteProgram()
- esta llamada no solo borra el programa sino que también desconecta todos los sombreadores conectados y borra ellos (si no los usa ningún otro programa).
Por lo tanto, normalmente no tienes que llamar alguna vez a glDetachShader()
. Lea los documentos para glDeleteProgram()
.
Sí, de hecho, es muy conveniente separar y eliminar los objetos de sombreado lo antes posible. De esta forma, el controlador puede liberar toda la memoria que está utilizando para guardar una copia de la fuente de sombreado y el código de objeto no vinculado, que puede ser bastante importante. Las medidas que he hecho indican que NO borrar los objetos de sombreado aumenta el uso de la memoria incremental por sombreador en 5-10x
Sí. Puede eliminar el sombreador de forma segura a continuación. De hecho, esta es la forma preferida, porque tiene menos mantenimiento. No necesita realizar un seguimiento de qué eliminar y no puede olvidarse de hacerlo. Y, todavía funcionará.
"Eliminar" el sombreador, como ocurre con todos los objetos OpenGL, simplemente establece un indicador que indica que ya no lo necesita. OpenGL lo mantendrá durante todo el tiempo que lo necesite y realizará la eliminación real en cualquier momento posterior (lo más probable, aunque no necesariamente, una vez que se haya eliminado el programa).