<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>glwindow.cpp Example File | Qt OpenGL</title> <link rel="stylesheet" type="text/css" href="style/offline-simple.css" /> <script type="text/javascript"> document.getElementsByTagName("link").item(0).setAttribute("href", "style/offline.css"); // loading style sheet breaks anchors that were jumped to before // so force jumping to anchor again setTimeout(function() { var anchor = location.hash; // need to jump to different anchor first (e.g. none) location.hash = "#"; setTimeout(function() { location.hash = anchor; }, 0); }, 0); </script> </head> <body> <div class="header" id="qtdocheader"> <div class="main"> <div class="main-rounded"> <div class="navigationbar"> <table><tr> <td >Qt 5.12</td><td ><a href="qtopengl-index.html">Qt OpenGL</a></td><td ><a href="qtopengl-hellogles3-example.html">Hello GLES3 Example</a></td><td >glwindow.cpp Example File</td></tr></table><table class="buildversion"><tr> <td id="buildversion" width="100%" align="right"><a href="qtopengl-index.html">Qt 5.12.6 Reference Documentation</a></td> </tr></table> </div> </div> <div class="content"> <div class="line"> <div class="content mainContent"> <div class="sidebar"><div class="sidebar-content" id="sidebar-content"></div></div> <h1 class="title">glwindow.cpp Example File</h1> <span class="subtitle">hellogles3/glwindow.cpp</span> <!-- $$$hellogles3/glwindow.cpp-description --> <div class="descr"> <a name="details"></a> <pre class="cpp"> <span class="comment">/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples 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$ ** ****************************************************************************/</span> <span class="preprocessor">#include "glwindow.h"</span> <span class="preprocessor">#include <QImage></span> <span class="preprocessor">#include <QOpenGLTexture></span> <span class="preprocessor">#include <QOpenGLShaderProgram></span> <span class="preprocessor">#include <QOpenGLBuffer></span> <span class="preprocessor">#include <QOpenGLContext></span> <span class="preprocessor">#include <QOpenGLVertexArrayObject></span> <span class="preprocessor">#include <QOpenGLExtraFunctions></span> <span class="preprocessor">#include <QPropertyAnimation></span> <span class="preprocessor">#include <QPauseAnimation></span> <span class="preprocessor">#include <QSequentialAnimationGroup></span> <span class="preprocessor">#include <QTimer></span> GLWindow<span class="operator">::</span>GLWindow() : m_texture(<span class="number">0</span>)<span class="operator">,</span> m_program(<span class="number">0</span>)<span class="operator">,</span> m_vbo(<span class="number">0</span>)<span class="operator">,</span> m_vao(<span class="number">0</span>)<span class="operator">,</span> m_target(<span class="number">0</span><span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="operator">-</span><span class="number">1</span>)<span class="operator">,</span> m_uniformsDirty(<span class="keyword">true</span>)<span class="operator">,</span> m_r(<span class="number">0</span>)<span class="operator">,</span> m_r2(<span class="number">0</span>) { m_world<span class="operator">.</span>setToIdentity(); m_world<span class="operator">.</span>translate(<span class="number">0</span><span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="operator">-</span><span class="number">1</span>); m_world<span class="operator">.</span>rotate(<span class="number">180</span><span class="operator">,</span> <span class="number">1</span><span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="number">0</span>); <span class="type"><a href="../qtcore/qsequentialanimationgroup.html">QSequentialAnimationGroup</a></span> <span class="operator">*</span>animGroup <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="../qtcore/qsequentialanimationgroup.html">QSequentialAnimationGroup</a></span>(<span class="keyword">this</span>); animGroup<span class="operator">-</span><span class="operator">></span>setLoopCount(<span class="operator">-</span><span class="number">1</span>); <span class="type"><a href="../qtcore/qpropertyanimation.html">QPropertyAnimation</a></span> <span class="operator">*</span>zAnim0 <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="../qtcore/qpropertyanimation.html">QPropertyAnimation</a></span>(<span class="keyword">this</span><span class="operator">,</span> <span class="type"><a href="../qtcore/qbytearray.html#QByteArrayLiteral">QByteArrayLiteral</a></span>(<span class="string">"z"</span>)); zAnim0<span class="operator">-</span><span class="operator">></span>setStartValue(<span class="number">1.5f</span>); zAnim0<span class="operator">-</span><span class="operator">></span>setEndValue(<span class="number">10.0f</span>); zAnim0<span class="operator">-</span><span class="operator">></span>setDuration(<span class="number">2000</span>); animGroup<span class="operator">-</span><span class="operator">></span>addAnimation(zAnim0); <span class="type"><a href="../qtcore/qpropertyanimation.html">QPropertyAnimation</a></span> <span class="operator">*</span>zAnim1 <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="../qtcore/qpropertyanimation.html">QPropertyAnimation</a></span>(<span class="keyword">this</span><span class="operator">,</span> <span class="type"><a href="../qtcore/qbytearray.html#QByteArrayLiteral">QByteArrayLiteral</a></span>(<span class="string">"z"</span>)); zAnim1<span class="operator">-</span><span class="operator">></span>setStartValue(<span class="number">10.0f</span>); zAnim1<span class="operator">-</span><span class="operator">></span>setEndValue(<span class="number">50.0f</span>); zAnim1<span class="operator">-</span><span class="operator">></span>setDuration(<span class="number">4000</span>); zAnim1<span class="operator">-</span><span class="operator">></span>setEasingCurve(<span class="type"><a href="../qtcore/qeasingcurve.html">QEasingCurve</a></span><span class="operator">::</span>OutElastic); animGroup<span class="operator">-</span><span class="operator">></span>addAnimation(zAnim1); <span class="type"><a href="../qtcore/qpropertyanimation.html">QPropertyAnimation</a></span> <span class="operator">*</span>zAnim2 <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="../qtcore/qpropertyanimation.html">QPropertyAnimation</a></span>(<span class="keyword">this</span><span class="operator">,</span> <span class="type"><a href="../qtcore/qbytearray.html#QByteArrayLiteral">QByteArrayLiteral</a></span>(<span class="string">"z"</span>)); zAnim2<span class="operator">-</span><span class="operator">></span>setStartValue(<span class="number">50.0f</span>); zAnim2<span class="operator">-</span><span class="operator">></span>setEndValue(<span class="number">1.5f</span>); zAnim2<span class="operator">-</span><span class="operator">></span>setDuration(<span class="number">2000</span>); animGroup<span class="operator">-</span><span class="operator">></span>addAnimation(zAnim2); animGroup<span class="operator">-</span><span class="operator">></span>start(); <span class="type"><a href="../qtcore/qpropertyanimation.html">QPropertyAnimation</a></span><span class="operator">*</span> rAnim <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="../qtcore/qpropertyanimation.html">QPropertyAnimation</a></span>(<span class="keyword">this</span><span class="operator">,</span> <span class="type"><a href="../qtcore/qbytearray.html#QByteArrayLiteral">QByteArrayLiteral</a></span>(<span class="string">"r"</span>)); rAnim<span class="operator">-</span><span class="operator">></span>setStartValue(<span class="number">0.0f</span>); rAnim<span class="operator">-</span><span class="operator">></span>setEndValue(<span class="number">360.0f</span>); rAnim<span class="operator">-</span><span class="operator">></span>setDuration(<span class="number">2000</span>); rAnim<span class="operator">-</span><span class="operator">></span>setLoopCount(<span class="operator">-</span><span class="number">1</span>); rAnim<span class="operator">-</span><span class="operator">></span>start(); <span class="type"><a href="../qtcore/qtimer.html">QTimer</a></span><span class="operator">::</span>singleShot(<span class="number">4000</span><span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> <span class="operator">&</span>GLWindow<span class="operator">::</span>startSecondStage); } GLWindow<span class="operator">::</span><span class="operator">~</span>GLWindow() { makeCurrent(); <span class="keyword">delete</span> m_texture; <span class="keyword">delete</span> m_program; <span class="keyword">delete</span> m_vbo; <span class="keyword">delete</span> m_vao; } <span class="type">void</span> GLWindow<span class="operator">::</span>startSecondStage() { <span class="type"><a href="../qtcore/qpropertyanimation.html">QPropertyAnimation</a></span><span class="operator">*</span> r2Anim <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="../qtcore/qpropertyanimation.html">QPropertyAnimation</a></span>(<span class="keyword">this</span><span class="operator">,</span> <span class="type"><a href="../qtcore/qbytearray.html#QByteArrayLiteral">QByteArrayLiteral</a></span>(<span class="string">"r2"</span>)); r2Anim<span class="operator">-</span><span class="operator">></span>setStartValue(<span class="number">0.0f</span>); r2Anim<span class="operator">-</span><span class="operator">></span>setEndValue(<span class="number">360.0f</span>); r2Anim<span class="operator">-</span><span class="operator">></span>setDuration(<span class="number">20000</span>); r2Anim<span class="operator">-</span><span class="operator">></span>setLoopCount(<span class="operator">-</span><span class="number">1</span>); r2Anim<span class="operator">-</span><span class="operator">></span>start(); } <span class="type">void</span> GLWindow<span class="operator">::</span>setZ(<span class="type">float</span> v) { m_eye<span class="operator">.</span>setZ(v); m_uniformsDirty <span class="operator">=</span> <span class="keyword">true</span>; update(); } <span class="type">void</span> GLWindow<span class="operator">::</span>setR(<span class="type">float</span> v) { m_r <span class="operator">=</span> v; m_uniformsDirty <span class="operator">=</span> <span class="keyword">true</span>; update(); } <span class="type">void</span> GLWindow<span class="operator">::</span>setR2(<span class="type">float</span> v) { m_r2 <span class="operator">=</span> v; m_uniformsDirty <span class="operator">=</span> <span class="keyword">true</span>; update(); } <span class="keyword">static</span> <span class="keyword">const</span> <span class="type">char</span> <span class="operator">*</span>vertexShaderSource <span class="operator">=</span> <span class="string">"layout(location = 0) in vec4 vertex;\n"</span> <span class="string">"layout(location = 1) in vec3 normal;\n"</span> <span class="string">"out vec3 vert;\n"</span> <span class="string">"out vec3 vertNormal;\n"</span> <span class="string">"out vec3 color;\n"</span> <span class="string">"uniform mat4 projMatrix;\n"</span> <span class="string">"uniform mat4 camMatrix;\n"</span> <span class="string">"uniform mat4 worldMatrix;\n"</span> <span class="string">"uniform mat4 myMatrix;\n"</span> <span class="string">"uniform sampler2D sampler;\n"</span> <span class="string">"void main() {\n"</span> <span class="string">" ivec2 pos = ivec2(gl_InstanceID % 32, gl_InstanceID / 32);\n"</span> <span class="string">" vec2 t = vec2(float(-16 + pos.x) * 0.8, float(-18 + pos.y) * 0.6);\n"</span> <span class="string">" float val = 2.0 * length(texelFetch(sampler, pos, 0).rgb);\n"</span> <span class="string">" mat4 wm = myMatrix * mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, t.x, t.y, val, 1) * worldMatrix;\n"</span> <span class="string">" color = texelFetch(sampler, pos, 0).rgb * vec3(0.4, 1.0, 0.0);\n"</span> <span class="string">" vert = vec3(wm * vertex);\n"</span> <span class="string">" vertNormal = mat3(transpose(inverse(wm))) * normal;\n"</span> <span class="string">" gl_Position = projMatrix * camMatrix * wm * vertex;\n"</span> <span class="string">"}\n"</span>; <span class="keyword">static</span> <span class="keyword">const</span> <span class="type">char</span> <span class="operator">*</span>fragmentShaderSource <span class="operator">=</span> <span class="string">"in highp vec3 vert;\n"</span> <span class="string">"in highp vec3 vertNormal;\n"</span> <span class="string">"in highp vec3 color;\n"</span> <span class="string">"out highp vec4 fragColor;\n"</span> <span class="string">"uniform highp vec3 lightPos;\n"</span> <span class="string">"void main() {\n"</span> <span class="string">" highp vec3 L = normalize(lightPos - vert);\n"</span> <span class="string">" highp float NL = max(dot(normalize(vertNormal), L), 0.0);\n"</span> <span class="string">" highp vec3 col = clamp(color * 0.2 + color * 0.8 * NL, 0.0, 1.0);\n"</span> <span class="string">" fragColor = vec4(col, 1.0);\n"</span> <span class="string">"}\n"</span>; <span class="type"><a href="../qtcore/qbytearray.html">QByteArray</a></span> versionedShaderCode(<span class="keyword">const</span> <span class="type">char</span> <span class="operator">*</span>src) { <span class="type"><a href="../qtcore/qbytearray.html">QByteArray</a></span> versionedSrc; <span class="keyword">if</span> (<span class="type"><a href="../qtgui/qopenglcontext.html">QOpenGLContext</a></span><span class="operator">::</span>currentContext()<span class="operator">-</span><span class="operator">></span>isOpenGLES()) versionedSrc<span class="operator">.</span>append(<span class="type"><a href="../qtcore/qbytearray.html#QByteArrayLiteral">QByteArrayLiteral</a></span>(<span class="string">"#version 300 es\n"</span>)); <span class="keyword">else</span> versionedSrc<span class="operator">.</span>append(<span class="type"><a href="../qtcore/qbytearray.html#QByteArrayLiteral">QByteArrayLiteral</a></span>(<span class="string">"#version 330\n"</span>)); versionedSrc<span class="operator">.</span>append(src); <span class="keyword">return</span> versionedSrc; } <span class="type">void</span> GLWindow<span class="operator">::</span>initializeGL() { <span class="type"><a href="../qtgui/qopenglfunctions.html">QOpenGLFunctions</a></span> <span class="operator">*</span>f <span class="operator">=</span> <span class="type"><a href="../qtgui/qopenglcontext.html">QOpenGLContext</a></span><span class="operator">::</span>currentContext()<span class="operator">-</span><span class="operator">></span>functions(); <span class="keyword">if</span> (m_texture) { <span class="keyword">delete</span> m_texture; m_texture <span class="operator">=</span> <span class="number">0</span>; } <span class="type"><a href="../qtgui/qimage.html">QImage</a></span> img(<span class="string">":/qtlogo.png"</span>); Q_ASSERT(<span class="operator">!</span>img<span class="operator">.</span>isNull()); m_texture <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="../qtgui/qopengltexture.html">QOpenGLTexture</a></span>(img<span class="operator">.</span>scaled(<span class="number">32</span><span class="operator">,</span> <span class="number">36</span>)<span class="operator">.</span>mirrored()); <span class="keyword">if</span> (m_program) { <span class="keyword">delete</span> m_program; m_program <span class="operator">=</span> <span class="number">0</span>; } m_program <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="../qtgui/qopenglshaderprogram.html">QOpenGLShaderProgram</a></span>; <span class="comment">// Prepend the correct version directive to the sources. The rest is the</span> <span class="comment">// same, thanks to the common GLSL syntax.</span> m_program<span class="operator">-</span><span class="operator">></span>addShaderFromSourceCode(<span class="type"><a href="../qtgui/qopenglshader.html">QOpenGLShader</a></span><span class="operator">::</span>Vertex<span class="operator">,</span> versionedShaderCode(vertexShaderSource)); m_program<span class="operator">-</span><span class="operator">></span>addShaderFromSourceCode(<span class="type"><a href="../qtgui/qopenglshader.html">QOpenGLShader</a></span><span class="operator">::</span>Fragment<span class="operator">,</span> versionedShaderCode(fragmentShaderSource)); m_program<span class="operator">-</span><span class="operator">></span>link(); m_projMatrixLoc <span class="operator">=</span> m_program<span class="operator">-</span><span class="operator">></span>uniformLocation(<span class="string">"projMatrix"</span>); m_camMatrixLoc <span class="operator">=</span> m_program<span class="operator">-</span><span class="operator">></span>uniformLocation(<span class="string">"camMatrix"</span>); m_worldMatrixLoc <span class="operator">=</span> m_program<span class="operator">-</span><span class="operator">></span>uniformLocation(<span class="string">"worldMatrix"</span>); m_myMatrixLoc <span class="operator">=</span> m_program<span class="operator">-</span><span class="operator">></span>uniformLocation(<span class="string">"myMatrix"</span>); m_lightPosLoc <span class="operator">=</span> m_program<span class="operator">-</span><span class="operator">></span>uniformLocation(<span class="string">"lightPos"</span>); <span class="comment">// Create a VAO. Not strictly required for ES 3, but it is for plain OpenGL.</span> <span class="keyword">if</span> (m_vao) { <span class="keyword">delete</span> m_vao; m_vao <span class="operator">=</span> <span class="number">0</span>; } m_vao <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="../qtgui/qopenglvertexarrayobject.html">QOpenGLVertexArrayObject</a></span>; <span class="keyword">if</span> (m_vao<span class="operator">-</span><span class="operator">></span>create()) m_vao<span class="operator">-</span><span class="operator">></span>bind(); <span class="keyword">if</span> (m_vbo) { <span class="keyword">delete</span> m_vbo; m_vbo <span class="operator">=</span> <span class="number">0</span>; } m_program<span class="operator">-</span><span class="operator">></span>bind(); m_vbo <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="../qtgui/qopenglbuffer.html">QOpenGLBuffer</a></span>; m_vbo<span class="operator">-</span><span class="operator">></span>create(); m_vbo<span class="operator">-</span><span class="operator">></span>bind(); m_vbo<span class="operator">-</span><span class="operator">></span>allocate(m_logo<span class="operator">.</span>constData()<span class="operator">,</span> m_logo<span class="operator">.</span>count() <span class="operator">*</span> <span class="keyword">sizeof</span>(GLfloat)); f<span class="operator">-</span><span class="operator">></span>glEnableVertexAttribArray(<span class="number">0</span>); f<span class="operator">-</span><span class="operator">></span>glEnableVertexAttribArray(<span class="number">1</span>); f<span class="operator">-</span><span class="operator">></span>glVertexAttribPointer(<span class="number">0</span><span class="operator">,</span> <span class="number">3</span><span class="operator">,</span> GL_FLOAT<span class="operator">,</span> GL_FALSE<span class="operator">,</span> <span class="number">6</span> <span class="operator">*</span> <span class="keyword">sizeof</span>(GLfloat)<span class="operator">,</span> <span class="number">0</span>); f<span class="operator">-</span><span class="operator">></span>glVertexAttribPointer(<span class="number">1</span><span class="operator">,</span> <span class="number">3</span><span class="operator">,</span> GL_FLOAT<span class="operator">,</span> GL_FALSE<span class="operator">,</span> <span class="number">6</span> <span class="operator">*</span> <span class="keyword">sizeof</span>(GLfloat)<span class="operator">,</span> <span class="keyword">reinterpret_cast</span><span class="operator"><</span><span class="type">void</span> <span class="operator">*</span><span class="operator">></span>(<span class="number">3</span> <span class="operator">*</span> <span class="keyword">sizeof</span>(GLfloat))); m_vbo<span class="operator">-</span><span class="operator">></span>release(); f<span class="operator">-</span><span class="operator">></span>glEnable(GL_DEPTH_TEST); f<span class="operator">-</span><span class="operator">></span>glEnable(GL_CULL_FACE); } <span class="type">void</span> GLWindow<span class="operator">::</span>resizeGL(<span class="type">int</span> w<span class="operator">,</span> <span class="type">int</span> h) { m_proj<span class="operator">.</span>setToIdentity(); m_proj<span class="operator">.</span>perspective(<span class="number">45.0f</span><span class="operator">,</span> GLfloat(w) <span class="operator">/</span> h<span class="operator">,</span> <span class="number">0.01f</span><span class="operator">,</span> <span class="number">100.0f</span>); m_uniformsDirty <span class="operator">=</span> <span class="keyword">true</span>; } <span class="type">void</span> GLWindow<span class="operator">::</span>paintGL() { <span class="comment">// Now use QOpenGLExtraFunctions instead of QOpenGLFunctions as we want to</span> <span class="comment">// do more than what GL(ES) 2.0 offers.</span> <span class="type"><a href="../qtgui/qopenglextrafunctions.html">QOpenGLExtraFunctions</a></span> <span class="operator">*</span>f <span class="operator">=</span> <span class="type"><a href="../qtgui/qopenglcontext.html">QOpenGLContext</a></span><span class="operator">::</span>currentContext()<span class="operator">-</span><span class="operator">></span>extraFunctions(); f<span class="operator">-</span><span class="operator">></span>glClearColor(<span class="number">0</span><span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="number">1</span>); f<span class="operator">-</span><span class="operator">></span>glClear(GL_COLOR_BUFFER_BIT <span class="operator">|</span> GL_DEPTH_BUFFER_BIT); m_program<span class="operator">-</span><span class="operator">></span>bind(); m_texture<span class="operator">-</span><span class="operator">></span>bind(); <span class="keyword">if</span> (m_uniformsDirty) { m_uniformsDirty <span class="operator">=</span> <span class="keyword">false</span>; QMatrix4x4 camera; camera<span class="operator">.</span>lookAt(m_eye<span class="operator">,</span> m_eye <span class="operator">+</span> m_target<span class="operator">,</span> QVector3D(<span class="number">0</span><span class="operator">,</span> <span class="number">1</span><span class="operator">,</span> <span class="number">0</span>)); m_program<span class="operator">-</span><span class="operator">></span>setUniformValue(m_projMatrixLoc<span class="operator">,</span> m_proj); m_program<span class="operator">-</span><span class="operator">></span>setUniformValue(m_camMatrixLoc<span class="operator">,</span> camera); QMatrix4x4 wm <span class="operator">=</span> m_world; wm<span class="operator">.</span>rotate(m_r<span class="operator">,</span> <span class="number">1</span><span class="operator">,</span> <span class="number">1</span><span class="operator">,</span> <span class="number">0</span>); m_program<span class="operator">-</span><span class="operator">></span>setUniformValue(m_worldMatrixLoc<span class="operator">,</span> wm); QMatrix4x4 mm; mm<span class="operator">.</span>setToIdentity(); mm<span class="operator">.</span>rotate(<span class="operator">-</span>m_r2<span class="operator">,</span> <span class="number">1</span><span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="number">0</span>); m_program<span class="operator">-</span><span class="operator">></span>setUniformValue(m_myMatrixLoc<span class="operator">,</span> mm); m_program<span class="operator">-</span><span class="operator">></span>setUniformValue(m_lightPosLoc<span class="operator">,</span> QVector3D(<span class="number">0</span><span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="number">70</span>)); } <span class="comment">// Now call a function introduced in OpenGL 3.1 / OpenGL ES 3.0. We</span> <span class="comment">// requested a 3.3 or ES 3.0 context, so we know this will work.</span> f<span class="operator">-</span><span class="operator">></span>glDrawArraysInstanced(GL_TRIANGLES<span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> m_logo<span class="operator">.</span>vertexCount()<span class="operator">,</span> <span class="number">32</span> <span class="operator">*</span> <span class="number">36</span>); } </pre> </div> <!-- @@@hellogles3/glwindow.cpp --> </div> </div> </div> </div> </div> <div class="footer"> <p> <acronym title="Copyright">©</acronym> 2019 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners.<br/> The documentation provided herein is licensed under the terms of the <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation License version 1.3</a> as published by the Free Software Foundation.<br/> Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners. </p> </div> </body> </html>