| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:BSD$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** BSD License Usage |
| ** Alternatively, you may use this file under the terms of the BSD license |
| ** as follows: |
| ** |
| ** "Redistribution and use in source and binary forms, with or without |
| ** modification, are permitted provided that the following conditions are |
| ** met: |
| ** * Redistributions of source code must retain the above copyright |
| ** notice, this list of conditions and the following disclaimer. |
| ** * Redistributions in binary form must reproduce the above copyright |
| ** notice, this list of conditions and the following disclaimer in |
| ** the documentation and/or other materials provided with the |
| ** distribution. |
| ** * Neither the name of The Qt Company Ltd nor the names of its |
| ** contributors may be used to endorse or promote products derived |
| ** from this software without specific prior written permission. |
| ** |
| ** |
| ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| //! [0] |
| class MyGLWidget : public QOpenGLWidget |
| { |
| public: |
| MyGLWidget(QWidget *parent) : QOpenGLWidget(parent) { } |
| |
| protected: |
| void initializeGL() override |
| { |
| // Set up the rendering context, load shaders and other resources, etc.: |
| QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); |
| f->glClearColor(1.0f, 1.0f, 1.0f, 1.0f); |
| ... |
| } |
| |
| void resizeGL(int w, int h) override |
| { |
| // Update projection matrix and other size related settings: |
| m_projection.setToIdentity(); |
| m_projection.perspective(45.0f, w / float(h), 0.01f, 100.0f); |
| ... |
| } |
| |
| void paintGL() override |
| { |
| // Draw the scene: |
| QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); |
| f->glClear(GL_COLOR_BUFFER_BIT); |
| ... |
| } |
| |
| }; |
| //! [0] |
| |
| //! [1] |
| class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions |
| { |
| ... |
| void initializeGL() override |
| { |
| initializeOpenGLFunctions(); |
| glClearColor(...); |
| ... |
| } |
| ... |
| }; |
| //! [1] |
| |
| //! [2] |
| QOpenGLWidget *widget = new QOpenGLWidget(parent); |
| QSurfaceFormat format; |
| format.setDepthBufferSize(24); |
| format.setStencilBufferSize(8); |
| format.setVersion(3, 2); |
| format.setProfile(QSurfaceFormat::CoreProfile); |
| widget->setFormat(format); // must be called before the widget or its parent window gets shown |
| //! [2] |
| |
| //! [3] |
| ... |
| void paintGL() override |
| { |
| QOpenGLFunctions_3_2_Core *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_2_Core>(); |
| ... |
| f->glDrawArraysInstanced(...); |
| ... |
| } |
| ... |
| //! [3] |
| |
| //! [4] |
| class MyGLWidget : public QOpenGLWidget |
| { |
| ... |
| |
| private: |
| QOpenGLVertexArrayObject m_vao; |
| QOpenGLBuffer m_vbo; |
| QOpenGLShaderProgram *m_program; |
| QOpenGLShader *m_shader; |
| QOpenGLTexture *m_texture; |
| }; |
| |
| MyGLWidget::MyGLWidget() |
| : m_program(0), m_shader(0), m_texture(0) |
| { |
| // No OpenGL resource initialization is done here. |
| } |
| |
| MyGLWidget::~MyGLWidget() |
| { |
| // Make sure the context is current and then explicitly |
| // destroy all underlying OpenGL resources. |
| makeCurrent(); |
| |
| delete m_texture; |
| delete m_shader; |
| delete m_program; |
| |
| m_vbo.destroy(); |
| m_vao.destroy(); |
| |
| doneCurrent(); |
| } |
| |
| void MyGLWidget::initializeGL() |
| { |
| m_vao.create(); |
| if (m_vao.isCreated()) |
| m_vao.bind(); |
| |
| m_vbo.create(); |
| m_vbo.bind(); |
| m_vbo.allocate(...); |
| |
| m_texture = new QOpenGLTexture(QImage(...)); |
| |
| m_shader = new QOpenGLShader(...); |
| m_program = new QOpenGLShaderProgram(...); |
| |
| ... |
| } |
| //! [4] |
| |
| //! [5] |
| void MyGLWidget::initializeGL() |
| { |
| // context() and QOpenGLContext::currentContext() are equivalent when called from initializeGL or paintGL. |
| connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &MyGLWidget::cleanup); |
| } |
| |
| void MyGLWidget::cleanup() |
| { |
| makeCurrent(); |
| delete m_texture; |
| m_texture = 0; |
| ... |
| doneCurrent(); |
| } |
| //! [5] |
| |
| //! [6] |
| int main(int argc, char **argv) |
| { |
| QApplication app(argc, argv); |
| |
| QSurfaceFormat format; |
| format.setDepthBufferSize(24); |
| format.setStencilBufferSize(8); |
| format.setVersion(3, 2); |
| format.setProfile(QSurfaceFormat::CoreProfile); |
| QSurfaceFormat::setDefaultFormat(format); |
| |
| MyWidget widget; |
| widget.show(); |
| |
| return app.exec(); |
| } |
| //! [6] |