void Renderer::render() { QMutexLocker locker(&m_windowLock); if (m_windows.isEmpty()) return; HelloWindow *surface = m_windows.at(m_currentWindow); QColor color = surface->color(); m_currentWindow = (m_currentWindow + 1) % m_windows.size(); if (!m_context->makeCurrent(surface)) return; QSize viewSize = surface->size(); locker.unlock(); if (!m_initialized) { initialize(); m_initialized = true; } QOpenGLFunctions *f = m_context->functions(); f->glViewport(0, 0, viewSize.width() * surface->devicePixelRatio(), viewSize.height() * surface->devicePixelRatio()); f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); f->glClearColor(m_backgroundColor.redF(), m_backgroundColor.greenF(), m_backgroundColor.blueF(), m_backgroundColor.alphaF()); f->glFrontFace(GL_CW); f->glCullFace(GL_FRONT); f->glEnable(GL_CULL_FACE); f->glEnable(GL_DEPTH_TEST); m_program->bind(); m_vbo.bind(); m_program->enableAttributeArray(vertexAttr); m_program->enableAttributeArray(normalAttr); m_program->setAttributeBuffer(vertexAttr, GL_FLOAT, 0, 3); const int verticesSize = vertices.count() * 3 * sizeof(GLfloat); m_program->setAttributeBuffer(normalAttr, GL_FLOAT, verticesSize, 3); QMatrix4x4 modelview; modelview.rotate(m_fAngle, 0.0f, 1.0f, 0.0f); modelview.rotate(m_fAngle, 1.0f, 0.0f, 0.0f); modelview.rotate(m_fAngle, 0.0f, 0.0f, 1.0f); modelview.translate(0.0f, -0.2f, 0.0f); m_program->setUniformValue(matrixUniform, modelview); m_program->setUniformValue(colorUniform, color); m_context->functions()->glDrawArrays(GL_TRIANGLES, 0, vertices.size()); m_context->swapBuffers(surface); m_fAngle += 1.0f; QTimer::singleShot(0, this, SLOT(render())); }
void QtRenderer::initialize() { QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this); vshader->compileSourceCode( "attribute highp vec4 vertex;" "attribute mediump vec3 normal;" "uniform mediump mat4 matrix;" "uniform lowp vec4 sourceColor;" "varying mediump vec4 color;" "void main(void)" "{" " vec3 toLight = normalize(vec3(0.0, 0.3, 1.0));" " float angle = max(dot(normal, toLight), 0.0);" " vec3 col = sourceColor.rgb;" " color = vec4(col * 0.2 + col * 0.8 * angle, 1.0);" " color = clamp(color, 0.0, 1.0);" " gl_Position = matrix * vertex;" "}"); QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this); fshader->compileSourceCode( "varying mediump vec4 color;" "void main(void)" "{" " gl_FragColor = color;" "}"); m_program = new QOpenGLShaderProgram(this); m_program->addShader(vshader); m_program->addShader(fshader); m_program->link(); m_program->bind(); vertexAttr = m_program->attributeLocation("vertex"); normalAttr = m_program->attributeLocation("normal"); matrixUniform = m_program->uniformLocation("matrix"); colorUniform = m_program->uniformLocation("sourceColor"); m_fAngle = 0; createGeometry(); m_vbo.create(); m_vbo.bind(); const int verticesSize = vertices.count() * 3 * sizeof(GLfloat); m_vbo.allocate(verticesSize * 2); m_vbo.write(0, vertices.constData(), verticesSize); m_vbo.write(verticesSize, normals.constData(), verticesSize); QOpenGLFunctions *f = m_context->functions(); f->glClearColor(0.1f, 0.1f, 0.2f, 1.0f); f->glFrontFace(GL_CW); f->glCullFace(GL_FRONT); f->glEnable(GL_CULL_FACE); f->glEnable(GL_DEPTH_TEST); m_program->enableAttributeArray(vertexAttr); m_program->enableAttributeArray(normalAttr); m_program->setAttributeBuffer(vertexAttr, GL_FLOAT, 0, 3); m_program->setAttributeBuffer(normalAttr, GL_FLOAT, verticesSize, 3); }
void Renderer::render() { QMutexLocker locker(&m_windowLock); if (m_windows.isEmpty()) return; HelloWindow *surface = m_windows.at(m_currentWindow); QColor color = surface->color(); m_currentWindow = (m_currentWindow + 1) % m_windows.size(); if (!m_context->makeCurrent(surface)) return; QSize viewSize = surface->size(); locker.unlock(); if (!m_initialized) { initialize(); m_initialized = true; } QOpenGLFunctions *f = m_context->functions(); f->glViewport(0, 0, viewSize.width() * surface->devicePixelRatio(), viewSize.height() * surface->devicePixelRatio()); f->glClearColor(0.1f, 0.1f, 0.2f, 1.0f); f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); f->glFrontFace(GL_CW); f->glCullFace(GL_FRONT); f->glEnable(GL_CULL_FACE); f->glEnable(GL_DEPTH_TEST); QMatrix4x4 modelview; modelview.rotate(m_fAngle, 0.0f, 1.0f, 0.0f); modelview.rotate(m_fAngle, 1.0f, 0.0f, 0.0f); modelview.rotate(m_fAngle, 0.0f, 0.0f, 1.0f); modelview.translate(0.0f, -0.2f, 0.0f); m_program->bind(); m_program->setUniformValue(matrixUniform, modelview); m_program->setUniformValue(colorUniform, color); paintQtLogo(); m_program->release(); f->glDisable(GL_DEPTH_TEST); f->glDisable(GL_CULL_FACE); m_context->swapBuffers(surface); m_fAngle += 1.0f; QTimer::singleShot(0, this, SLOT(render())); }
void CompasWidget::paintGL(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); m_world.setToIdentity(); m_world.rotate(180.0f - (m_xRot / 16.0f), 1, 0, 0); m_world.rotate(m_yRot / 16.0f, 0, 1, 0); m_world.rotate(m_zRot / 16.0f, 0, 0, 1); /* QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao); m_program->bind(); m_program->setUniformValue(m_projMatrixLoc, m_proj); m_program->setUniformValue(m_mvMatrixLoc, m_camera * m_world); QMatrix3x3 normalMatrix = m_world.normalMatrix(); m_program->setUniformValue(m_normalMatrixLoc, normalMatrix); glDrawArrays(GL_TRIANGLES, 0, m_logo.vertexCount()); m_program->release(); */ QOpenGLFunctions *f = context()->functions(); const bool newFrameReady=true; if (newFrameReady) {//new frame ready f->glFrontFace(GL_CW); // because our cube's vertex data is such f->glBindTexture(GL_TEXTURE_2D, m_fbo2->texture()); m_program2->bind(); QOpenGLVertexArrayObject::Binder vaoBinder(m_vao2); // If VAOs are not supported, set the vertex attributes every time. if (!m_vao2->isCreated()){ setupVertexAttribs2(); } static GLfloat angle = 0; QMatrix4x4 m; m.translate(0, 0, -20); m.rotate(90, 0, 0, 1); m.rotate(angle, 0.5, 1, 0); angle += 0.5f; m_program2->setUniformValue(m_matrixLoc, m_proj * m); // Draw the cube. f->glDrawArrays(GL_TRIANGLES, 0, 36); m_program2->release(); } }