Mehrere Texturen im Shader [solved]
Verfasst: 16.11.2012, 11:48
[EDIT] Inzwischen gelöst, Thema kann gelöscht werden oder der Nachwelt als Hinweis auf die Lösung erhalten bleiben[/EDIT]
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:
Die Theorie sollte ja ganz einfach sein. Man hat seine Texturen gebunden und muss dann den Sampler als Uniformvariable nicht die Textur ID geben sondern den Channel und die Texturid eben an diesen Channel binden (eine Tatsache, derer ich mir früher nicht bewusst war, was ziemlich ärgerlich war). Aber viel mehr sollte da ja nicht mehr zu machen sein, deshalb verstehe ich nicht, wieso es nicht geht. Der Shader ansich läuft, die Texturen sind richtig, ich kann auch ganz wunderbar alle anderen Uniforms setzen, nur eben nicht mehrere Texturen gleichzeitig...
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);
}