From 80dbdf0de3bfe5f0710a1c37932ef81cbdb5fbff Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Wed, 22 Jul 2015 13:38:26 +0200 Subject: Make the gles3 example more impressive Add some extra rotations and offsets, to show off the power of what you can do with a single draw call. Also use QGLWindow instead of QGLWidget. This improves performance from 23 FPS to 30 FPS on a 4k monitor with integrated Intel graphics. Change-Id: Iedac1c14cc6057959aa15faaacdf29da91f36ab1 Reviewed-by: Laszlo Agocs --- examples/opengl/hellogles3/glwidget.cpp | 236 ------------------------- examples/opengl/hellogles3/glwidget.h | 87 --------- examples/opengl/hellogles3/glwindow.cpp | 281 ++++++++++++++++++++++++++++++ examples/opengl/hellogles3/glwindow.h | 98 +++++++++++ examples/opengl/hellogles3/hellogles3.pro | 8 +- examples/opengl/hellogles3/main.cpp | 10 +- examples/opengl/hellogles3/mainwindow.cpp | 58 ------ examples/opengl/hellogles3/mainwindow.h | 54 ------ 8 files changed, 386 insertions(+), 446 deletions(-) delete mode 100644 examples/opengl/hellogles3/glwidget.cpp delete mode 100644 examples/opengl/hellogles3/glwidget.h create mode 100644 examples/opengl/hellogles3/glwindow.cpp create mode 100644 examples/opengl/hellogles3/glwindow.h delete mode 100644 examples/opengl/hellogles3/mainwindow.cpp delete mode 100644 examples/opengl/hellogles3/mainwindow.h (limited to 'examples/opengl') diff --git a/examples/opengl/hellogles3/glwidget.cpp b/examples/opengl/hellogles3/glwidget.cpp deleted file mode 100644 index 74056d63c2..0000000000 --- a/examples/opengl/hellogles3/glwidget.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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$ -** -****************************************************************************/ - -#include "glwidget.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -GLWidget::GLWidget() - : m_texture(0), - m_program(0), - m_vbo(0), - m_vao(0), - m_target(0, 0, -1), - m_uniformsDirty(true) -{ - m_world.setToIdentity(); - m_world.translate(0, 0, -1); - m_world.rotate(180, 1, 0, 0); - - QSequentialAnimationGroup *animGroup = new QSequentialAnimationGroup(this); - animGroup->setLoopCount(-1); - QPropertyAnimation *zAnim0 = new QPropertyAnimation(this, QByteArrayLiteral("z")); - zAnim0->setStartValue(0.0f); - zAnim0->setEndValue(1.0f); - zAnim0->setDuration(2000); - animGroup->addAnimation(zAnim0); - QPropertyAnimation *zAnim1 = new QPropertyAnimation(this, QByteArrayLiteral("z")); - zAnim1->setStartValue(0.0f); - zAnim1->setEndValue(70.0f); - zAnim1->setDuration(4000); - zAnim1->setEasingCurve(QEasingCurve::OutElastic); - animGroup->addAnimation(zAnim1); - QPropertyAnimation *zAnim2 = new QPropertyAnimation(this, QByteArrayLiteral("z")); - zAnim2->setStartValue(70.0f); - zAnim2->setEndValue(0.0f); - zAnim2->setDuration(2000); - animGroup->addAnimation(zAnim2); - animGroup->start(); -} - -GLWidget::~GLWidget() -{ - makeCurrent(); - delete m_texture; - delete m_program; - delete m_vbo; - delete m_vao; -} - -void GLWidget::setZ(float v) -{ - m_eye.setZ(v); - m_uniformsDirty = true; - update(); -} - -static const char *vertexShaderSource = - "layout(location = 0) in vec4 vertex;\n" - "layout(location = 1) in vec3 normal;\n" - "out vec3 vert;\n" - "out vec3 vertNormal;\n" - "out vec3 color;\n" - "uniform mat4 projMatrix;\n" - "uniform mat4 camMatrix;\n" - "uniform mat4 worldMatrix;\n" - "uniform sampler2D sampler;\n" - "void main() {\n" - " ivec2 pos = ivec2(gl_InstanceID % 32, gl_InstanceID / 32);\n" - " vec2 t = vec2(-16 + pos.x, -18 + pos.y);\n" - " mat4 wm = mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, t.x, t.y, 0, 1) * worldMatrix;\n" - " color = texelFetch(sampler, pos, 0).rgb * vec3(0.4, 1.0, 0.0);\n" - " vert = vec3(wm * vertex);\n" - " vertNormal = mat3(transpose(inverse(wm))) * normal;\n" - " gl_Position = projMatrix * camMatrix * wm * vertex;\n" - "}\n"; - -static const char *fragmentShaderSource = - "in highp vec3 vert;\n" - "in highp vec3 vertNormal;\n" - "in highp vec3 color;\n" - "out highp vec4 fragColor;\n" - "uniform highp vec3 lightPos;\n" - "void main() {\n" - " highp vec3 L = normalize(lightPos - vert);\n" - " highp float NL = max(dot(normalize(vertNormal), L), 0.0);\n" - " highp vec3 col = clamp(color * 0.2 + color * 0.8 * NL, 0.0, 1.0);\n" - " fragColor = vec4(col, 1.0);\n" - "}\n"; - -QByteArray versionedShaderCode(const char *src) -{ - QByteArray versionedSrc; - - if (QOpenGLContext::currentContext()->isOpenGLES()) - versionedSrc.append(QByteArrayLiteral("#version 300 es\n")); - else - versionedSrc.append(QByteArrayLiteral("#version 330\n")); - - versionedSrc.append(src); - return versionedSrc; -} - -void GLWidget::initializeGL() -{ - QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); - - if (m_texture) { - delete m_texture; - m_texture = 0; - } - QImage img(":/qtlogo.png"); - Q_ASSERT(!img.isNull()); - m_texture = new QOpenGLTexture(img.scaled(32, 36).mirrored()); - - if (m_program) { - delete m_program; - m_program = 0; - } - m_program = new QOpenGLShaderProgram; - // Prepend the correct version directive to the sources. The rest is the - // same, thanks to the common GLSL syntax. - m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, versionedShaderCode(vertexShaderSource)); - m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, versionedShaderCode(fragmentShaderSource)); - m_program->link(); - - m_projMatrixLoc = m_program->uniformLocation("projMatrix"); - m_camMatrixLoc = m_program->uniformLocation("camMatrix"); - m_worldMatrixLoc = m_program->uniformLocation("worldMatrix"); - m_lightPosLoc = m_program->uniformLocation("lightPos"); - - // Create a VAO. Not strictly required for ES 3, but it is for plain OpenGL. - if (m_vao) { - delete m_vao; - m_vao = 0; - } - m_vao = new QOpenGLVertexArrayObject; - if (m_vao->create()) - m_vao->bind(); - - if (m_vbo) { - delete m_vbo; - m_vbo = 0; - } - m_program->bind(); - m_vbo = new QOpenGLBuffer; - m_vbo->create(); - m_vbo->bind(); - m_vbo->allocate(m_logo.constData(), m_logo.count() * sizeof(GLfloat)); - f->glEnableVertexAttribArray(0); - f->glEnableVertexAttribArray(1); - f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), 0); - f->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), reinterpret_cast(3 * sizeof(GLfloat))); - m_vbo->release(); - - f->glEnable(GL_DEPTH_TEST); - f->glEnable(GL_CULL_FACE); -} - -void GLWidget::resizeGL(int w, int h) -{ - m_proj.setToIdentity(); - m_proj.perspective(45.0f, GLfloat(w) / h, 0.01f, 100.0f); - m_uniformsDirty = true; -} - -void GLWidget::paintGL() -{ - // Now use QOpenGLExtraFunctions instead of QOpenGLFunctions as we want to - // do more than what GL(ES) 2.0 offers. - QOpenGLExtraFunctions *f = QOpenGLContext::currentContext()->extraFunctions(); - - f->glClearColor(0, 0, 0, 1); - f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - m_program->bind(); - m_texture->bind(); - - if (m_uniformsDirty) { - m_uniformsDirty = false; - QMatrix4x4 camera; - camera.lookAt(m_eye, m_eye + m_target, QVector3D(0, 1, 0)); - m_program->setUniformValue(m_projMatrixLoc, m_proj); - m_program->setUniformValue(m_camMatrixLoc, camera); - m_program->setUniformValue(m_worldMatrixLoc, m_world); - m_program->setUniformValue(m_lightPosLoc, QVector3D(0, 0, 70)); - } - - // Now call a function introduced in OpenGL 3.1 / OpenGL ES 3.0. We - // requested a 3.3 or ES 3.0 context, so we know this will work. - f->glDrawArraysInstanced(GL_TRIANGLES, 0, m_logo.vertexCount(), 32 * 36); -} diff --git a/examples/opengl/hellogles3/glwidget.h b/examples/opengl/hellogles3/glwidget.h deleted file mode 100644 index 85830c32f5..0000000000 --- a/examples/opengl/hellogles3/glwidget.h +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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$ -** -****************************************************************************/ - -#ifndef GLWIDGET_H -#define GLWIDGET_H - -#include -#include -#include -#include "../hellogl2/logo.h" - -class QOpenGLTexture; -class QOpenGLShaderProgram; -class QOpenGLBuffer; -class QOpenGLVertexArrayObject; - -class GLWidget : public QOpenGLWidget -{ - Q_OBJECT - Q_PROPERTY(float z READ z WRITE setZ) - -public: - GLWidget(); - ~GLWidget(); - - void initializeGL(); - void resizeGL(int w, int h); - void paintGL(); - - float z() const { return m_eye.z(); } - void setZ(float v); - -private: - QOpenGLTexture *m_texture; - QOpenGLShaderProgram *m_program; - QOpenGLBuffer *m_vbo; - QOpenGLVertexArrayObject *m_vao; - Logo m_logo; - int m_projMatrixLoc; - int m_camMatrixLoc; - int m_worldMatrixLoc; - int m_lightPosLoc; - QMatrix4x4 m_proj; - QMatrix4x4 m_world; - QVector3D m_eye; - QVector3D m_target; - bool m_uniformsDirty; -}; - -#endif diff --git a/examples/opengl/hellogles3/glwindow.cpp b/examples/opengl/hellogles3/glwindow.cpp new file mode 100644 index 0000000000..ad654b854c --- /dev/null +++ b/examples/opengl/hellogles3/glwindow.cpp @@ -0,0 +1,281 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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$ +** +****************************************************************************/ + +#include "glwindow.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +GLWindow::GLWindow() + : m_texture(0), + m_program(0), + m_vbo(0), + m_vao(0), + m_target(0, 0, -1), + m_uniformsDirty(true), + m_r(0), + m_r2(0) +{ + m_world.setToIdentity(); + m_world.translate(0, 0, -1); + m_world.rotate(180, 1, 0, 0); + + QSequentialAnimationGroup *animGroup = new QSequentialAnimationGroup(this); + animGroup->setLoopCount(-1); + QPropertyAnimation *zAnim0 = new QPropertyAnimation(this, QByteArrayLiteral("z")); + zAnim0->setStartValue(1.5f); + zAnim0->setEndValue(10.0f); + zAnim0->setDuration(2000); + animGroup->addAnimation(zAnim0); + QPropertyAnimation *zAnim1 = new QPropertyAnimation(this, QByteArrayLiteral("z")); + zAnim1->setStartValue(10.0f); + zAnim1->setEndValue(50.0f); + zAnim1->setDuration(4000); + zAnim1->setEasingCurve(QEasingCurve::OutElastic); + animGroup->addAnimation(zAnim1); + QPropertyAnimation *zAnim2 = new QPropertyAnimation(this, QByteArrayLiteral("z")); + zAnim2->setStartValue(50.0f); + zAnim2->setEndValue(1.5f); + zAnim2->setDuration(2000); + animGroup->addAnimation(zAnim2); + animGroup->start(); + + QPropertyAnimation* rAnim = new QPropertyAnimation(this, QByteArrayLiteral("r")); + rAnim->setStartValue(0.0f); + rAnim->setEndValue(360.0f); + rAnim->setDuration(2000); + rAnim->setLoopCount(-1); + rAnim->start(); + + QTimer::singleShot(4000, this, SLOT(startSecondStage())); +} + +GLWindow::~GLWindow() +{ + makeCurrent(); + delete m_texture; + delete m_program; + delete m_vbo; + delete m_vao; +} + +void GLWindow::startSecondStage() +{ + QPropertyAnimation* r2Anim = new QPropertyAnimation(this, QByteArrayLiteral("r2")); + r2Anim->setStartValue(0.0f); + r2Anim->setEndValue(360.0f); + r2Anim->setDuration(20000); + r2Anim->setLoopCount(-1); + r2Anim->start(); +} + +void GLWindow::setZ(float v) +{ + m_eye.setZ(v); + m_uniformsDirty = true; + update(); +} + +void GLWindow::setR(float v) +{ + m_r = v; + m_uniformsDirty = true; + update(); +} + +void GLWindow::setR2(float v) +{ + m_r2 = v; + m_uniformsDirty = true; + update(); +} + +static const char *vertexShaderSource = + "layout(location = 0) in vec4 vertex;\n" + "layout(location = 1) in vec3 normal;\n" + "out vec3 vert;\n" + "out vec3 vertNormal;\n" + "out vec3 color;\n" + "uniform mat4 projMatrix;\n" + "uniform mat4 camMatrix;\n" + "uniform mat4 worldMatrix;\n" + "uniform mat4 myMatrix;\n" + "uniform sampler2D sampler;\n" + "void main() {\n" + " ivec2 pos = ivec2(gl_InstanceID % 32, gl_InstanceID / 32);\n" + " vec2 t = vec2(float(-16 + pos.x) * 0.8, float(-18 + pos.y) * 0.6);\n" + " float val = 2.0 * length(texelFetch(sampler, pos, 0).rgb);\n" + " mat4 wm = myMatrix * mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, t.x, t.y, val, 1) * worldMatrix;\n" + " color = texelFetch(sampler, pos, 0).rgb * vec3(0.4, 1.0, 0.0);\n" + " vert = vec3(wm * vertex);\n" + " vertNormal = mat3(transpose(inverse(wm))) * normal;\n" + " gl_Position = projMatrix * camMatrix * wm * vertex;\n" + "}\n"; + +static const char *fragmentShaderSource = + "in highp vec3 vert;\n" + "in highp vec3 vertNormal;\n" + "in highp vec3 color;\n" + "out highp vec4 fragColor;\n" + "uniform highp vec3 lightPos;\n" + "void main() {\n" + " highp vec3 L = normalize(lightPos - vert);\n" + " highp float NL = max(dot(normalize(vertNormal), L), 0.0);\n" + " highp vec3 col = clamp(color * 0.2 + color * 0.8 * NL, 0.0, 1.0);\n" + " fragColor = vec4(col, 1.0);\n" + "}\n"; + +QByteArray versionedShaderCode(const char *src) +{ + QByteArray versionedSrc; + + if (QOpenGLContext::currentContext()->isOpenGLES()) + versionedSrc.append(QByteArrayLiteral("#version 300 es\n")); + else + versionedSrc.append(QByteArrayLiteral("#version 330\n")); + + versionedSrc.append(src); + return versionedSrc; +} + +void GLWindow::initializeGL() +{ + QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); + + if (m_texture) { + delete m_texture; + m_texture = 0; + } + QImage img(":/qtlogo.png"); + Q_ASSERT(!img.isNull()); + m_texture = new QOpenGLTexture(img.scaled(32, 36).mirrored()); + + if (m_program) { + delete m_program; + m_program = 0; + } + m_program = new QOpenGLShaderProgram; + // Prepend the correct version directive to the sources. The rest is the + // same, thanks to the common GLSL syntax. + m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, versionedShaderCode(vertexShaderSource)); + m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, versionedShaderCode(fragmentShaderSource)); + m_program->link(); + + m_projMatrixLoc = m_program->uniformLocation("projMatrix"); + m_camMatrixLoc = m_program->uniformLocation("camMatrix"); + m_worldMatrixLoc = m_program->uniformLocation("worldMatrix"); + m_myMatrixLoc = m_program->uniformLocation("myMatrix"); + m_lightPosLoc = m_program->uniformLocation("lightPos"); + + // Create a VAO. Not strictly required for ES 3, but it is for plain OpenGL. + if (m_vao) { + delete m_vao; + m_vao = 0; + } + m_vao = new QOpenGLVertexArrayObject; + if (m_vao->create()) + m_vao->bind(); + + if (m_vbo) { + delete m_vbo; + m_vbo = 0; + } + m_program->bind(); + m_vbo = new QOpenGLBuffer; + m_vbo->create(); + m_vbo->bind(); + m_vbo->allocate(m_logo.constData(), m_logo.count() * sizeof(GLfloat)); + f->glEnableVertexAttribArray(0); + f->glEnableVertexAttribArray(1); + f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), 0); + f->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), reinterpret_cast(3 * sizeof(GLfloat))); + m_vbo->release(); + + f->glEnable(GL_DEPTH_TEST); + f->glEnable(GL_CULL_FACE); +} + +void GLWindow::resizeGL(int w, int h) +{ + m_proj.setToIdentity(); + m_proj.perspective(45.0f, GLfloat(w) / h, 0.01f, 100.0f); + m_uniformsDirty = true; +} + +void GLWindow::paintGL() +{ + // Now use QOpenGLExtraFunctions instead of QOpenGLFunctions as we want to + // do more than what GL(ES) 2.0 offers. + QOpenGLExtraFunctions *f = QOpenGLContext::currentContext()->extraFunctions(); + + f->glClearColor(0, 0, 0, 1); + f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + m_program->bind(); + m_texture->bind(); + + if (m_uniformsDirty) { + m_uniformsDirty = false; + QMatrix4x4 camera; + camera.lookAt(m_eye, m_eye + m_target, QVector3D(0, 1, 0)); + m_program->setUniformValue(m_projMatrixLoc, m_proj); + m_program->setUniformValue(m_camMatrixLoc, camera); + QMatrix4x4 wm = m_world; + wm.rotate(m_r, 1, 1, 0); + m_program->setUniformValue(m_worldMatrixLoc, wm); + QMatrix4x4 mm; + mm.setToIdentity(); + mm.rotate(-m_r2, 1, 0, 0); + m_program->setUniformValue(m_myMatrixLoc, mm); + m_program->setUniformValue(m_lightPosLoc, QVector3D(0, 0, 70)); + } + + // Now call a function introduced in OpenGL 3.1 / OpenGL ES 3.0. We + // requested a 3.3 or ES 3.0 context, so we know this will work. + f->glDrawArraysInstanced(GL_TRIANGLES, 0, m_logo.vertexCount(), 32 * 36); +} diff --git a/examples/opengl/hellogles3/glwindow.h b/examples/opengl/hellogles3/glwindow.h new file mode 100644 index 0000000000..fe5d5383e9 --- /dev/null +++ b/examples/opengl/hellogles3/glwindow.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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$ +** +****************************************************************************/ + +#ifndef GLWIDGET_H +#define GLWIDGET_H + +#include +#include +#include +#include "../hellogl2/logo.h" + +class QOpenGLTexture; +class QOpenGLShaderProgram; +class QOpenGLBuffer; +class QOpenGLVertexArrayObject; + +class GLWindow : public QOpenGLWindow +{ + Q_OBJECT + Q_PROPERTY(float z READ z WRITE setZ) + Q_PROPERTY(float r READ r WRITE setR) + Q_PROPERTY(float r2 READ r2 WRITE setR2) + +public: + GLWindow(); + ~GLWindow(); + + void initializeGL(); + void resizeGL(int w, int h); + void paintGL(); + + float z() const { return m_eye.z(); } + void setZ(float v); + + float r() const { return m_r; } + void setR(float v); + float r2() const { return m_r2; } + void setR2(float v); +private slots: + void startSecondStage(); +private: + QOpenGLTexture *m_texture; + QOpenGLShaderProgram *m_program; + QOpenGLBuffer *m_vbo; + QOpenGLVertexArrayObject *m_vao; + Logo m_logo; + int m_projMatrixLoc; + int m_camMatrixLoc; + int m_worldMatrixLoc; + int m_myMatrixLoc; + int m_lightPosLoc; + QMatrix4x4 m_proj; + QMatrix4x4 m_world; + QVector3D m_eye; + QVector3D m_target; + bool m_uniformsDirty; + float m_r; + float m_r2; +}; + +#endif diff --git a/examples/opengl/hellogles3/hellogles3.pro b/examples/opengl/hellogles3/hellogles3.pro index 299d439fd2..e0d4c25ca6 100644 --- a/examples/opengl/hellogles3/hellogles3.pro +++ b/examples/opengl/hellogles3/hellogles3.pro @@ -1,14 +1,10 @@ -HEADERS = $$PWD/glwidget.h \ - $$PWD/mainwindow.h \ +HEADERS = $$PWD/glwindow.h \ $$PWD/../hellogl2/logo.h -SOURCES = $$PWD/glwidget.cpp \ +SOURCES = $$PWD/glwindow.cpp \ $$PWD/main.cpp \ - $$PWD/mainwindow.cpp \ $$PWD/../hellogl2/logo.cpp -QT += widgets - RESOURCES += hellogles3.qrc target.path = $$[QT_INSTALL_EXAMPLES]/opengl/hellogles3 diff --git a/examples/opengl/hellogles3/main.cpp b/examples/opengl/hellogles3/main.cpp index 3125623395..f0de28bdc4 100644 --- a/examples/opengl/hellogles3/main.cpp +++ b/examples/opengl/hellogles3/main.cpp @@ -38,11 +38,11 @@ ** ****************************************************************************/ -#include +#include #include #include -#include "mainwindow.h" +#include "glwindow.h" // This example demonstrates easy, cross-platform usage of OpenGL ES 3.0 functions via // QOpenGLExtraFunctions in an application that works identically on desktop platforms @@ -69,10 +69,10 @@ int main(int argc, char *argv[]) QSurfaceFormat::setDefaultFormat(fmt); - QApplication app(argc, argv); + QGuiApplication app(argc, argv); - MainWindow mainWindow; - mainWindow.showMaximized(); + GLWindow glWindow; + glWindow.showMaximized(); return app.exec(); } diff --git a/examples/opengl/hellogles3/mainwindow.cpp b/examples/opengl/hellogles3/mainwindow.cpp deleted file mode 100644 index 1ea72eb475..0000000000 --- a/examples/opengl/hellogles3/mainwindow.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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$ -** -****************************************************************************/ - -#include "mainwindow.h" -#include "glwidget.h" -#include -#include -#include - -MainWindow::MainWindow() -{ - QMenuBar *menuBar = new QMenuBar; - QMenu *menuWindow = menuBar->addMenu(tr("&File")); - QAction *exitAction = new QAction(menuWindow); - exitAction->setText(tr("E&xit")); - menuWindow->addAction(exitAction); - connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit())); - setMenuBar(menuBar); - - setCentralWidget(new GLWidget); -} diff --git a/examples/opengl/hellogles3/mainwindow.h b/examples/opengl/hellogles3/mainwindow.h deleted file mode 100644 index 33c2c55669..0000000000 --- a/examples/opengl/hellogles3/mainwindow.h +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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$ -** -****************************************************************************/ - -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include - -class MainWindow : public QMainWindow -{ - Q_OBJECT - -public: - MainWindow(); -}; - -#endif -- cgit v1.2.3