Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 18:34

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Shader und Shaderlist
BeitragVerfasst: Mi Feb 23, 2011 17:24 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
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.

Die Klasse ist aber nur sehr bedingt getestet. :roll:


Dateianhänge:
ShaderClass.rar [3.11 KiB]
359-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader und Shaderlist
BeitragVerfasst: Mi Feb 23, 2011 20:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
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.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader und Shaderlist
BeitragVerfasst: Do Feb 24, 2011 13:00 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
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');

mehrere Files :
  g_shaderDualPeel := TShader.Create;
  g_shaderDualPeel.AddShaderFile(GL_VERTEX_SHADER,   'shade_vertex.glsl');
  g_shaderDualPeel.AddShaderFile(GL_VERTEX_SHADER,   'dual_peeling_peel_vertex.glsl');
  g_shaderDualPeel.AddShaderFile(GL_FRAGMENT_SHADER, 'shade_fragment.glsl');
  g_shaderDualPeel.AddShaderFile(GL_FRAGMENT_SHADER, 'dual_peeling_peel_fragment.glsl');
  g_shaderDualPeel.CompileShaders;
  g_shaderDualPeel.Link;


Geometryshader müßte man so auch einbinden können.


Dateianhänge:
ShaderClass.rar [3.11 KiB]
331-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader und Shaderlist
BeitragVerfasst: Do Feb 24, 2011 13:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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.
Code:
glUniform3f(shader.location(), vector.x, vector.y, vector.z)

ist halt weniger schön als
Code:
shader.uniform3f(vector);

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:

Code:
Shader* shader = Shader::get("vertexshader.vs", "fragmentshader.fs");
shader->use();
shader->uniform1i("texture", 0);
shader->uniform3f("color", 1,0,0);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader und Shaderlist
BeitragVerfasst: Do Feb 24, 2011 18:34 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
@Coolcat
Ich hab da noch mal nachgelegt.
folgende SetUniform sind möglich :
Code:
SetUniformfv(Name: AnsiString; v: PGLfloat; count: Integer);
SetUniformiv(Name: AnsiString; v: PGLint; count: Integer);
SetUniformi(Name: AnsiString; v: array of GLint);
SetUniformf(Name: AnsiString; v: array of GLfloat);
SetUniformMatrixfv(Name: AnsiString; transpose: GLboolean; v: PGLfloat; count: Integer);

Name   = String der Shader-Variable
v      = die Variable selbst
count  = die Anzahl der Variablen


Dateianhänge:
ShaderClass.rar [3.38 KiB]
362-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.020s | 15 Queries | GZIP : On ]