Strumenti Utente



tutorial_qt:opengl_01

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

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
Linea 1: Linea 1:
-~~NEWSFEED~~ +====== Qt OpenGL: Introduzione ======
-====== Qt5 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 =====
Linea 24: Linea 23:
 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... =====
Linea 30: Linea 29:
 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à
Linea 59: Linea 58:
   };   };
  
-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.
Linea 85: Linea 84:
  
   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())
Linea 91: Linea 91:
   }   }
  
-===== ... 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!
Linea 242: Linea 250:
 {{ :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]]
 + 
  

tutorial_qt/opengl_01.txt · Ultima modifica: 2015/05/05 14:43 da mickele

Facebook Twitter Google+ Digg Reddit LinkedIn StumbleUpon Email