tutorial_qt:opengl_01
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisione Revisione precedente Prossima revisione | Revisione precedente | ||
tutorial_qt:opengl_01 [2015/02/10 07:21] mickele |
tutorial_qt:opengl_01 [2015/05/05 14:43] (versione attuale) mickele |
||
---|---|---|---|
Linea 1: | Linea 1: | ||
- | ====== Qt e OpenGL: Introduzione ====== | + | ====== Qt e OpenGL |
- | Con la nuova release delle [[http:// | + | Con la nuova release delle [[http:// |
- | In questo articolo accenneremo brevemente | + | In questo articolo accenneremo brevemente |
===== Il perché di tanti cambiamenti ===== | ===== Il perché di tanti cambiamenti ===== | ||
Linea 13: | Linea 13: | ||
~~READMORE~~ | ~~READMORE~~ | ||
- | ===== QGLWidget vs QWindow ===== | + | ===== QGLWidget vs QWindow/ |
La prima grande novità riguarda la classe base che useremo per creare la nostra superficie. Nel passato si faceva riferimento a [[http:// | La prima grande novità riguarda la classe base che useremo per creare la nostra superficie. Nel passato si faceva riferimento a [[http:// | ||
- | Per quanto sia sempre possibile usare QGLWidget anche con le Qt5, il nuovo approccio prevede l' | + | Per quanto sia sempre possibile usare QGLWidget anche con le Qt5, il nuovo approccio prevede l' |
- | + | ||
- | Quali le differenze tra le due classi? | + | |
- | + | ||
- | Una prima differenza è che QGLWidget deriva da QWidget, QWindow no, non avremo quindi a disposizione alcuni dei comodi strumenti presenti in QWidget. | + | |
- | + | ||
- | Un' | + | |
===== Partiamo da QWindow... ===== | ===== Partiamo da QWindow... ===== | ||
- | Iniziamo con un esempio concreto, creando | + | Vediaemo come creare |
+ | * QWindow non deriva da QWidget, non avremo quindi a disposizione alcuni dei comodi strumenti presenti in QWidget | ||
+ | * mentre con QGLWidget (e con QOpenGLWidget) è necessario ridefinire i metodi virtuali // | ||
Creiamo la classe GLWindow che estende QWindow e [[http:// | Creiamo la classe GLWindow che estende QWindow e [[http:// | ||
Linea 60: | Linea 56: | ||
Abbiamo introdotto alcuni attributi 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 | + | Il costruttore di GLWindow si limita ad inizializzare un attributo e a comunicare all' |
GLWindow:: | GLWindow:: | ||
Linea 70: | Linea 66: | ||
} | } | ||
- | La gestione degli eventi nel nostro primo esempio è molto semplice, ci basta reimplementare due metodi virtuali: void exposeEvent(QExposeEvent *event) e void resizeEvent(QResizeEvent *event). | + | Poichè le funzionalità che vogliamo implementare sono molto semplici, ci basta reimplementare due metodi virtuali: void exposeEvent(QExposeEvent *event) e void resizeEvent(QResizeEvent *event). Il primo viene chiamato ogni volta che cambia la visibilità della nostra superficie |
- | + | ||
- | Il primo viene chiamato ogni volta che cambia la visibilità della nostra superficie; se è visibile, | + | |
void GLWindow:: | void GLWindow:: | ||
Linea 79: | Linea 73: | ||
} | } | ||
- | Il metodo paint(), che vedremo tra poco, è quello che disegna il triangolo. | + | Il metodo paint(), che vedremo tra poco, disegna il triangolo. |
- | Il metodo resizeEvent() viene chiamato in concomitanza dei ridimensionamenti della superficie. In tal caso dovremo cambiare le dimensioni della finestra | + | Il metodo resizeEvent() viene chiamato in concomitanza dei ridimensionamenti della superficie. In tal caso dovremo cambiare le dimensioni della finestra |
void GLWindow:: | void GLWindow:: | ||
Linea 93: | Linea 87: | ||
===== Gli shader ===== | ===== Gli shader ===== | ||
- | Alla base della programmazione | + | Alla base della programmazione |
- | Le prime versioni dello standard | + | Le prime versioni dello standard |
Nella versione 5 delle Qt creiamo gli shader usando la classe [[http:// | Nella versione 5 delle Qt creiamo gli shader usando la classe [[http:// | ||
Linea 101: | Linea 95: | ||
===== Opengl secondo la Qt-way ===== | ===== 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! |
Analizziamo prima il metodo paint(), il cuore delle operazioni di disegno | Analizziamo prima il metodo paint(), il cuore delle operazioni di disegno | ||
Linea 108: | Linea 102: | ||
if (!isExposed()) | if (!isExposed()) | ||
return; | return; | ||
- | | + | |
bool needsInitialize = false; | bool needsInitialize = false; | ||
- | | + | |
if (!context) { | if (!context) { | ||
m_context = new QOpenGLContext(this); | m_context = new QOpenGLContext(this); | ||
Linea 118: | Linea 112: | ||
needsInitialize = true; | needsInitialize = true; | ||
} | } | ||
+ | | ||
m_context-> | m_context-> | ||
+ | | ||
if(needsInitialize) { | if(needsInitialize) { | ||
initialize(); | initialize(); | ||
} | } | ||
- | | + | |
paintGL(); | paintGL(); | ||
+ | | ||
m_context-> | m_context-> | ||
} | } | ||
- | Una volta sola, prima che avvenga il primo disegno, paint() | + | Una volta sola, prima che avvenga il primo disegno, paint() |
void GLWindow:: | void GLWindow:: | ||
Linea 148: | Linea 142: | ||
- | Il metodo initShaders() inizializza gli shaders. Più in particolare, | + | Il metodo initShaders() inizializza gli shaders |
* creiamo un oggetto QOpenGLShaderProgram | * creiamo un oggetto QOpenGLShaderProgram | ||
* associamo a questo oggetto il codice degli shaders, contenuto in due file esterni | * associamo a questo oggetto il codice degli shaders, contenuto in due file esterni | ||
Linea 155: | Linea 149: | ||
void GLWindow:: | void GLWindow:: | ||
m_context-> | m_context-> | ||
- | | + | |
m_program = new QOpenGLShaderProgram(this); | m_program = new QOpenGLShaderProgram(this); | ||
- | | + | |
// Compila lo shader dei vertici | // Compila lo shader dei vertici | ||
if (!m_program-> | if (!m_program-> | ||
close(); | close(); | ||
- | | + | |
// Compile lo shader fragment | // Compile lo shader fragment | ||
if (!m_program-> | if (!m_program-> | ||
close(); | close(); | ||
+ | | ||
// Linka shaders | // Linka shaders | ||
if (!m_program-> | if (!m_program-> | ||
Linea 192: | Linea 186: | ||
- | Ed infine i comandi per disegnare il nostro triangolo. In questo primo articolo ci limitiamo a passare ad ogni ridisegno i dati necessari. Per farlo usiamo prima il metodo enableAttributeArray() | + | Ed infine |
void GLWindow:: | void GLWindow:: | ||
m_context-> | m_context-> | ||
- | | + | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | ||
- | | + | |
m_program-> | m_program-> | ||
- | | + | |
QMatrix4x4 matrix; | QMatrix4x4 matrix; | ||
matrix.perspective(60, | matrix.perspective(60, | ||
matrix.translate(0, | matrix.translate(0, | ||
- | | + | |
m_program-> | m_program-> | ||
- | | + | |
QVector2D vertices [] = { | QVector2D vertices [] = { | ||
QVector2D(0.0f, | QVector2D(0.0f, | ||
Linea 212: | Linea 206: | ||
QVector2D(0.5f, | QVector2D(0.5f, | ||
}; | }; | ||
- | | + | |
m_program-> | m_program-> | ||
m_program-> | m_program-> | ||
- | | + | |
QVector3D colors[] = { | QVector3D colors[] = { | ||
QVector3D(1.0f, | QVector3D(1.0f, | ||
Linea 221: | Linea 215: | ||
QVector3D(0.0f, | QVector3D(0.0f, | ||
}; | }; | ||
- | | + | |
m_program-> | m_program-> | ||
m_program-> | m_program-> | ||
- | | + | |
glDrawArrays(GL_TRIANGLES, | glDrawArrays(GL_TRIANGLES, | ||
- | | + | |
m_program-> | m_program-> | ||
} | } | ||
- | Per visualizzare quello che abbiamo creato ci serve un file mail.cpp | + | Per visualizzare quello che abbiamo creato ci serve un file main.cpp |
#include < | #include < | ||
Linea 238: | Linea 232: | ||
int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||
QGuiApplication app(argc, argv); | QGuiApplication app(argc, argv); | ||
- | | + | |
GLWindow window; | GLWindow window; | ||
window.resize(640, | window.resize(640, | ||
window.show(); | window.show(); | ||
- | | + | |
return app.exec(); | return app.exec(); | ||
} | } | ||
Linea 252: | Linea 246: | ||
Tutti i file necessari sono contenuti nell' | Tutti i file necessari sono contenuti nell' | ||
+ | ===== Articoli correlati ===== | ||
- | ===== e poi... ===== | + | <blog related> |
- | + | | |
- | Nel prossimo articolo approfondiremo i comandi | + | |
+ | </ | ||
===== Per approfondire ===== | ===== Per approfondire ===== | ||
Linea 270: | Linea 266: | ||
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||
- | + | ||
+ | ===== Potrebbero interessarti anche... ===== | ||
+ | |||
+ | Un elenco degli altri articoli disponibili sull' | ||
+ | <blog related> | ||
+ | </ | ||
tutorial_qt/opengl_01.1423549316.txt.gz · Ultima modifica: 2015/02/10 07:21 da mickele