Prossima revisione
|
Revisione precedente
|
tutorial_qt:opengl_02_vbo_qopenglbuffer [2015/01/26 22:21] mickele creata |
tutorial_qt:opengl_02_vbo_qopenglbuffer [2015/05/05 14:42] mickele |
====== Qt e OpenGL: i Vertex Buffer Object e la classe QOpenGLBuffer ====== | ====== Qt e OpenGL - Vertex Buffer Object con la classe QOpenGLBuffer ====== |
| |
Abbiamo visto nei precedenti articoli come accedere ala funzionalità di OpenGL derivando le classi [[tutorial_qt:opengl_01|QWindow]] e [[tutorial_qt:opengl_01bis|QOpenGLWidget]]. | Abbiamo visto nei precedenti articoli come accedere ala funzionalità di OpenGL derivando le classi [[tutorial_qt:opengl_01|QWindow]] e [[tutorial_qt:opengl_01bis|QOpenGLWidget]]. |
===== I VBO in generale ===== | ===== I VBO in generale ===== |
| |
Vediamo in generale quali sono le API OpenGL necessarie per creare i VBO. Per farlo partiremo dal codice del [[tutorial_qt:opengl_01bis|precedente articolo]]. | Analizziamo quali sono le API OpenGL necessarie per creare i VBO. Per farlo partiremo dal codice del [[tutorial_qt:opengl_01bis|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 | 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 |
| |
Non è però sufficiente: è necessario lanciare initializeOpenGLFunctions() nel metodo in initializeGL() | Non è però sufficiente: è necessario lanciare initializeOpenGLFunctions() nel metodo in initializeGL() |
| |
| ~~READMORE~~ |
| |
void GLWidget::initializeGL() { | void GLWidget::initializeGL() { |
Qualora siate interessati ad approfondire i comandi appena visti vi rimando al tutorial di Wikibooks disponibile all'indirizzo [[http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_02|en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_02]]. | Qualora siate interessati ad approfondire i comandi appena visti vi rimando al tutorial di Wikibooks disponibile all'indirizzo [[http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_02|en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_02]]. |
| |
===== I VBO alla Qt-way: la classe QOpenGLBuffer ===== | ===== I VBO secondo la Qt-way: la classe QOpenGLBuffer ===== |
| |
Adesso analizziamo l'utilizzo dei VBO con le librerie Qt. Ci serviremo della classe [[http://doc.qt.io/qt-5/qopenglbuffer.html|QOpenGLBuffer]]. | Adesso analizziamo l'utilizzo dei VBO con le librerie Qt. Ci serviremo della classe [[http://doc.qt.io/qt-5/qopenglbuffer.html|QOpenGLBuffer]]. |
| |
Il costruttore della classe richiede che si definisca il tipo di QOpenGLBuffer che si intende creare. Per il disegno vettoriale sono due le tipologie di QOpenGLBuffer che ci interessano: | Il costruttore della classe richiede che si definisca il tipo di QOpenGLBuffer che si intende creare. Per il disegno interattivo sono due le tipologie di QOpenGLBuffer che ci interessano: |
* QOpenGLBuffer::VertexBuffer | * QOpenGLBuffer::VertexBuffer, per creare i VBO; è l'opzione di default ed è quella che utilizzeremo tra breve; |
* QOpenGLBuffer::IndexBuffer | * QOpenGLBuffer::IndexBuffer, per creare gli Indexed Buffer Object (ne vedremo l'impiego in un prossimo articolo). |
| |
Useremo QOpenGLBuffer::VertexBuffer per caricare dati in virgola mobile (valori numerici, coordinate, vettori etc) associati ai vertici. QOpenGLBuffer::IndexBuffer ci serve invece per gli indici, ne vedremo l'impiego in un prossimo articolo. | Anche in questo caso riprendiamo il codice del [[tutorial_qt:opengl_01bis|precedente articolo]] introducendo come attributi privati due puntatori alla classe QOpenGLBuffer |
| |
Anche in questo caso riprendiamo il codice del [[tutorial_qt:opengl_01bis|precedente articolo]], questa volta gli attributi privati sono delle istanze della classe QOpenGLBuffer | |
| |
QOpenGLBuffer * m_vertexVBO; | QOpenGLBuffer * m_vertexVBO; |
QOpenGLBuffer * m_colorVBO; | QOpenGLBuffer * m_colorVBO; |
| |
Nel metodo initializeGL() creeremo l'oggetto QOpenGLBuffer | Useremo il primo per le coordinate dei vertici, il secondo per i relativi colori. |
| |
| Nel metodo initializeGL() creiamo l'istanza della classe OpenGLBuffer |
| |
m_vertexVBO = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer); | m_vertexVBO = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer); |
m_vertexVBO->create(); | m_vertexVBO->create(); |
| |
Col metodo setUsagePattern possiamo definire la tipologia di dati che stiamo trasmettendo, ad esempio se si tratti di dati costanti o che cambieranno, di modo da ottimizzare l'impiego delle risorse di sistema. Nel nostro caso abbiamo a che fare con valori, useremo perciò | Col metodo setUsagePattern definiamo quante volte i dati in questione verranno letti e reimpostati nel coso del prgramma, di modo da ottimizzare l'impiego delle risorse di sistema. Nel nostro caso abbiamo a che fare con valori che verranno impostati una volta ma letti molte volte; useremo perciò |
| |
m_vertexVBO->setUsagePattern( QOpenGLBuffer::StaticDraw ); | m_vertexVBO->setUsagePattern( QOpenGLBuffer::StaticDraw ); |
glDrawArrays(GL_TRIANGLES, 0, 3); | glDrawArrays(GL_TRIANGLES, 0, 3); |
| |
| Al link [[http://ingegnerialibera.altervista.org/blog-file/opengltut02-02.zip|ingegnerialibera.altervista.org/blog-file/opengltut02-02.zip]] troverete il codice finale con tutte le modifiche fin qui viste. |
| |
Al link [[http://ingegnerialibera.altervista.org/blog-file/opengltut02-02.zip|ingegnerialibera.altervista.org/blog-file/opengltut02-02.zip]] troverete il codice funzoinante con tutte le modifiche fin qui viste. | Se confrontiamo i due diversi approcci (quello generale con l'impiego delle API OpenGL e quello specifico delle librerie Qt) notiamo che il principale vantaggio della classe QOpenGLBuffer non sia tanto nella riduzione del codice, quanto nella sua maggior leggibilità. |
| |
Se confrontiamo i due diversi approcci (quello generale con l'impiego diretto delle API OpenGL e quello specifico delle librerie Qt) notiamo che il principale vantaggio della classe QOpenGLBuffer non sia tanto nella riduzione del codice, quanto nella sua maggior leggibilità. | |
| |
===== Facciamo girare il triangolo! ===== | ===== Facciamo girare il triangolo! ===== |
Nel codice disponibile all'indirizzo [[http://ingegnerialibera.altervista.org/blog-file/opengltut02-03.zip|ingegnerialibera.altervista.org/blog-file/opengltut02-03.zip]] troverete che la rotazione si interrompe o riprende al click del mouse sulla finestra. Lascio a voi l'analisi di questa piccola variante sul tema. | Nel codice disponibile all'indirizzo [[http://ingegnerialibera.altervista.org/blog-file/opengltut02-03.zip|ingegnerialibera.altervista.org/blog-file/opengltut02-03.zip]] troverete che la rotazione si interrompe o riprende al click del mouse sulla finestra. Lascio a voi l'analisi di questa piccola variante sul tema. |
| |
===== Post correlati ===== | ===== Potrebbero interessarti anche... ===== |
| |
* [[tutorial_qt:opengl_01|Qt e Opengl: Introduzione]] | Un elenco degli altri articoli disponibili sull'argomento: |
* [[tutorial_qt:opengl_01bis|Qt e Opengl: Intro alla classe QOpenGLWidget]] | <blog related> |
| </blog> |
| |