Strumenti Utente



indice

Creare un ambiente di sviluppo per le Qt su Windows

Questo articolo è rivolto a chi voglia cominciare a programmare con le librerie Qt in ambiente Windows o a chi, come me, da progammatore Qt in ambiente Linux ha la necessità di creare eseguibili per Windows. Vedremo brevemente come configurare i due principali ambienti di sviluppo disponibili (Visual Studio e Qt Creator), sfruttando le risorse gratuite disponibili in rete.

IDE: Visual Studio o Qt Creator

La prima scelta da affrontare è quella dell'IDE. Due le principali possibilità:

  • Visual Studio
  • Qt Creator

Come detto in precedenza (vedi Microsoft cambia idea?!) da non molto Microsoft ha messo a disposizione degli sviluppatori opensource la versione Community di Visual Studio, leggermente in ritardo rispetto ai rilasci della versione Professional ma sostanzialmente identica. La pagina di Wikipedia su Visual Studio vi fornirà maggiori indicazioni a proposito. Volendo essere sintetici possiamo dire che che Visual Studio è un ambiente di sviluppo completo, che va ben oltre le sole librerie Qt ma che è disponibile solo su piattaforma Windows.

Ancora su Qt e caricamento dinamico delle librerie OpenGL in ambiente Windows

Caricamento dinamico delle librerie OpenGL

Abbiamo già parlato della possibilità offerta dalle Qt in ambiente Windows, fin dalla versione 5.4, di adattarsi durante l'esecuzione al livello di implementazione delle OpenGL presente nel sistema di esecuzione.

Quanti di voi hanno avuto a che fare con la distribuzione di programmi con codice OpenGL in ambiente Windows sanno quanti mal di testa può determinare la a volte incompleta, a volte completamente assente, implementazione delle specifiche OpenGL presente in questo ambiente. Il caricamento dinamico delle librerie opengl sembrerebbe la panacea a tutti i problemi, dando la possibilità in fase di esecuzione di adattarsi al livello di implementazione delle specifiche OpenGL presente nel sistema. Per approfondire l'argomento, oltre al precedente post, vi rimando ad un articolo sul blog ufficiale delle Qt.

In realtà non è tutto oro quello che luccica…

Chiamata funzioni OpenGL da programma

Il principio su cui si fonda quanto appena descritto è che il linking dell'eseguibile creato debba avvenire in fase di esecuzione. E qui incontriamo un grosso problema: non conoscendo al momento della compilazione il livello di implementazione delle OpenGL, non possiamo dire al compilatore con quali librerie linkare l'eseguibile. Questo vuol dire che nella fase finale di creazione dell'eseguibile il compilatore ci darà un messaggio di errore del tipo

.../gltext2d.o: In function `...':
.../gltext2d.cpp:89: undefined reference to `[email protected]'
.../gltext2d.cpp:117: undefined reference to `[email protected]'
.../gltext2d.cpp:120: undefined reference to `[email protected]'

Il problema viene risolto chiamando le funzioni OpenGL tramite la classe QOpenGLFunctions usando

QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
...

Se in alternativa creiamo un'istanza della classe QOpenGLFunctions, ricordiamoci di inizializzarla con il metodo initializeOpenGLFunctions().

E QOpenGLTexture ?

Il metodo appena descritto non copre però una casistica: l'impiego della classe QOpenGLTexture! Poiché all'interno di tale classe vengono invocati comandi OpenGL senza l'accortezza sopra descritta, ecco riapparire i problemi di linkaggio visti sopra. Come risolverli?

Una prima soluzione è quelle di creare una classe intermedia che eredita sia da QOpenGLTexture che da QOpenGLFunctions. In caso di scene complesse la soluzione appena descritta può non essere il massimo in termini di performance, vista la necessità di inizializzare ogni texture con initializeOpenGLFunctions().

L'alternativa è quella di fare a meno di QOpenGLTexture invocando direttamente i comandi OpenGL delle texture (glGenTextures, glBindTexture, glDeletetexture … ). A volte il modo migliore per risolvere i problemi è eliminarli alla radice!

Qt e OpenGL - Le texture tridimensionali

Nel precedente articolo abbiamo cominciato a parlare delle texture OpenGL, analizzando un esempio in cui abbiamo disegnato un cubo rotante con un numero disegnato su ciascuna faccia. Il numero era una texture bidimensionale (sempre la stessa!).

Immagino siate rimasti non poco perplessi nel vedere lo stesso numero su tutte le facce del cubo! Perciò ora ci occuperemo di dare ad ogni faccia un numero diverso. La flessibilità delle API OpenGL ci pemettono di ottenere questo risultato in più modi: il più immediato potrebbe essere la creazione di sei texture. Un altro metodo è descritto nel progetto di esempio Cube OpenGL ES 2.0 disponbile nella documentazione delle Qt, in cui le facce del cubo sono disegnate in successione in un'unica immagine e con le coordinate texture si specifica quale porzione di quest'immagine disegnare su ciascuna faccia.

In questo articolo otterremo lo stesso risultato creando invece un vettore di texture. A tal proposito nelle OpenGL 3 è disponibile uno strumento ad hoc, chiamato texture 2D array. Per evitare problemi di compatibilità, ci serviremo invece di una texture tridimensionale, disponibile anche in versioni precedenti delle API OpenGL: la sostanza è la stessa, cambiano leggermente le funzioni per accedere ai valori delle texture ed i relativi parametri.

Qt, Windows e i driver OpenGL Intel

Le Qt 5.4 hanno introdotto alcune novità nelle modalità di accesso alle funzioni avanzate delle GPU. Il nuovo meccanismo, che permette di valutare al momento dell'esecuzione come accedere alle librerie grafiche, non sempre però risponde alle attese. E' perciò necessario intervenire manualmente per “indirizzare” le Qt alla scelta migliore.

Caricamento dinamico OpenGL

Fino alle Qt 5.4, su piattaforma Windows la scelta di come interfacciare le librerie Qt con le librerie OpenGL poteva avvenire solo in fase di compilazione delle Qt, con l'opzione -opengl del comando configure. Analizziamo prima le opzioni già presenti per passare poi alle novità.

Qt e OpenGL - Le texture e la classe QOpenGLTexture

In questo articolo parleremo di texture. Dopo una breve introduzione su cosa sono le texture nella programmazione openGL, vedremo come implementarle con gli strumenti standard delle OpenGL che con quelli specifici presenti all'interno delle Qt.

Continua così la panoramica sulla programmazione OpenGL e le Qt già cominciata con i precedenti articoli:

Cosa sono le texture?

Partiamo da zero definendo brevemente cosa sono le texture. Se avete avuto precedenti esperienze con la programmazione 3D probabilmente collegherete le texture alle immagini bitmap e sicuramente l'associazione è corretta. Le texture però sono uno strumento che può essere applicato anche anche per definire e caricare immagini sulla GPU . Fondamentalmente le texture sono dei vettori che possiamo usare in generale per caricare sulla GPU vettori da 1 a 3 dimensioni con un numero di elementi praticamente arbitrario (l'unico limite è connesso che le risorse hardware che abbiamo a disposizione).

Qt e OpenGL - Index Buffer Object con la classe QOpenGLBuffer

In questo articolo parleremo degli Index Buffer Object. Come già accaduto nel precedente articolo, prima vedremo come usare questo caratteristica utilizzando direttamente le API OpenGL, e, a seguire, con gli strumenti presenti nelle librerie Qt.

A cosa servono gli Index Buffer Object

Per capire a cosa servano gli index Buffer Object (d'ora in poi IBO) riferiamoci al caso concreto del disegno di un cubo. Utilizzando gli strumenti visti nel precedente articolo, per disegnare le facce che delimitano un cubo con triangoli, dovremmo creare un VBO contenente le coordinate di 36 punti (6 facce * 2 triangoli * 3 punti), ripetendo più volte le coordinate degli otto vertici che geometricamente definiscono il cubo.

L'idea dietro gli IBO è molto semplice:

  • carico un VBO contenente, nel nostro caso, i soli 8 vertici effettivamente necessari
  • disegno le facce del cubo comunicando volta per volta alla GPU i soli indici dei vertici che intendo disegnare.

L'IBO è il buffer nel quale individuo gli indici dei vertici. Trattandosi di indici, tipicamente l'IBO conterrà interi senza segno (GLushort piuttosto che GLuint).

Gli IBO in generale

Vediamo ora all'opera gli IBO utilizzando direttamente le API OpenGL. Prenderò come base i sorgenti di uno dei precedenti articoli.


indice.txt · Ultima modifica: 2013/07/08 10:00 da mickele

Facebook Twitter Google+ Digg Reddit LinkedIn StumbleUpon Email