Ich fange gerade an, mich mit Shadern zu beschäftigen, deshalb habe ich eine Shader-Klasse gesucht und hier gefunden. Und ich habe mich daran gemacht sie etwas aufzubessern. Das Ergebnis hängt hier als rar dran. Ein kurzer Kommentar dazu wäre nett.
Das sieht doch viel besser aus als mein letztes Posting vorallem die Fehlerbehandlung ist besser. Was mir bei meinen Programmen aufgefallen ist, wäre, dass man die ProgrammID als property-read public machen sollte, da man sie öfters zum setzen von Uniforms braucht. Du solltest auch bei GetLastError, den ausgegebenen Fehler aus der Liste löschen, da du sonst immer den gleichen Fehler bekommst.
Edit: Die Versionen von UnUseShader brauchst du nicht weil, dort am Ende immer glUseProgramm(0) aufgerufen wird. Bei UseShader kannst du auch immer nur ein Programm gebunden haben, sodass das Array nicht nötig ist.
Trotzdem sieht es viel besser aus als meine Version.
Danke für Dein Lob. Die Kritik habe ich umgesetzt. Die ShaderClass habe ich deshalb umgebaut, weil ich versuche ein NVidia-Shadersatz zum Laufen zu bekommen und die teilen die jeweiligen Shader in mehrere Files auf. Es gibt pro Shaderprogramm je 2 Vertex- und Fragmentshaderfiles. Ich mache hier mal ein Beispiel wie das jetzt geht :
Code:
Standard : g_shaderDualInit := TShader.Create('init_vertex.glsl', 'init_fragment.glsl');
Was mir bei meinen Programmen aufgefallen ist, wäre, dass man die ProgrammID als property-read public machen sollte, da man sie öfters zum setzen von Uniforms braucht.
In meiner Shaderklasse (C++) habe ich Methoden zum setzen von Uniforms. Dies hat drei Vorteile: 1. Du kannst Methoden zum setzen von Vektoren anbieten...also direkte Zusammenarbeit mit der Mathe-Lib.
2. Du kannst einen Test einbauen der prüft ob der entsprechende Shader überhaupt gebunden ist. So passiert einem nicht mehr der Fehler bei dem man Uniforms setzt ohne das der Shader gebunden ist. Diesen Test kann man bei mir mittels Compiler-Switch abstellen, so das er nur bei Bedarf aktiv ist. 3. Manchmal ist es praktisch wenn man direkt über einen String auf die Uniform zugreifen kann, also ohne vorher die Location zu erfragen. (z.B. wenn man Uniforms nur einmal bei initialisierung setzt)
An die Objekt-ID des Shaders kommt man bei mir gar nicht heran. Zudem sind natürlich alle Methoden "inline" deklariert, also es gibt keinen Performance-Nachteil.
Des weiteren gibt es bei mir eine globale Shader-Verwaltung. D.h. für jede Kombination von Vertex- und Fragmentshader wird nur ein Program-Objekt erzeugt, auch wenn der gleiche Shader mehrfach benutzt wird. Die Nutzung sieht ungefähr so aus:
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.