GLSL Shader Branching dependent Sampler = Müll ... manchmal?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

GLSL Shader Branching dependent Sampler = Müll ... manchmal?

Beitrag von Stefan Zerbst »

Hallo liebes Forum,

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);
}
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
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: GLSL Shader Branching dependent Sampler = Müll ... manch

Beitrag von CodingCat »

Klingt nach einem Bug. Es wäre natürlich noch interessant, was genau im Fehlerfall denn nun zurückkommt. Außerdem wäre es interessant, was passiert, wenn du im unbenutzten Sampler eine andere Textur mit sofort erkennbarer Farbe setzt.

Wie sieht denn der Fehlerfall aus? Funktioniert der Shader im Fehlerfall für einzelne Pixel nicht, oder für die gesamte Ausgabe?

Der Code, den AMDs GPU ShaderAnalyzer aus dem GLSL macht, sieht jedenfalls in Ordnung aus.

Code: Alles auswählen

il_ps_2_0
dcl_input_generic_interp(linear) v0
dcl_output_generic o0
dcl_output_generic o1
dcl_resource_id(0)_type(2d)_fmtx(float)_fmty(float)_fmtz(float)_fmtw(float)
dcl_resource_id(1)_type(2d,unnorm)_fmtx(float)_fmty(float)_fmtz(float)_fmtw(float)
dcl_indexed_temp_array x0[8]
dcl_literal l2, 0x00000000, 0x00000000, 0x00000000, 0x00000000
dcl_literal l3, 0x3F800000, 0x3F800000, 0x3F800000, 0x3F800000
ilt r1.x___, l2.x, c1.x
    if_logicalnz r1.x
        sample_resource(1)_sampler(1) r2, v0.xyyy
        mul r3, r2, c0.x
        mov r4, r3
        mov x0[0], r4
    else
        sample_resource(0)_sampler(0) r5, v0.xyyy
        mul r6, r5, c0.x
        mov r7, r6
        mov x0[0], r7
    endif
mov x0[1], l3
mov o0, x0[0]
mov o1, x0[1]
endmain
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: GLSL Shader Branching dependent Sampler = Müll ... manch

Beitrag von CodingCat »

Ein reichlich abstruser Gedanke kam mir gerade noch - was passiert denn, wenn du is_tex_rect zu einem float machst, als float hereinreichst und mit 0.5f vergleichst?
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: GLSL Shader Branching dependent Sampler = Müll ... manch

Beitrag von kimmi »

Hast du das Verhalten auf verschiedenen Grafikkarten sprich Plattformen reproduzieren können? Oder tritt es nur auf deiner Kiste auf? Ich habe die Erfahrung gemacht, dass manche OpenGL-Treiber einfach Müll sind.

Gruß Kimmi
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: GLSL Shader Branching dependent Sampler = Müll ... manch

Beitrag von Stefan Zerbst »

Hi,

eine erkennbare Farbe in den unbenutzen Sampler zu stecken bringt nix, ich binde dort ja gar nicht erst eine Textur. Das will ich ja gerade vermeiden.

Im Fehlerfall sieht man keinen einzigen Pixel. Könnte aber auch sein, dass alles transparent ist :lol:

Hardware und Treiber sind egal, das tritt auf verschiedenen Plattformen auf. Allerdings benutzen wir auf den meisten Plattformen denselben Treiber. Allerdings tritt das auch unter Windows und Linux auf. Alles in allem sehr suspekt. Ich habe leider gerade nicht die Zeit, das weiter zu debuggen aber ich werde das noch mal weiter analysieren und schauen, ob da irgendwelche States komisch gesetzt sind. Es funktioniert ja trotz des Fehlers "ziemlich oft" richtig ...

Warum bin ich nicht einfach Bauer geworden? :twisted:

Falls jemand noch Erfahrungen mit so was hat, dann her damit.

Ciao,
Stefan
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: GLSL Shader Branching dependent Sampler = Müll ... manch

Beitrag von CodingCat »

Stefan Zerbst hat geschrieben:eine erkennbare Farbe in den unbenutzen Sampler zu stecken bringt nix, ich binde dort ja gar nicht erst eine Textur. Das will ich ja gerade vermeiden.
Wie jetzt, das sollte auch kein Lösungsvorschlag sein, sondern ein Versuch, den Fehler einzugrenzen. ;)
Stefan Zerbst hat geschrieben:Im Fehlerfall sieht man keinen einzigen Pixel. Könnte aber auch sein, dass alles transparent ist
Genau das könnte man damit möglicherweise herausfinden.
Stefan Zerbst hat geschrieben:Hardware und Treiber sind egal, das tritt auf verschiedenen Plattformen auf. Allerdings benutzen wir auf den meisten Plattformen denselben Treiber. Allerdings tritt das auch unter Windows und Linux auf. Alles in allem sehr suspekt. Ich habe leider gerade nicht die Zeit, das weiter zu debuggen aber ich werde das noch mal weiter analysieren und schauen, ob da irgendwelche States komisch gesetzt sind. Es funktioniert ja trotz des Fehlers "ziemlich oft" richtig
Der Zustand ist auf jeden Fall immer ein guter Kandidat. :twisted:
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: GLSL Shader Branching dependent Sampler = Müll ... manch

Beitrag von Stefan Zerbst »

CodingCat hat geschrieben:
Stefan Zerbst hat geschrieben:eine erkennbare Farbe in den unbenutzen Sampler zu stecken bringt nix, ich binde dort ja gar nicht erst eine Textur. Das will ich ja gerade vermeiden.
Wie jetzt, das sollte auch kein Lösungsvorschlag sein, sondern ein Versuch, den Fehler einzugrenzen. ;)
Schon klar, aber ich hatte ja schon geschrieben, dass alles immer funktioniert wenn ich dem unbenutzten Sampler einfach eine Texturstufe zuweise. Das hatte ich eigentlich nicht vor, weil ich ja nur den einen oder den anderen Sampler benutze. Wenn ich aber den jeweils unbenutzten an eine Stufe binde, dann funktioniert alles. Auch wenn ich den Sampler weiterhin gar nicht benutze. Das erscheint mir aber eher ein Workaround als eine vernünftige Programmierung zu sein. Daher war die Frage an euch hier, ob jemand so ein Verhalten mit quasi Branch-dependend Samplern schon mal gehabt hat.

Ich möchte ja sicherstellen, dass ich da nicht irgendeinen Workaround habe, der nur zufällig in dieser Konstellation funktioniert :)

Ciao,
Stefan
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: GLSL Shader Branching dependent Sampler = Müll ... manch

Beitrag von CodingCat »

Stefan Zerbst hat geschrieben:Schon klar, aber ich hatte ja schon geschrieben, dass alles immer funktioniert wenn ich dem unbenutzten Sampler einfach eine Texturstufe zuweise.
Sorry, ich hatte angenommen, dass du für beide Stufen zunächst die gleiche Textur gebunden hattest.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Antworten