tutorial_qt:opengl_01bis
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_01bis [2015/01/21 06:10] mickele [Qt5 e Opengl #1bis] |
tutorial_qt:opengl_01bis [2015/05/05 14:43] (versione attuale) mickele |
||
---|---|---|---|
Linea 1: | Linea 1: | ||
- | ====== | + | ====== |
- | Nel primo tutorial | + | Nel [[tutorial_qt: |
===== Quando usare QWindow e quando 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. | + | 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. |
+ | |||
+ | ~~READMORE~~ | ||
In realtà tale distinzione nasce semplicemente da motivi di comodità, perché è comunque possibile inserire una QWindow all' | In realtà tale distinzione nasce semplicemente da motivi di comodità, perché è comunque possibile inserire una QWindow all' | ||
Linea 14: | Linea 16: | ||
container-> | container-> | ||
- | Per approfondire il metodo statico QWidget:: | + | Per approfondire il metodo statico QWidget:: |
- | Vedremo però che l' | + | Vedremo però che l' |
- | ===== Sporchiamoci le mani con QOpenGLWidget ===== | + | |
- | Analogamente | + | ===== Un esempio applicativo con QOpenGLWidget ===== |
+ | |||
+ | Nel file di progetto è necessario attivare il modulo widgets | ||
+ | |||
+ | Qt += widgets | ||
+ | |||
+ | Chi viene dalle Qt4 noterà che non è più necessario il modulo opengl. | ||
+ | |||
+ | Per quanto riguarda il codice C++, analogamente | ||
* initializeGL() | * initializeGL() | ||
* resizeGL() | * resizeGL() | ||
* paintGL() | * paintGL() | ||
- | ===== Mescoliamo un po' | + | Partiamo con initializeGL(), |
- | E' | + | void GLWidget:: |
+ | // Creiamo l'oggetto QOpenGLShaderProgram | ||
+ | m_program = new QOpenGLShaderProgram(this); | ||
+ | |||
+ | // Compiliamo il vertex shader | ||
+ | if (!m_program-> | ||
+ | close(); | ||
+ | |||
+ | // Compiliamo il fragment shader | ||
+ | if (!m_program-> | ||
+ | close(); | ||
+ | |||
+ | // Linkiamo gli shaders | ||
+ | if (!m_program-> | ||
+ | close(); | ||
+ | |||
+ | // Attiviamo alcuni stati opengl | ||
+ | glEnable(GL_DEPTH_TEST); | ||
+ | glEnable(GL_BLEND); | ||
+ | glBlendFunc (GL_SRC_ALPHA, | ||
+ | |||
+ | // Localizzaziamo gli attributi negli shader | ||
+ | m_posAttr = m_program-> | ||
+ | m_colAttr = m_program-> | ||
+ | m_matrixUniform = m_program-> | ||
+ | } | ||
- | In tal caso nel metodo | + | Il metodo |
- | | + | |
- | | + | glViewport(0, |
- | | + | |
+ | |||
+ | Ed infine il metodo paintGL() si occupa del disegno vero e proprio | ||
+ | |||
+ | | ||
+ | makeCurrent(); | ||
| | ||
- | Al di fuori di fuori di tali comandi è possibile utilizzare | + | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); |
+ | |||
+ | m_program-> | ||
+ | |||
+ | QMatrix4x4 matrix; | ||
+ | matrix.perspective(60, | ||
+ | matrix.translate(0, | ||
+ | |||
+ | m_program-> | ||
+ | |||
+ | QVector2D vertices [] = { | ||
+ | QVector2D(0.0f, | ||
+ | QVector2D(-0.5f, | ||
+ | QVector2D(0.5f, | ||
+ | }; | ||
+ | |||
+ | m_program-> | ||
+ | m_program-> | ||
+ | |||
+ | QVector3D colors[] = { | ||
+ | QVector3D(1.0f, | ||
+ | QVector3D(0.0f, | ||
+ | QVector3D(0.0f, | ||
+ | }; | ||
+ | |||
+ | m_program-> | ||
+ | m_program-> | ||
+ | |||
+ | glDrawArrays(GL_TRIANGLES, | ||
+ | |||
+ | m_program-> | ||
+ | } | ||
+ | |||
+ | Otterremo così il seguente risultato | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Se confrontiamo il codice appena scritto con [[[[tutorial_qt: | ||
+ | |||
+ | ===== Mescoliamo le opengl con QPainter... ===== | ||
+ | |||
+ | Con QOpenGLWidget, | ||
+ | |||
+ | In tal caso nel metodo paintGL() inseriamo i comandi opengl tra i metodi beginNativePainting() ed endNativePainting() di un oggetto QPainter. | ||
+ | |||
+ | QPainter painter; | ||
+ | painter.begin(this); | ||
+ | ... | ||
+ | << | ||
+ | ... | ||
+ | painter.beginNativePainting(); | ||
+ | ... | ||
+ | << | ||
+ | ... | ||
+ | painter.endNativePainting(); | ||
+ | ... | ||
+ | << | ||
+ | ... | ||
+ | painter.end(); | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Nell' | ||
+ | |||
+ | Al link [[http:// | ||
+ | ===== Potrebbero interessarti anche... ===== | ||
+ | Un elenco degli altri articoli disponibili sull' | ||
+ | <blog related> | ||
+ | </ |
tutorial_qt/opengl_01bis.1421817046.txt.gz · Ultima modifica: 2015/01/21 06:10 (modifica esterna)