2016-09-28 2 views
1

Ich versuche, meinen Kopf um die folgenden zu erhalten:OpenGL - Schalter Shadern

Ich habe ein Objekt, das ich mit zwei verschiedenen Sätzen von Vertex/Fragment-Shader in der Lage sein will, zu machen, dass jeder hat ihre Uniformen und Texturen, und gehen Sie zwischen diesen beiden Einstellungen hin und her. (Ich weiß, ich in diesem Fall mit einem einheitlichen Diktieren nur einen Shader haben könnte, die Logik zu laufen, aber das ist Teil eines größeren Dings, wo ich kann das nicht)

  • Soll ich einen oder zwei gl Programme (erstellt von glCreateProgram())?
  • Wenn ich zwei Programme verwende, ist es in Ordnung, die nicht verwendete Datei zu verwerfen und sie später neu zu erstellen? Oder ist es zu langsam?
  • Wenn ich nur ein Programm verwenden:
    • kann ich Shadern nur einmal am Anfang kompilieren?
    • sollte ich beim Wechsel alte Shader abtrennen, neue anhängen und das Programm erneut verlinken?
    • sollte ich alle Uniformen nach der Verknüpfung neu berechnen?
    • sollte ich Array-Puffer nach der Verknüpfung erneut binden?
    • sollte ich etwas tun, um zuvor angefügte Texturen zu entfernen?
+0

Erstellen und Shadern Verknüpfung ist usally ein sehr langsamer Vorgang. Ich würde empfehlen, am Anfang einfach zwei Programme zu erstellen und diese bei Bedarf zu verwenden. Für weitere Informationen müssten Sie weitere Details zu Ihrem Nutzungsszenario angeben. Zum Beispiel, wie oft der Shader geändert werden muss. – BDL

Antwort

3

Sollte ich ein oder zwei gl Programme (erstellt von glCreateProgram())?

Kommt auf den Fall an. Eine allgemeine Regel könnte eine Verzweigung innerhalb des Shader-Codes vermeiden. Wenn Sie also 2 verschiedene Shader für 2 verschiedene Effekte haben, kompilieren Sie einfach 2 Programme und binden Sie das gewünschte.

Wenn ich zwei Programme verwenden, ist es in Ordnung, den man zu verwerfen, nicht verwendet wird, und es wieder aufzubauen, wenn später brauchen? Oder ist es zu langsam?

Dies ist im Allgemeinen nicht erforderlich und falsch (möglicherweise, wenn Sie große Speicherprobleme haben). Die Shader-Kompilierung ist ein langsamer Prozess.

Es ist üblicher, alle erforderlichen Ressourcen einmal beim Start der Anwendung oder zum ersten Mal zu kompilieren und sie zugewiesen und einsatzbereit zu lassen.

Kann ich Shader nur einmal am Anfang kompilieren?

Ja.

Für alle verbleibenden Fragen: Ich denke, Sie sind der falsche Ansatz.

Ich würde sagen:

  • Compile alle Shader-Varianten am Anfang (oder, wenn Sie benötigen ein Programm)
  • Bind einen Shader und die relativen Ressourcen, Satz Uniformen, bevor sie mit diesem Shader Zeichnung.
  • Wenn Änderung Shader, Wieder binden die Ressourcen oder einheitliche Werte nur aktualisieren, wenn unterschiedliche und am Ende der Anwendung
  • Freigabe Ressourcen und Programme benötigt
+0

Ich rende die Videoausgabe an mein Objekt, deshalb mache ich mir ein bisschen Sorgen über die Verwendung zu vieler Ressourcen, wenn ich die Textur im nicht verwendeten Programm nicht freigebe. Doest das klingt wie eine legitime Sorge? Danke für all die anderen Kommentare! – Guig

+1

Speicher, der von Textur verwendet wird, hat nichts mit dem Shader-Programm selbst zu tun. – Heisenbug

+0

Ok, aber wenn ich die beiden Programme baue, benutze die erste, befestige eine Textur, wechsle zu den zweiten Programmen, befestige eine andere Textur, verwende ich Speicher für die erste Textur, die im Programm angehängt ist, die nicht benutzt wird? oder ist die Textur unabhängig vom Programmkontext? – Guig