Ich habe eine Qt-Anwendung die in einem glWidget per Shader mehrere Texturen kombinieren soll. Das funktioniert auch alles soweit ganz gut, aber sobald ich mehrere Texutren benutzen will, stimmen die Werte aus den Samplern nicht, ich sehe immer nur die zuletzt gebundene Textur.
[EDIT] Code im zweiten Post vereinfacht und stark verkürzt, den alten lass ich nur als Referenz hier stehen [/EDIT]
Hier mal Code:
Code: Alles auswählen
uniform sampler2D Clusters;
uniform sampler2D OriginalImage;
uniform bool ShowC1;
uniform bool ShowC2;
varying vec2 vTextureCoord;
void main(void)
{
if(ShowC1)
gl_FragColor = vec4(texture2D(Clusters, vTextureCoord).rrr, 0.5);
else
gl_FragColor = vec4(texture2D(OriginalImage, vTextureCoord).rrr, 0.5);
Code: Alles auswählen
void MainWindow::on_StartClustering()
{
//m_OutputWidget->makeCurrent();
//Load the Shader
//well, it would be better to do this just once, but we can't do it in the ctor
m_OutputWidget->SetShaderSourceFile(":/Shader/Shader.vert", ":/Shader/Shader.frag");
m_OutputWidget->Shader()->setUniformValue("ShowC1", true);
m_OutputWidget->Shader()->setUniformValue("ShowC2", true);
m_OutputWidget->SetTexture(msi::OpenGL::CreateTexture(m_InputImage[0]), 1);
m_OutputWidget->SetTexture(msi::OpenGL::CreateTexture(kMeansClustering(m_InputImage)), 0);
//m_OutputWidget->Shader()->setUniformValue("Clusters", 0);
//m_OutputWidget->Shader()->setUniformValue("OriginalImage", 1);
cout << "Locations: " << m_OutputWidget->Shader()->uniformLocation("Clusters") << " " << m_OutputWidget->Shader()->uniformLocation("OriginalImage") << endl;
glUniform1i(m_OutputWidget->Shader()->uniformLocation("Clusters"), 0);
glUniform1i(m_OutputWidget->Shader()->uniformLocation("OriginalImage"), 1);
m_OutputWidget->updateGL();
}
Code: Alles auswählen
void ShaderWidget::SetShaderSourceFile(QString VertexSource, QString FragmentSource)
{
m_Shader->removeAllShaders();
if(!m_Shader->addShaderFromSourceCode(QGLShader::Vertex, VertexSource)) ...
if(!m_Shader->addShaderFromSourceCode(QGLShader::Fragment, FragmentSource)) ...
if(!m_Shader->link()) ...
if(!m_Shader->bind()) ...
}
void ShaderWidget::SetTexture(GLuint Texture, int Channel)
{
m_Textures[Channel]=Texture;
glActiveTexture(GL_TEXTURE0+Channel);
glBindTexture(GL_TEXTURE_2D, Texture);
}