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/20 12:22] mickele |
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 | + | 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 |
+ | |||
+ | ~~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:: |
- | ===== Sporchiamoci le mani con QOpenGLWidget | + | Vedremo però che l' |
- | 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.1421752943.txt.gz · Ultima modifica: 2015/01/20 12:22 da mickele