Shader Attribut nur aktiv wenn es benutzt wird?

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Lichtweite
Beiträge: 16
Registriert: 24.11.2012, 06:41

Shader Attribut nur aktiv wenn es benutzt wird?

Beitrag von Lichtweite »

Hallo,

ich spiele seit ein paar Tage mit OpenGL rum und mir ist ein merkwürdiges Verhalten aufgefallen. Wenn ich mir die aktiven Attribute und Uniforms von meinem Shader anzeigen lasse, dann sind diese aktiv oder halt nicht in Abhängigkeit ob deren Verwendung auch zu einem Ergebnis im Fragment-Shader führt, also wenn ich z.B. allen Beleuchtungskram weg lasse und somit die Normals nicht wirklich zur Farbe des Pixels beitragen, dann wird dieses Attribut auch nicht von OpenGL aktiviert und ich erhalte auch eine -1 bei GetAttribLocation zurück, obwohl ich die Normals noch per in vec4 s_vNormals; im Vertex-Shader drin stehen habe.

Das ist vielleicht alles blöd beschrieben, aber kennt wer solch ein Verhalten?
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: Shader Attribut nur aktiv wenn es benutzt wird?

Beitrag von Artificial Mind »

Hallo!

Der OGL-Compiler darf in der Optimierung sämtliche Attribute und Uniforms rauswerfen (und damit die Locations auf -1 setzen) wenn diese nicht zum Endergebnis beitragen.
Insbesondere wenn du deine Lichtberechnung drin lässt aber nur ne Konstante rausschreibst, wirft der auch alles weg. Eigentlich ist das ein sehr schönes Feature.
Benutzeravatar
Ingrater
Establishment
Beiträge: 103
Registriert: 18.04.2007, 21:52

Re: Shader Attribut nur aktiv wenn es benutzt wird?

Beitrag von Ingrater »

Der shader compiler von OpenGL optimiert in der Regel alle attributes and uniforms weg die nicht zum Ergebnis beitragen, das ist normal. Wenn du erzwingen willst, dass sie auftauchen musst du "ergebnis += variable * 0.0001" oder so einbauen.
Lichtweite
Beiträge: 16
Registriert: 24.11.2012, 06:41

Re: Shader Attribut nur aktiv wenn es benutzt wird?

Beitrag von Lichtweite »

Besten Dank für die Antwort und ich habe fast einen ganzen Tag wie ein Irrer den Code debuggt :lol:
Antworten