Strumenti Utente



indice

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à.

Califfo: software gratuito per il calcolo della capacità portante

Molto più di quello che sembra

Non sempre il costo di un software è proporzionale al suo valore! Questa frase è applicabile a software commerciali molto costosi che poi rivelano dubbie basi teoriche, ma fortunatamente lo è a anche software di costo contenuto, se non nullo, con alle spalle un background scientifico di tutto rispetto. Rientra in quest'ultima categoria Califfo, un software gratuito nato, per quanto ho potuto leggere, quasi per gioco su un forum di ingegneria e che sta diventando molto interessante.

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.

Qt e OpenGL - Vertex Buffer Object con la classe QOpenGLBuffer

Abbiamo visto nei precedenti articoli come accedere ala funzionalità di OpenGL derivando le classi QWindow e QOpenGLWidget.

Vedremo ora come creare un Vertex Buffer Object con le librerie Qt. Un Vertex Buffer Object (d'ora in poi VBO) è un caratteristica delle OpenGL che permette di caricare sulla memoria della GPU informazioni specifiche per ciascun vertice, rendendole disponibili per le successive fasi di disegno. In questo modo si evitano continui passaggi di dati dalla CPU alla GPU ad ogni ridisegno della scena, ottimizzando l'impiego delle risorse. Le informazioni che possono essere passate spaziano da singoli valori numerici a vettori di qualsiasi dimensione, purché prefissata.

I VBO in generale

Analizziamo quali sono le API OpenGL necessarie per creare i VBO. Per farlo partiremo dal codice del precedente articolo.

Un metodo molto semplice per accedere direttamente alle API OpenGL è derivare dalla classe QOpenGLFunctions. Pertanto la nostra classe GLWidget deriverà sia da QOpenGLWidget che da QOpenGLFunctions

class GLWidget : public QOpenGLWidget, public QOpenGLFunctions

Non è però sufficiente: è necessario lanciare initializeOpenGLFunctions() nel metodo in initializeGL()

Qt e OpenGL - Intro alla classe QOpenGLWidget

Nel precedente articolo su Qt5 e le Opengl abbiamo cominciato a vedere come utilizzare la nuova infrastruttura Opengl introdotta nelle Qt5 derivando dalla classe QWindow. Abbiamo anche evidenziato che la classe QGLWidget già presente nelle Qt4, benché ancora presente in Qt5, è stata dichiarata obsoleta, senza che ne venisse fornito un vero e proprio sostituto. Questo è stato vero fino alla versione 5.4 con cui finalmente la vecchia QGLWidget è stata aggiornata alla nuova infrastruttura, diventando QOpenGLWidget.

Quando usare QWindow e quando QOpenGLWidget

QOpenGLWidget deriva da QWidget, quindi se abbiamo realizzato la nostra interfaccia usando oggetti derivati da QWidget, ci sarà più comodo usare QOpenGLWidget che potrà essere inserito direttamente nel layout come qualsiasi altro QWidget. Se invece non abbiamo bisogno di QWidget, ad esempio perché stiamo lavorando con QtQuick, allora preferiremo QWindow.


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

Facebook Twitter Google+ Digg Reddit LinkedIn StumbleUpon Email