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

Aktuelle Zeit: Mo Apr 06, 2020 21:31

Foren-Übersicht » Sonstiges » Meinungen zu den Projekten
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 44 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3
Autor Nachricht
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: Di Okt 13, 2015 19:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1212
Programmiersprache: Delphi/FPC
Hey,
habe fertig :mrgreen: Klick mich

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: Di Okt 13, 2015 20:07 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 196
Habe ich schon auf Delphipraxis gesehen. Dann kann ich nä WoEnde mein Shaderprogramm weiter optimieren. Mal sehen, was dabei rauskommt...

P.S.: Ich glaub, bei Delphipraxis solltest Du Dein Tool auch in dem Projekte-Bereich posten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: Fr Okt 16, 2015 22:21 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 196
Habe Dein Beispiel mal so abgeändert, wie ich mir das für mich vorstelle. Das Programm funktioniert schon mal. Was etwas stört -weiss nicht, ob man das ändern kann oder sollte-, dass die Variablenwerte wie "false", "vec4" usw dort im Text mit 2 Apostrophe geschrieben werden.


Code:
  1. program example;
  2.  
  3.  
  4. {$APPTYPE CONSOLE}
  5.  
  6. uses
  7.   SysUtils, Classes,
  8.   ulibShaderFile;
  9.  
  10. type
  11.   TFileReader = class(TInterfacedObject, IlsfFileReader)
  12.   public
  13.     function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  14.   end;
  15.  
  16. var
  17.   i         : Integer;
  18.   ShaderFile: TlsfShaderFile;
  19.   Generator : TlsfGenerator;
  20.   Pfad      : string;
  21.   SHDKlasse : string;
  22.  
  23. procedure GetShaderCode(s: TStream);
  24. var
  25.   SL: TStringList;
  26. begin
  27.   SL := TStringList.Create;
  28.   try
  29.     SL.Add('{$CLASS Color}');
  30.     SL.Add('    {$PROPERTY UseColorMap ''false''}');
  31.     SL.Add('{$END}');
  32.  
  33.     SL.Add('{$CLASS ColorFrag $EXTENDS Color}');
  34.  
  35.     SL.Add('    /* you can also define code here. It will be added when the code for the class is generated */');
  36.  
  37.     SL.Add('    {$FUNC ''vec4'' GetColor $INLINE}');
  38.     SL.Add('        {$IF UseColorMap}');
  39.     SL.Add('            {$VAR ''vec2'' ''_texCoord'' ''gl_TexCoord[0].st''}');
  40.     SL.Add('            {$UNIFORM ''sampler2D'' ''uColorMap''}');
  41.     SL.Add('            return texture2D(uColorMap, _texCoord);');
  42.     SL.Add('        {$ELSE}');
  43.     SL.Add('            return gl_Color;');
  44.     SL.Add('        {$END}');
  45.     SL.Add('    {$END}');
  46.  
  47.     SL.Add('    {$MAIN}');
  48.     SL.Add('        gl_FragColor = {$CALL GetColor};');
  49.     SL.Add('    {$END}');
  50.     SL.Add('{$END}');
  51.  
  52.     SL.Add('{$CLASS ColorVert $EXTENDS Color}');
  53.     SL.Add('    {$MAIN}');
  54.     SL.Add('        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;');
  55.     SL.Add('        {$IF UseColorMap}');
  56.     SL.Add('            gl_TexCoord[0] = gl_MultiTexCoord0;');
  57.     SL.Add('        {$ELSE}');
  58.     SL.Add('            gl_FrontColor = gl_Color;');
  59.     SL.Add('            gl_BackColor  = gl_Color;');
  60.     SL.Add('        {$END}');
  61.     SL.Add('    {$END}');
  62.     SL.Add('{$END}');
  63.     SL.SaveToStream(s);
  64.   finally
  65.     SL.Free;
  66.   end;
  67. end;
  68.  
  69. function TFileReader.LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  70. var
  71.   Stream: TMemoryStream;
  72. begin
  73.   Stream := TMemoryStream.Create;
  74.   try
  75.     GetShaderCode(Stream);
  76.     aStream.CopyFrom(Stream, 0);
  77.     result := true;
  78.   finally
  79.     Stream.Free;
  80.   end;
  81. end;
  82.  
  83. begin
  84.   Pfad      := ExtractFilePath(ParamStr(0));
  85.   SHDKlasse := 'ColorVert';
  86.   lsf_init(Pfad + '..\..\..\libShaderFile-i386-win32.dll');
  87.   try
  88.     ShaderFile := TlsfShaderFile.Create;
  89.     try
  90.       ShaderFile.LoadFromFunc('', TFileReader.Create);
  91.       Generator := TlsfGenerator.Create(ShaderFile, SHDKlasse);
  92.       try
  93.         WriteLn(Generator.GenerateCode);
  94.         Readln;
  95.       finally
  96.         FreeAndNil(Generator);
  97.       end;
  98.     finally
  99.       FreeAndNil(ShaderFile);
  100.     end;
  101.   except
  102.     on e: Exception do
  103.     begin
  104.       WriteLn('error: ' + e.Message);
  105.       ExitCode := 2;
  106.     end;
  107.   end;
  108.   lsf_finish;
  109.  
  110. end.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: Sa Okt 17, 2015 02:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1212
Programmiersprache: Delphi/FPC
Hey,

wenn du den Code wirklich so im Programm einbinden willst würd ich dir eher zu ner eingebetteten Resource raten. Die kannst du dann direkt über TStream laden und must dir auch keine Gedanken über das escaping machen. Andere Möglichkeit um dein Problem zu umgehen: Nimm " anstatt ', mach am Ende ein StringReplace und ersetze alle " gegen '. Das ' ist zwar im Library Code nur eine Konstante und kann fix ausgetauscht werden, aber dann müsste ich 2 Versionen pflegen :?

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: Sa Okt 17, 2015 14:13 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 196
Zitat:
Das ' ist zwar im Library Code nur eine Konstante und kann fix ausgetauscht werden, aber dann müsste ich 2 Versionen pflegen
Nee, das ist bei mir auch nur eine Kleinigkeit. Diese Art den Shader abzulegen, habe ich aus glScene. Das ist auch etwas komisch, aber bis jetzt habe ich noch keine Variante gefunden, die genauso einfach und übersichtlich ist. Mit Deinem PreCompiler möchte ich das ja vereinfachen.
Ich brauche nur diesen DDP-Shader verwalten, der eigentlich aus mehreren kleinen Codeteilen besteht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: Sa Okt 17, 2015 14:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1212
Programmiersprache: Delphi/FPC
Hey,

wie gesagt: leg dir den ShaderCode in ne TextDatein in dein Projekt-Ordner. Dann fügst du in Delphi ein Pre-Build-Script ein, welches die Text-Datei in eine Resource-Datei rein packt und die wird dann beim Compilieren mit in die EXE gelinkt. Mit den entsprechenden Klassen kannst du die Resource dann im Programm öffnen und in den Stream übertragen. Ist zwar erstmal n bischen aufwand die Scripte und Resourcen zu erstellen, aber wenn das einma steht, dann ist das meiner Meinung nach die sauberste Lösung.
Das ist so der grobe Weg. Wie genau das alles in Delphi geht und wo du was eintragen musst kann ich dir leider nicht sagen. Ich hab Delphi ewig nich mehr genutzt.

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: So Okt 18, 2015 14:57 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 196
Hier noch eine mögliche Erweiterung für de Shaderfile:

Code:
  1.  TParameter = TPair<string, Variant>;
  2.  
  3.  TlsfShaderFile = class(ulibShaderFile.TlsfShaderFile)
  4.   private type
  5.     TFileReader = class(TInterfacedObject, IlsfFileReader)
  6.     private
  7.       FText: string;
  8.     public
  9.       constructor Create(AText: string);
  10.       function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  11.     end;
  12.   private
  13.     function LoadShaderTextFromResource(const AResID: Integer): string;
  14.   public
  15.     procedure LoadFromText(const AText: string);
  16.     procedure LoadFromResource(const AResID: Integer);
  17.     function GetShader(ShaderName: string; Parameter: TArray<TParameter>): string;
  18.   end;
  19.  
  20. constructor TlsfShaderFile.TFileReader.Create(AText: string);
  21. begin
  22.   inherited Create;
  23.   FText := AText;
  24. end;
  25.  
  26. function TlsfShaderFile.TFileReader.LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  27. var
  28.   Stream: TStringStream;
  29. begin
  30.   Stream := TStringStream.Create(FText);
  31.   try
  32.     aStream.CopyFrom(Stream, 0);
  33.     Result := true;
  34.   finally
  35.     Stream.Free;
  36.   end;
  37. end;
  38.  
  39. procedure TlsfShaderFile.LoadFromText(const AText: string);
  40. var
  41.   FR: TFileReader;
  42. begin
  43.   FR := TFileReader.Create(AText);
  44.   try
  45.     LoadFromFunc('', FR);
  46.   finally
  47.     FR.Free;
  48.   end;
  49. end;
  50.  
  51. procedure TlsfShaderFile.LoadFromResource(const AResID: Integer);
  52. begin
  53.   LoadFromText(LoadShaderTextFromResource(AResID));
  54. end;
  55.  
  56. function TlsfShaderFile.GetShader(ShaderName: string; Parameter: TArray<TParameter>): string;
  57. var
  58.   Generator: TlsfGenerator;
  59.   iPara    : TParameter;
  60. begin
  61.   Generator := TlsfGenerator.Create(ShaderFile, ShaderName);
  62.   try
  63.     for iPara in Parameter do
  64.       Generator.SetProperty(iPara.Key, iPara.Value);
  65.     Result := Generator.GenerateCode;
  66.   finally
  67.     Generator.Free;
  68.   end;
  69. end;
  70.  
  71. function TlsfShaderFile.LoadShaderTextFromResource(const AResID: Integer): string;
  72. var
  73.   RS  : TResourceStream;
  74.   Code: TStringList;
  75. begin
  76.   RS := TResourceStream.CreateFromID(HInstance, AResID, RT_RCDATA);
  77.   try
  78.     Code := TStringList.Create;
  79.     try
  80.       Code.LoadFromStream(RS);
  81.       Result := Code.Text;
  82.     finally
  83.       Code.Free
  84.     end;
  85.   finally
  86.     RS.Free;
  87.   end;
  88. end;
  89.  



Könnte man nicht im Header die DLL definieren und die DLL für 32 und 64 per Direktive trennen,
dann würdest Du vielleicht auch eine Zip sparen? :

Code:
  1. initialization
  2.   {$IFDEF WIN32}
  3.     lsf_init(ExtractFilePath(ParamStr(0)) + 'libShaderFile-i386-win32.dll');
  4.   {$ENDIF}
  5.   {$IFDEF WIN64}
  6.     lsf_init(ExtractFilePath(ParamStr(0)) + 'libShaderFile-x86_64-win64.dll');
  7.   {$ENDIF}
  8.  
  9. finalization
  10.   lsf_finish;


Zuletzt geändert von Jens01 am So Nov 01, 2015 14:46, insgesamt 4-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: So Okt 18, 2015 15:09 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 196
So...
Ich habe Deinen Rat befolgt und den Shader per Resource-File integriert, dazu habe ich mir ein kleines Tool (siehe DelphiDabbler) gebastelt.

Kleine Probleme hatte ich, weil ich anfangs nach einem älteren Blogeintrag auf "muo-game.de" gearbeitet habe und sich sowas wie "Attrib" und "Property" geändert hat. Die Doku könnte etwas genauer sein. So ganz weiss man nicht wofür diese Tags alle stehen und welche Werte man ihnen zuordnen kann. Z.B. Was kann ein Property alles sein (mit reichte allerdings Boolean aus).

Ansonsten würde ich sagen ist Dein PreCompiler ein sehr geiles Tool und für mich ist das das Produkt des Monats!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: So Okt 25, 2015 14:40 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 196
Hallo Bergmann,

gerade ist bei mir etwas aufgetaucht, das nach einem Bug aussieht.
Wenn ich im Shadertext die $PROPERTY mit 'false' voreinstelle, muss man diese $PROPERTY im Generator mit SetProperty dennoch einstellen?
Ich habe im Shadertext 3 Properties gleichzeitig untereinander, alle auf 'false' voreingestellt. Ich stelle immer nur eine Property auf true. Wenn ich im Generator dann nur eine Property auf true einstelle und die anderen nicht anspreche, dann gibt er den Shadercode falsch zurück.
Wenn ich alle 3 per SetProperty richtig (true,false,false) im Generator einstelle, ist der Code richtig.

Schönen Sonntag
Jens


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: So Okt 25, 2015 16:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1212
Programmiersprache: Delphi/FPC
Hey,

schick mir mal bitte den Shader-Code, die genauen Namen und Werte der Properties sowie den Shader-Code den du als Ergebnis erwartest, dann debug ich da mal durch.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: Sa Okt 31, 2015 13:13 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 196
Hast Du was besonderes an dem neuen Shaderfile geändert, der gibt jetzt nichts! mehr zurück.
Sprich das Ding funktioniert irgendwie gar nicht mehr...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: Sa Okt 31, 2015 14:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1212
Programmiersprache: Delphi/FPC
Ups, ja ich hab ne extra Klasse für den Generator geschrieben, weil die Lib intern bisl anders arbeitet. Die neue Klasse wird jetzt für den Generator aus der Lib genutzt und da hab ich vergessen das result zuzuweisen :P
Hab die Links aktualisiert. Ich mach jetzt aber nich extra nen Posting im Projekt-Thread dafür.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: Sa Okt 31, 2015 17:41 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 196
Läuft...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glsl PreCompiler
BeitragVerfasst: So Nov 01, 2015 15:29 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 196
Hier noch mein ShaderEditor. Guck mal. ob er funktioniert.
Kann ihn leider nicht OpenSource stellen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 44 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3
Foren-Übersicht » Sonstiges » Meinungen zu den Projekten


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 57 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.174s | 15 Queries | GZIP : On ]