void ShaderEffectItem::renderEffect(QPainter *painter, const QMatrix4x4 &matrix) { if (!painter || !painter->device()) return; if (!m_program.isLinked() || m_program_dirty) updateShaderProgram(); m_program.bind(); QMatrix4x4 combinedMatrix; combinedMatrix.scale(2.0 / painter->device()->width(), -2.0 / painter->device()->height(), 1.0); combinedMatrix.translate(-painter->device()->width() / 2.0, -painter->device()->height() / 2.0 ); combinedMatrix *= matrix; updateEffectState(combinedMatrix); for (int i = 0; i < m_attributeNames.size(); ++i) { m_program.enableAttributeArray(m_geometry.attributes()[i].position); } bindGeometry(); // Optimization, disable depth test when we know we don't need it. if (m_defaultVertexShader) { glDepthMask(false); glDisable(GL_DEPTH_TEST); } else { glEnable(GL_DEPTH_TEST); glDepthFunc(GL_GREATER); glDepthMask(true); #if defined(QT_OPENGL_ES) glClearDepthf(0); #else glClearDepth(0); #endif glClearColor(0, 0, 0, 0); glClear(GL_DEPTH_BUFFER_BIT); } if (m_blending){ glEnable(GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } else { glDisable(GL_BLEND); } if (m_geometry.indexCount()) glDrawElements(m_geometry.drawingMode(), m_geometry.indexCount(), m_geometry.indexType(), m_geometry.indexData()); else glDrawArrays(m_geometry.drawingMode(), 0, m_geometry.vertexCount()); glDepthMask(false); glDisable(GL_DEPTH_TEST); for (int i = 0; i < m_attributeNames.size(); ++i) m_program.disableAttributeArray(m_geometry.attributes()[i].position); }
void ShaderEffectItem::renderEffect(QPainter *painter, const QMatrix4x4 &matrix) { if (!painter || !painter->device()) return; if (!m_program || !m_program->programId()) { // Deleted due to deactivation, to save GPU memory, // or invalidated due to GL context change. delete m_program; if (QGLContext::currentContext()) m_program = new QGLShaderProgram(this); if (!m_program) qWarning() << "ShaderEffectItem::renderEffect - Creating QGLShaderProgram failed!"; } if (!m_program) return; if (!m_program->isLinked() || m_program_dirty) updateShaderProgram(); m_program->bind(); QMatrix4x4 combinedMatrix; combinedMatrix.scale(2.0 / painter->device()->width(), -2.0 / painter->device()->height(), 1.0); combinedMatrix.translate(-painter->device()->width() / 2.0, -painter->device()->height() / 2.0 ); combinedMatrix *= matrix; updateEffectState(combinedMatrix); for (int i = 0; i < m_attributeNames.size(); ++i) { m_program->enableAttributeArray(m_geometry.attributes()[i].position); } bindGeometry(); // Optimization, disable depth test when we know we don't need it. if (m_defaultVertexShader) { glDepthMask(false); glDisable(GL_DEPTH_TEST); } else { glEnable(GL_DEPTH_TEST); glDepthFunc(GL_GREATER); glDepthMask(true); #if defined(QT_OPENGL_ES) glClearDepthf(0); #else glClearDepth(0); #endif glClearColor(0, 0, 0, 0); glClear(GL_DEPTH_BUFFER_BIT); } if (m_blending) { glEnable(GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } else { glDisable(GL_BLEND); } if (m_geometry.indexCount()) glDrawElements(m_geometry.drawingMode(), m_geometry.indexCount(), m_geometry.indexType(), m_geometry.indexData()); else glDrawArrays(m_geometry.drawingMode(), 0, m_geometry.vertexCount()); glDepthMask(false); glDisable(GL_DEPTH_TEST); for (int i = 0; i < m_attributeNames.size(); ++i) m_program->disableAttributeArray(m_geometry.attributes()[i].position); }