Entrambe le parti precedenti la revisione
Revisione precedente
Prossima revisione
|
Revisione precedente
Prossima revisione
Entrambe le parti successive la revisione
|
tutorial_qt:opengl_01 [2013/09/15 10:39] mickele |
tutorial_qt:opengl_01 [2015/02/10 07:21] mickele |
~~NEWSFEED~~ | ====== Qt e OpenGL: Introduzione ====== |
====== Qt5 e Opengl #1 ====== | |
<news:Qt5 e Opengl #1> | |
| |
Con la nuova release delle [[http://qt-project.org|Qt]] sono state introdotte delle nuove classi per l'impiego delle librerie grafiche [[http://www.opengl.org/|Opengl]]. Con questa serie di articoli vedremo brevemente alcune delle novità introdotte analizzando alcuni esempi pratici. | Con la nuova release delle [[http://qt-project.org|Qt]] sono state introdotte delle nuove classi per l'impiego delle librerie grafiche [[http://www.opengl.org/|Opengl]]. |
| |
| In questo articolo accenneremo brevemente le principali novità introdotte e vedremo un esempio in cui reimplementeremo la classe QWindow. Nel [[tutorial_qt:opengl_01bis|tutorial 1bis]] (?!) invece vedremo come realizzare lo stesso risultato reimplementando la classe QOpenGLWidget. |
| |
===== Il perché di tanti cambiamenti ===== | ===== Il perché di tanti cambiamenti ===== |
| |
I motivi di quello che sembrerebbe un restyling in realtà sono molto più profondi. Con le Qt5 si è cercato di utilizzare maggiormente la GPU per renderizzare la grafica delle interfacce. Per fare questo molte funzionalità che prima erano all'interno del modulo QtOpengl sono state estese al modulo QtGui. | Chi di voi proviene dalla versione 4 delle Qt noterà molti cambiamenti nell'impiego delle librerie Opengl all'interno del framework. I motivi di quello che sembrerebbe un restyling in realtà sono molto più profondi. Con le Qt5 si è cercato di utilizzare maggiormente la GPU per renderizzare la grafica delle interfacce. Per fare questo molte funzionalità che prima erano all'interno del modulo QtOpengl sono state estese al modulo QtGui. |
| |
Con l'occasione però sono state scritte nuova classi: ad esempio la classe QGlContext è stata riscritta nella classe QOpenglContext, QGlShaderProgram è diventata QOpenglShaderProgam etc. Le nuova classi, rispetto alle precedenti, hanno prestazioni leggermente migliori, hanno delle API più semplici e permettono l'impiego di un QOpenglContext su più superfici. Per approfondire l'argomento vi consiglio di leggere cosa dice in merito uno degli sviluppatori delle Qt all'indirizzo [[http://permalink.gmane.org/gmane.comp.lib.qt.devel/9065]]. | Con l'occasione però sono state scritte nuova classi: ad esempio la classe QGlContext è stata riscritta nella classe QOpenglContext, QGlShaderProgram è diventata QOpenglShaderProgam etc. Le nuova classi, rispetto alle precedenti, hanno prestazioni leggermente migliori, hanno delle API più semplici e permettono l'impiego di un QOpenglContext su più superfici. Per approfondire l'argomento vi consiglio di leggere cosa dice in merito uno degli sviluppatori delle Qt all'indirizzo [[http://permalink.gmane.org/gmane.comp.lib.qt.devel/9065]]. |
| |
~~READMORE~~ | ~~READMORE~~ |
</news> | |
| |
===== QGLWidget vs QWindow ===== | ===== QGLWidget vs QWindow ===== |
Una prima differenza è che QGLWidget deriva da QWidget, QWindow no, non avremo quindi a disposizione alcuni dei comodi strumenti presenti in QWidget. | Una prima differenza è che QGLWidget deriva da QWidget, QWindow no, non avremo quindi a disposizione alcuni dei comodi strumenti presenti in QWidget. |
| |
Un'altra differenza riguarda le modalità con cui andremo a scrivere le sottoclassi. Derivando QGLwidget era necessario reimplementare i metodi virtuali //initializeGL()//, //paintGL ()// e //resizeGL( int width, int height )//. Con la classe QWindow abbiamo invece una maggiore flessibilità: possiamo decidere noi come e con quali metodi fornire i vari comandi. | Un'altra differenza riguarda le modalità con cui andremo a scrivere le sottoclassi. Derivando QGLwidget era necessario ridefinire i metodi virtuali //initializeGL()//, //paintGL ()// e //resizeGL( int width, int height )//. Con la classe QWindow abbiamo invece una maggiore flessibilità: possiamo decidere noi come e con quali metodi fornire i vari comandi. |
| |
===== Partiamo da QWindow... ===== | ===== Partiamo da QWindow... ===== |
Iniziamo con un esempio concreto, creando una classe derivata di QWindow nella quale vogliamo disegnare un triangolo. | Iniziamo con un esempio concreto, creando una classe derivata di QWindow nella quale vogliamo disegnare un triangolo. |
| |
Creiamo la classe GLWindow che estende QWindow e [[http://qt-project.org/doc/qt-5.1/qtgui/qopenglfunctions.html|QOpenGLFunctions]]. Estendiamo anche ques'ultima classe per poter accedere facilmente a tutti i comandi Opengl in essa contenuti. | Creiamo la classe GLWindow che estende QWindow e [[http://qt-project.org/doc/qt-5.1/qtgui/qopenglfunctions.html|QOpenGLFunctions]]. Estendiamo anche quest'ultima classe per poter accedere facilmente a tutti i comandi Opengl in essa contenuti. |
| |
Avremo un file header glwindow.h che conterrà | Avremo un file header glwindow.h che conterrà |
}; | }; |
| |
Abbiamo introdotto alcuni attribute e metodi che analizzeremo strada facendo. | Abbiamo introdotto alcuni attributi e metodi che analizzeremo strada facendo. |
| |
Il costruttore di GLWindow si limita ad inizializzare un attributo e a dire alle Qt che intendiamo disegnare sulla superficie con le opengl. | Il costruttore di GLWindow si limita ad inizializzare un attributo e a dire alle Qt che intendiamo disegnare sulla superficie con le opengl. |
| |
void GLWindow::resizeEvent(QResizeEvent *event) { | void GLWindow::resizeEvent(QResizeEvent *event) { |
glViewport(0, 0, width(), height()); | if( m_context != 0 ) |
| glViewport(0, 0, width(), height()); |
| |
if (isExposed()) | if (isExposed()) |
} | } |
| |
===== ... e aggiungiamo un po' di Opengl ===== | ===== Gli shader ===== |
| |
| Alla base della programmazione opengl moderna ci sono gli [[http://it.wikipedia.org/wiki/Shader|shader]]. |
| |
| Le prime versioni dello standard opengl prevedevano pipeline grafiche fisse: i calcoli eseguiti dalla scheda grafica erano di una tipologia ben specifica. A partire dalle Opengl 2.0 le operazioni compiute dalla GPU sono divenute personalizzabili: ora le GPU sono programmabili, e gli shader sono i programmi che carichiamo sulle nostre schede grafiche. |
| |
| Nella versione 5 delle Qt creiamo gli shader usando la classe [[http://qt-project.org/doc/qt-5/qopenglshaderprogram.html|QOpenGLShaderProgram]]. |
| |
| ===== Opengl secondo la Qt-way ===== |
| |
I metodi che vedremo ora, sia come denominazione che come struttura che come compiti, sono il risultato di una scelta personale e come tali possono essere modificati. Perciò, acquisita un po' di dimestichezza con le opengl, modificateli pure! | I metodi che vedremo ora, sia come denominazione che come struttura che come compiti, sono il risultato di una scelta personale e come tali possono essere modificati. Perciò, acquisita un po' di dimestichezza con le opengl, modificateli pure! |
{{ :tutorial_qt:opengltut01.png?direct&400 |}} | {{ :tutorial_qt:opengltut01.png?direct&400 |}} |
| |
Tutti i file necessari sono contenuati nell'archivio [[http://ingegnerialibera.altervista.org/blog-file/opengltut01.zip|opengltut01.zip]]. | Tutti i file necessari sono contenuti nell'archivio [[http://ingegnerialibera.altervista.org/blog-file/opengltut01.zip|opengltut01.zip]]. |
| |
| |
===== e poi... ===== | ===== e poi... ===== |
| |
Nel prossimo articolo approfondiremo gli strumenti messi a disposizione dalle Qt per interfacciarsi con le librerie opengl. | Nel prossimo articolo approfondiremo i comandi opengl sui quali in questo primo articolo non ci siamo molto soffermati. Vedremo quindi con maggior dettaglio cosa fanno i metodi setUniformValue(), enableAttributeArray() e setAttributeArray() della classe QOpenGLShaderProgram e ci concentreremo su metodi più efficienti di scambio delle informazioni con la GPU. |
| |
===== Per approfondire la programmazione opengl ===== | ===== Per approfondire ===== |
| |
| ==== opengl ==== |
| |
* [[http://en.wikibooks.org/wiki/OpenGL_Programming]] | * [[http://en.wikibooks.org/wiki/OpenGL_Programming]] |
* [[http://www.songho.ca/opengl/gl_transform.html]] | * [[http://www.songho.ca/opengl/]] |
* [[http://ogldev.atspace.co.uk/index.html]] | * [[http://ogldev.atspace.co.uk/index.html]] |
| * [[http://antongerdelan.net/opengl/]] |
| |
| ==== Qt e opengl ==== |
| |
* [[http://www.kdab.com/opengl-in-qt-5-1-part-5/]] (contiene i link alle parti precedenti) | * [[http://www.kdab.com/opengl-in-qt-5-1-part-5/]] (contiene i link alle parti precedenti) |
| * [[http://professor.ufabc.edu.br/~joao.gois/index.php?n=Courses.ComputerGraphicsWithQt]] |
| |
| |