void setFragmentShader(const QByteArray &code) { if (!m_frag) m_frag = addShaderFromSourceCode(QOpenGLShader::Fragment, code); }
void setVertexShader(const QByteArray &code) { if (!m_vertex) { m_vertex = addShaderFromSourceCode(QOpenGLShader::Vertex, code); m_hasColor = code.contains("vColor"); } }
void Z3DShaderProgram::loadFromSourceCode(const QStringList &vertSrcs, const QStringList &geomSrcs, const QStringList &fragSrcs, const QString &header) { removeAllShaders(); for (int i=0; i<vertSrcs.size(); ++i) { QString vertSrc = header + vertSrcs[i]; #ifdef _QT5_ if (!addShaderFromSourceCode(QOpenGLShader::Vertex, vertSrc)) { #else if (!addShaderFromSourceCode(QGLShader::Vertex, vertSrc)) { #endif LDEBUG() << vertSrc; throw Exception("Can not compile vertex shader. Error log: " + log().toStdString()); } } for (int i=0; i<geomSrcs.size(); ++i) { QString geomSrc = header + geomSrcs[i]; #ifdef _QT5_ if (!addShaderFromSourceCode(QOpenGLShader::Geometry, geomSrc)) { #else if (!addShaderFromSourceCode(QGLShader::Geometry, geomSrc)) { #endif LDEBUG() << geomSrc; throw Exception("Can not compile geometry shader. Error log: " + log().toStdString()); } } for (int i=0; i<fragSrcs.size(); ++i) { QString fragSrc = header + fragSrcs[i]; #ifdef _QT5_ if (!addShaderFromSourceCode(QOpenGLShader::Fragment, fragSrc)) { #else if (!addShaderFromSourceCode(QGLShader::Fragment, fragSrc)) { #endif LDEBUG() << fragSrc; throw Exception("Can not compile fragment shader. Error log: " + log().toStdString()); } } if (!link()) { throw Exception("Can not link shader. Error log: " + log().toStdString()); } } void Z3DShaderProgram::loadFromSourceCode(const QStringList &vertSrcs, const QStringList &fragSrcs, const QString &header) { loadFromSourceCode(vertSrcs, QStringList(), fragSrcs, header); } void Z3DShaderProgram::setHeaderAndRebuild(const QString &header) { loadFromSourceCode(m_vertSrcs, m_geomSrcs, m_fragSrcs, header); } GLint Z3DShaderProgram::getUniformLocation(const QString &name) { GLint l = uniformLocation(name); if (l == -1 && logUniformLocationError()) { LWARN() << "Failed to locate uniform:" << name; } return l; }