Shader is created in inicializeGL funktion:
shaderProgram = new QGLShaderProgram(context());
shaderProgram->addShaderFromSourceFile(QGLShader::Vertex,"../phong.vert");
shaderProgram->addShaderFromSourceFile(QGLShader::Fragment,"../phong.frag");
shaderProgram->link();
shaderProgram = new QGLShaderProgram(context());
shaderProgram->addShaderFromSourceFile(QGLShader::Vertex,"../phong.vert");
shaderProgram->addShaderFromSourceFile(QGLShader::Fragment,"../phong.frag");
shaderProgram->link();
To copy to clipboard, switch view to plain text mode
shaderProgram is a private QGLShaderProgram.
This is what every instantiation of GLWidget calls.
I also have buttons to change between visualisations. Here the slots(in GLWidget)
void GLWidget::setWireframe()
{
shaderProgram->release();
//glEnable(GL_LIGHTING);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
activateShader =false;
scene->activateShader(currentPrimitive,false);
updateGL();
}
void GLWidget::setFlat()
{
shaderProgram->release();
//glEnable(GL_LIGHTING);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glShadeModel(GL_FLAT);
activateShader =false;
scene->activateShader(currentPrimitive,false);
updateGL();
}
void GLWidget::setGouraud()
{
shaderProgram->release();
//glEnable(GL_LIGHTING);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glShadeModel(GL_SMOOTH);
activateShader =false;
scene->activateShader(currentPrimitive,false);
updateGL();
}
void GLWidget::setPhong()
{
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
shaderProgram->bind();
activateShader =true;
scene->activateShader(currentPrimitive,true);
updateGL();
}
void GLWidget::setWireframe()
{
shaderProgram->release();
//glEnable(GL_LIGHTING);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
activateShader =false;
scene->activateShader(currentPrimitive,false);
updateGL();
}
void GLWidget::setFlat()
{
shaderProgram->release();
//glEnable(GL_LIGHTING);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glShadeModel(GL_FLAT);
activateShader =false;
scene->activateShader(currentPrimitive,false);
updateGL();
}
void GLWidget::setGouraud()
{
shaderProgram->release();
//glEnable(GL_LIGHTING);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glShadeModel(GL_SMOOTH);
activateShader =false;
scene->activateShader(currentPrimitive,false);
updateGL();
}
void GLWidget::setPhong()
{
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
shaderProgram->bind();
activateShader =true;
scene->activateShader(currentPrimitive,true);
updateGL();
}
To copy to clipboard, switch view to plain text mode
So these are the bind that through the Warning:
QGLShaderProgram::bind: program is not valid in the current context.
What do you mean with different shader for each widget?
Thanks very much for answering!
Elbe
Bookmarks