2010-11-06 12 views
5

Estoy escribiendo un programa OpenGL que se dibuja en un Buffer Auxiliar, luego el contenido del Buffer Auxiliar se acumula en el Buffer de Acumulación antes de ser GL_RETURN-ed al Buffer Back (esencialmente para ser compuesto en la pantalla). En resumen, estoy haciendo una especie de desenfoque de movimiento. Sin embargo, lo extraño es que cuando recompilaba y volví a ejecutar mi programa, estaba viendo el contenido del Buffer Auxiliar/de Acumulación del programa anterior. Esto no tiene sentido. ¿Estoy malinterpretando algo, el estado de OpenGL no debería reiniciarse por completo cuando se reinicia el programa?¿Cómo podría permanecer el estado de los búfers OpenGL entre ejecuciones del programa?

Estoy escribiendo un programa SDL/OpenGL en Gentoo Linux Drivers nVidia GeForce Go 195.36.31 en 6150.

Respuesta

10

No - no hay razón para su GPU para siempre clara su memoria. Es su responsabilidad borrar (o inicializar) sus texturas antes de usarlas.

+0

Gracias, al menos ahora sé que no es un comportamiento inesperado, aunque es simplemente escalofriante ... –

+1

Estoy de acuerdo. Desea agregar: bajo ciertas condiciones, se les solicita a los controladores de video que inicien en cero la memoria asignada, debido a consideraciones de "seguridad" (el programa malvado puede querer saber lo que otros dibujaron). Esto es ridículo (yo diría que esa debería ser la responsabilidad de ese programa que quiere ocultar su producción intermedia), pero así son las cosas. – valdo

+1

Hice un montón de Direct3D a través de la era de DirectX9. Cuando comencé, framebuffers, superficies, etc. invariablemente no se inicializarían y el código podría exponer fácilmente el contenido de una ejecución anterior. En algún momento, Microsoft o los proveedores de controladores deben haber decidido "arreglar" esto y en su lugar, obtendrían búferes en blanco. Creo que fue hecho en nombre de la seguridad. Yo diría que las preocupaciones de seguridad son válidas; no toleraremos un sistema que entregue a los procesos de usuario la RAM que contiene desechos de otros usuarios no eliminados y la RAM del framebuffer no se debe considerar de manera diferente. – timday

5

En realidad, OpenGL estado se inicializa con valores bien definidos.

Sin embargo, el estado GL consiste en configuraciones como todos los interruptores binarios (glEnable), mezcla, modo de prueba de profundidad ... etc., etc. Cada uno de ellos tiene su configuración predeterminada, que se describe en OpenGL specs y puede estar seguro que se impondrán sobre la creación del contexto.

El punto es que el framebuffer (o datos de textura o búferes de vértices o algo así) NO es una parte de lo que se llama "estado GL". El estado GL "existe" en su controlador. Lo que está almacenado en la memoria de la GPU es algo completamente diferente y no está inicializado hasta que le pida al controlador (a través de llamadas GL) que lo inicialice. Por lo tanto, es completamente posible tener los restos de la ejecución anterior en la memoria de textura o incluso en el mismo buffer de cuadros si no los borra o los inicializa al inicio.

Cuestiones relacionadas