GLSL Shader Branching dependent Sampler = Müll ... manchmal?
Verfasst: 11.11.2011, 11:25
Hallo liebes Forum,
heute brauche ich mal wieder deine Expertise :))
Man betrachte folgenden Shader:
Wie man sehen kann wird hier abhängig von beinem uniform entweder ein TEXTURE_RECTANGLE Sample oder ein TEXTURE_2D Sampler benutzt. Das funktioniert auch ... relativ oft. Manchmal aber produziert der Shader einfach gar keinen Output, also nicht mal falsche Farben, sondern gar nix (oder alles 100 % transparent?).
In allen Testfällen ist is_tex_rect auf 0, es wird also immer der else Fall bemüht. Den Wert des uniforms habe ich mal direkt als Farbe zurückgeben lassen, der passt erwartungskonform.
Noch mysteriöser wird es, wenn man im nicht verwendeten if Fall das Sampling weglässt, also anstatt texture2DRect aufzurufen einfach direkt irgendeinen vec4 Farbwert zuweist. Dann funktioniert nämlich wieder alles.
Es scheint also ein Problem mit den unterschiedlichen Samplern in den unterschiedlichen Branches zu sein.
Nun weise ich natürlich nur entweder dem einen *oder* dem anderen Sampler eine Texturstufe zu, nämlich immer die Stufe 0. Ich verwende ja auch immer nur den einen *oder* den anderen. Nun habe ich aber aus Verzweiflung auch dem jeweils gerade nicht verwendeten Sample eine Stufe, nämlich dann jeweils 1, zugewiesen. Und siehe da, dann funktioniert es immer richtig.
Das erscheint mir jedoch etwas mystisch. Daher die Frage, ob hier jemand eine Erklärung parat hat was es damit auf sich hat. Hat man beim Branching mit verschiedenen Sampler-Typen vielleicht immer Probleme? Muss man grundsätzlich allen Samplern Stufen zuweisen auch wenn man weiss, dass man in einem Branch ist wo die Sampler nicht alle verwendet werden?
Fragen über Fragen ...
Ciao,
Stefan
heute brauche ich mal wieder deine Expertise :))
Man betrachte folgenden Shader:
Code: Alles auswählen
uniform float f;
uniform sampler2DRect tex_rc;
uniform sampler2D tex_2d;
uniform int is_tex_rect;
void main(void)
{
if (is_tex_rect > 0)
{
gl_FragData[0] = vec4(texture2DRect(tex_rc, gl_TexCoord[0].st).rgba * f);
}
else
{
gl_FragData[0] = vec4(texture2D(tex_2d, gl_TexCoord[0].st).rgba * f);
}
gl_FragData[1] = vec4(1.0);
}
In allen Testfällen ist is_tex_rect auf 0, es wird also immer der else Fall bemüht. Den Wert des uniforms habe ich mal direkt als Farbe zurückgeben lassen, der passt erwartungskonform.
Noch mysteriöser wird es, wenn man im nicht verwendeten if Fall das Sampling weglässt, also anstatt texture2DRect aufzurufen einfach direkt irgendeinen vec4 Farbwert zuweist. Dann funktioniert nämlich wieder alles.
Es scheint also ein Problem mit den unterschiedlichen Samplern in den unterschiedlichen Branches zu sein.
Nun weise ich natürlich nur entweder dem einen *oder* dem anderen Sampler eine Texturstufe zu, nämlich immer die Stufe 0. Ich verwende ja auch immer nur den einen *oder* den anderen. Nun habe ich aber aus Verzweiflung auch dem jeweils gerade nicht verwendeten Sample eine Stufe, nämlich dann jeweils 1, zugewiesen. Und siehe da, dann funktioniert es immer richtig.
Das erscheint mir jedoch etwas mystisch. Daher die Frage, ob hier jemand eine Erklärung parat hat was es damit auf sich hat. Hat man beim Branching mit verschiedenen Sampler-Typen vielleicht immer Probleme? Muss man grundsätzlich allen Samplern Stufen zuweisen auch wenn man weiss, dass man in einem Branch ist wo die Sampler nicht alle verwendet werden?
Fragen über Fragen ...
Ciao,
Stefan