Pagina 1 di 2

OpenGl: scheda grafica, buffers (Terminato) e glNormal

MessaggioInviato: 27/11/2012, 11:26
da hee136
Buongiorno, sto giocando un pò con opengl e vorrei capire un pò meglio quello che sto facendo.
Le funzioni che disegnano vertici e poligoni, che impostano un tipo di prospettiva, ecc... sono esguite dalla cpu o dalla gpu della scheda grafica?
Grazie

Re: OpenGl e scheda grafica

MessaggioInviato: 27/11/2012, 14:34
da apatriarca
Normalmente dalla GPU, ma dipende. Esistono infatti implementazioni delle OpenGL che utilizzano la CPU per disegnare la scena (si tratta principalmente di implementazioni pensate per sistemi non dotati di scheda grafica o senza driver appositi. Ci sono poi situazioni, sempre meno frequenti per fortuna, in cui alcuni driver utilizzano la CPU invece della GPU per emulare funzionalità non supportate dalla scheda video. Si trattava a volte di scelte di marketing. La specifica delle OpenGL non richiede infatti che le chiamate siano effettuate su un tipo di hardware specifico e non richiede che una certa operazione sia efficiente. Un driver può (ma era più comune in passato - soprattutto su schede video integrate Intel) dire di supportare qualcosa, per esempio una specifica versione delle OpenGL, accelerare in hardware solo alcune operazioni e disattivare tale accelerazione negli altri casi senza alcun tipo di avvertimento. Tali funzionalità capaci di disattivare l'accelerazione hardware potevano per esempio essere alcuni formati per le texture o il supporto agli shader..

Ormai la situazione è molto cambiata. Da dove stai imparando le OpenGL? Quale versione stai prendendo in considerazione? Personalmente credo che ormai le vecchie versioni delle OpenGL possano essere tranquillamente evitate e convenga passare direttamente alle versioni delle OpenGL successive alla 2.0. Forse anche successive alla 3.0. Probabilmente una buona scelta potrebbe essere partire dalle OpenGL ES 2 (la versione ridotta disponibile in ormai tutti gli smartphone e sul web grazie a WebGL..).

Re: OpenGl e scheda grafica

MessaggioInviato: 27/11/2012, 22:18
da hee136
Sto utilizzando la Programming Guide fornitaci dal prof. Stiamo iniziando e ha detto che per iniziare ci basta questa anche se è versione 1.1

Nella guida c'è scritto che la funzione che disegna viene chiamata quando c'è bisogno. Per capire quando viene chiamata ho inserito una printf ma non capisco in base a cosa viene chiamata.

Re: OpenGl e scheda grafica

MessaggioInviato: 27/11/2012, 22:34
da apatriarca
Le chiamate nelle OpenGL sono asincrone. In pratica inseriscono uno o più comandi corrispondenti a quello che devi fare in una specie di coda e non hai modo di sapere quando il comando viene eseguito. In realtà nelle versioni più recenti ci sono alcuni sistemi per sapere quando alcune operazioni vengono eseguite ed è possibile usare glFinish che è sincrono e aspetta che la coda venga svuotata prima di tornare all'esecuzione della funzione, ma in pratica niente di tutto ciò viene usato (se non in casi particolari). E' comune nelle applicazioni grafiche essere un po' indietro rispetto allo stato interno del programma, ma è qualcosa con la quale si deve vivere ed è in ogni caso inevitabile.

Re: OpenGl e scheda grafica

MessaggioInviato: 27/11/2012, 22:38
da hee136
apatriarca ha scritto:Le chiamate nelle OpenGL sono asincrone. In pratica inseriscono uno o più comandi corrispondenti a quello che devi fare in una specie di coda e non hai modo di sapere quando il comando viene eseguito. In realtà nelle versioni più recenti ci sono alcuni sistemi per sapere quando alcune operazioni vengono eseguite ed è possibile usare glFinish che è sincrono e aspetta che la coda venga svuotata prima di tornare all'esecuzione della funzione, ma in pratica niente di tutto ciò viene usato (se non in casi particolari). E' comune nelle applicazioni grafiche essere un po' indietro rispetto allo stato interno del programma, ma è qualcosa con la quale si deve vivere ed è in ogni caso inevitabile.


Ti ringrazio di questa interessante discussione :)

Asincrone? La programmazione ad eventi non è basata sul meccanismo hw degli interrupt?

Re: OpenGl e scheda grafica

MessaggioInviato: 27/11/2012, 22:44
da hee136
apatriarca ha scritto:Normalmente dalla GPU, ma dipende. Esistono infatti implementazioni delle OpenGL che utilizzano la CPU per disegnare la scena (si tratta principalmente di implementazioni pensate per sistemi non dotati di scheda grafica o senza driver appositi. Ci sono poi situazioni, sempre meno frequenti per fortuna, in cui alcuni driver utilizzano la CPU invece della GPU per emulare funzionalità non supportate dalla scheda video. Si trattava a volte di scelte di marketing. La specifica delle OpenGL non richiede infatti che le chiamate siano effettuate su un tipo di hardware specifico e non richiede che una certa operazione sia efficiente. Un driver può (ma era più comune in passato - soprattutto su schede video integrate Intel) dire di supportare qualcosa, per esempio una specifica versione delle OpenGL, accelerare in hardware solo alcune operazioni e disattivare tale accelerazione negli altri casi senza alcun tipo di avvertimento. Tali funzionalità capaci di disattivare l'accelerazione hardware potevano per esempio essere alcuni formati per le texture o il supporto agli shader..
(...)


Per disegnare un triangolo sullo schermo, i passi sono a grandi linee i seguenti?
La CPU copia dalla Ram alla memoria della scheda video le tre cordinate di ogni vertice.
La GPU della scheda video calcola come disegnare il triangolo, con quale proiezione e in base alla grandezza come tagliarlo.

Re: OpenGl e scheda grafica

MessaggioInviato: 28/11/2012, 01:49
da apatriarca
La natura asincrona delle OpenGL ha ben poco a che vedere con la programmazione ad eventi o gli hw interrupt. E' per certi versi simile alla programmazione web. Perché un comando venga eseguito sulla GPU è infatti necessario che tale comando e tutti i dati ad esso associati vengano inviati alla GPU attraverso il canale apposito. Una volta che la GPU ha ricevuto questi comandi li deve poi eseguire. Tutto questo richiede tantissimo tempo (dal punto di vista del processore) e non ha senso che la CPU aspetti che i comandi vengano eseguiti per continuare a fare qualcosa. E' per questo che le chiamate OpenGL ritornano subito al tuo programma dopo che il comando è stato mandato alla GPU ma non aspettano che tale comando sia stato eseguito ed in effetti potrebbe volerci tanto perché questo avvenga (potrebbero esserci altri comandi non ancora eseguiti in coda per esempio).

I passi per disegnare un triangolo sullo schermo sono tantissimi in una moderna scheda video. Tanto per darti una idea, dai una occhiata alla moderna pipeline delle OpenGL: http://www.seas.upenn.edu/~pcozzi/OpenG ... peline.pdf

Re: OpenGl e scheda grafica

MessaggioInviato: 28/11/2012, 12:23
da hee136
apatriarca ha scritto:La natura asincrona delle OpenGL ha ben poco a che vedere con la programmazione ad eventi o gli hw interrupt. E' per certi versi simile alla programmazione web. Perché un comando venga eseguito sulla GPU è infatti necessario che tale comando e tutti i dati ad esso associati vengano inviati alla GPU attraverso il canale apposito. Una volta che la GPU ha ricevuto questi comandi li deve poi eseguire. Tutto questo richiede tantissimo tempo (dal punto di vista del processore) e non ha senso che la CPU aspetti che i comandi vengano eseguiti per continuare a fare qualcosa. E' per questo che le chiamate OpenGL ritornano subito al tuo programma dopo che il comando è stato mandato alla GPU ma non aspettano che tale comando sia stato eseguito ed in effetti potrebbe volerci tanto perché questo avvenga (potrebbero esserci altri comandi non ancora eseguiti in coda per esempio).


Capito.
Quindi l'inserimento dell'esecuzione delle funzioni callback (per esempio quella che disegna) in coda è sincrono con gli eventi mentre la loro esecuzione è asincrona?

E' corretto dire che gli eventi sono realizzati a basso livello con il meccanismo dell'interrupt?

I passi per disegnare un triangolo sullo schermo sono tantissimi in una moderna scheda video. Tanto per darti una idea, dai una occhiata alla moderna pipeline delle OpenGL: http://www.seas.upenn.edu/~pcozzi/OpenG ... peline.pdf


Quello che volevo chiedere è la conferma se ho capito la prima risposta: i calcoli su come visualizzare un triangolo a partire dai tre vertici sono quindi eseguiti dalla GPU?

Re: OpenGl e scheda grafica

MessaggioInviato: 28/11/2012, 14:15
da apatriarca
Ma non ci sono funzioni di callback nelle OpenGL e non si programma ad eventi. Non capisco a cosa tu stia facendo riferimento nel tuo post. In che cosa verrebbero usati gli interrupt?

Come ti ho già spiegato non c'è alcuna garanzia che qualcosa sia accelerato da una GPU (esistono implementazioni software), ma è quello che normalmente avviene quando c'è una GPU. Con ogni probabilità i triangoli che disegni con le OpenGL sono disegnati dalla GPU.

Re: OpenGl e scheda grafica

MessaggioInviato: 28/11/2012, 15:25
da hee136
apatriarca ha scritto:Ma non ci sono funzioni di callback nelle OpenGL e non si programma ad eventi. Non capisco a cosa tu stia facendo riferimento nel tuo post. In che cosa verrebbero usati gli interrupt?


Gli eventi per me sono per esempio: pressione di un tasto della tastiere, clic del mouse, ecc...
Quando un tasto (mouse o tastiera) viene premuto, il dispositivo manda un interrupt alla cpu che interrompe ciò che sta facendo ed esegue la funzione definita da chi ha scritto il sorgente.

Come ti ho già spiegato non c'è alcuna garanzia che qualcosa sia accelerato da una GPU (esistono implementazioni software), ma è quello che normalmente avviene quando c'è una GPU. Con ogni probabilità i triangoli che disegni con le OpenGL sono disegnati dalla GPU.


Capito. Nella migliore delle ipotesi sto utilizzando quindi la GPU.
Era solo per capire quali parti hw sto utilizzando.