2010-11-06 11 views
5

Sto scrivendo un programma OpenGL che disegna in un buffer ausiliario, allora il contenuto del buffer ausiliario viene accumulata l'accumulo tampone prima di essere GL_RETURN-ed al buffer Back (essenzialmente per essere mescolati allo schermo). In breve, sto facendo una specie di motion blur. Comunque la cosa strana è che, quando ricompilando e rieseguo il mio programma, vedevo il contenuto del buffer ausiliario/accumulo dal programma precedente. Ciò non ha senso. Sto fraintendendo qualcosa, lo stato di OpenGL non dovrebbe essere completamente resettato al riavvio del programma?In che modo lo stato dei buffer OpenGL può persistere tra le esecuzioni del programma?

Sto scrivendo un programma SDL/OpenGL in Gentoo Linux Driver nVidia 195.36.31 su GeForce Go 6150.

risposta

10

No - non c'è ragione per la vostra GPU per sempre chiara la sua memoria. È tua responsabilità eliminare (o inizializzare) le tue trame prima di usarle.

+0

Grazie, almeno ora so che non è un comportamento imprevisto, anche se è solo raccapricciante ... –

+1

Sono d'accordo. Vuoi aggiungere: in alcune condizioni i driver video sono invitati a azzerare la memoria allocata, a causa di considerazioni di "sicurezza" (il programma malvagio potrebbe voler sapere cosa stavano disegnando gli altri). Questo è ridicolo (direi che dovrebbe essere la responsabilità di quel programma che vuole nascondere la sua produzione intermedia), ma è così che vanno le cose. – valdo

+1

Ho fatto un sacco di Direct3D attraverso l'era di DirectX9. Quando ho iniziato, i framebuffer, le superfici ecc sarebbero invariabilmente prive di inizializzazione e il codice potrebbe facilmente esporre il contenuto di una corsa precedente. A un certo punto, Microsoft o i provider di driver devono aver deciso di "sistemarlo" e si otterrebbero invece i buffer bloccati. Credo che sia stato fatto in nome della sicurezza. Direi che i problemi di sicurezza sono validi; non tollereremmo un sistema che trasmettesse i processi utente RAM contenenti i detriti non illuminati di altri utenti e la RAM del framebuffer non dovrebbe essere considerata in modo diverso. – timday

5

In realtà, lo stato di OpenGL viene inizializzato su valori ben definiti.

Tuttavia, lo stato GL consiste di impostazioni come tutti gli interruttori binari (glEnable), la fusione, la modalità test di profondità ecc. Ecc. Ognuna di queste ha le sue impostazioni predefinite, che sono descritte in OpenGL specs e si può essere sicuri che saranno applicati alla creazione del contesto.

Il punto è, il framebuffer (o dati di trama o buffer di vertice o altro) NON è una parte di ciò che viene chiamato "stato GL". Lo stato GL "esiste" nel tuo driver. Ciò che è memorizzato nella memoria della GPU è completamente diverso e non è inizializzato finché non chiedi al driver (tramite GL calls) di inizializzarlo. Quindi è completamente possibile avere i resti della precedente esecuzione nella memoria delle texture o anche nel frame buffer stesso se non lo si cancella o lo si inizializza all'avvio.