DGL
https://delphigl.com/forum/

glsl fehler
https://delphigl.com/forum/viewtopic.php?f=20&t=10187
Seite 1 von 1

Autor:  sirrk [ Mi Nov 30, 2011 17:22 ]
Betreff des Beitrags:  glsl fehler

yo, grad ma am shader ausprobieren.

was soll folgende fehlermeldung bedeuten?

Zitat:
Vertex shader was successfully compiled to run on hardware.

Fragment shader was successfully compiled to run on hardware.

Vertex shader(s) failed to link, fragment shader(s) failed to link.
ERROR: error(#280) Not all shaders have valid object code
ERROR: error(#280) Not all shaders have valid object code


ausgelesen direkt nachm compilieren bzw linken (von oben ach unten vertex,fragment,programm)

bin etwas verwirrt, ich dachte beide shader seien successfully compiled :S

ich bin streng nach tutorial vorgegangen und hab verschiedene shader auprobiert.

Autor:  mrtrain [ Mi Nov 30, 2011 17:38 ]
Betreff des Beitrags:  Re: glsl fehler

Kompilieren ist ja nicht das gleiche wie Linken. :)
Zeig doch mal deinen Code von glCreateProgram bis glLinkProgram, bzw. überprüfe mal, ob nicht eines der Handles für Shader / Porgram den Wert 0 hat.

Autor:  sirrk [ Mi Nov 30, 2011 17:54 ]
Betreff des Beitrags:  Re: glsl fehler

Code:
  1. var oStringList: TStringList;
  2.     ShaderText: String;
  3.     ShaderLength: Integer;
  4. begin
  5. //objekte klarmachen
  6. oProgram:=glCreateProgram;
  7. oVertex:=glCreateShader(GL_VERTEX_SHADER);
  8. oFragment:=glCreateShader(GL_FRAGMENT_SHADER);
  9. oStringList:=TStringList.Create;
  10.  
  11. //vertexshader laden
  12. oStringList.LoadFromFile(pPath+pDirectory+pName+'.vs');
  13. ShaderText:=oStringList.Text;
  14. ShaderLength:=length(ShaderText);
  15. glShaderSource(oVertex,1,@ShaderText,@ShaderLength);
  16.  
  17. //fragmentshader laden
  18. oStringList.LoadFromFile(pPath+pDirectory+pName+'.fs');
  19. ShaderText:=oStringList.Text;
  20. ShaderLength:=length(ShaderText);
  21. glShaderSource(oFragment,1,@ShaderText,@ShaderLength);
  22.  
  23. //compilieren & loggen
  24. oStringList.Clear;
  25. glCompileShader(oVertex);
  26. oStringList.Add(GetShaderLog(oVertex));
  27. glCompileShader(oFragment);
  28. oStringList.Add(GetShaderLog(oFragment));
  29.  
  30. glAttachShader(oProgram,oVertex);
  31. glAttachShader(oProgram,oFragment);
  32.  
  33. glLinkProgram(oProgram);
  34.  
  35. glDeleteShader(oVertex);
  36. glDeleteShader(oFragment);
  37.  
  38. oStringList.Add(GetProgramLog(oProgram));
  39. oStringList.SaveToFile(pPath+pDirectory+pName+'-log.txt');
  40. end;


zack das is der code zum laden. die handles haben die werte 1-3 :/

Autor:  mrtrain [ Mi Nov 30, 2011 18:22 ]
Betreff des Beitrags:  Re: glsl fehler

Einfach mal geraten: Hast du in beiden Shadern auch
Code:
  1. void main(void)
  2. {
  3. //...
  4. }
stehen und schreibst du im Vertexshader auch in die Variable gl_Position und im Fragmentshader in die Variable gl_FragColor (bzw. gl_FragData)?

Edit: Ich habe mal ein paar Suchmaschinen bemüht. Viele, die auch diese Fehlermeldung bekommen machen letzendlich irgendwas beim Laden des Codes falsch. Da du mit TStringList arbeitest, vermute ich entweder ein AnsiString/Widestring Problem oder dass du Pointer auf Zeilen statt auf den zusammenhängeden Text übergibst, oder irgendein Pointerproblem. Leider kenne ich mich mit der Pointersyntax in Pascal und den Delphi-Komponenten nicht so aus.

Autor:  Coolcat [ Mi Nov 30, 2011 20:13 ]
Betreff des Beitrags:  Re: glsl fehler

Ich tippe darauf, dass die beiden Shader nicht zusammenpassen, weil die varying's unterschiedlich sind.

Autor:  phlegmatiker [ Mi Nov 30, 2011 20:39 ]
Betreff des Beitrags:  Re: glsl fehler

und oStringlist gibst du auch nicht frei am ende ... deine namenskonvention ist auch komisch

Autor:  Bergmann89 [ Mi Nov 30, 2011 22:41 ]
Betreff des Beitrags:  Re: glsl fehler

Hey,

bei meinem glslEditor ist eine Unit dabei (im Insallationsverzeichnis) die die ganzen Shader Sachen in ne Klasse kappselt. Du kannst ja ma mit der Klasse versuchen, deine Shader zu kompilieren. Kleines Bsp gibts hier.

MfG Bergmann.

Autor:  sirrk [ Do Dez 01, 2011 00:43 ]
Betreff des Beitrags:  Re: glsl fehler

ich hab den sepia und den blur shader aus der sammlung, und den fxaa shader den ich hier gepostet habe getestet. teilweise habe ich #version ergänzen müssen

@phleg das ist mehr so ne art shit als code, da hab ich irgendwas testweise hingeklatscht :)

@train: der code den ich oben gepostet habe ist nahezu alles was ich so mache. ich ruf dann nurnoch .create, .load und binde das programm, wobei .load die fehlermeldung auswirft.

@bergmann: check ich morgen :mrgreen:

da die meldung "successfully compiled to run on hardware" kommt, und ich fertige shader aus sammlungen bemüht habe, kommt mir ein string-problem am warscheinlichsten vor. um die fehlermeldung auszulesen musste ich auch das "pchar(" aus der funktion aus dem tutorial entfernen und konnte nur mit sufu und gedult ne lösung finden um den log vom linken auszulesen. ich kenn mich bloß kaum aus.

Autor:  sirrk [ So Mär 25, 2012 12:45 ]
Betreff des Beitrags:  Re: glsl fehler

ok, hab mich nochmal hingesetzt.

hab weitere shader ausprobiert und bin zuversichtlich dass es an denen nicht liegt; es ist leicht, etwas anderes als successfuly compiled im log stehen zu haben. ich glaube auch nichtmehr dass es ein string problem ist. die shader compilieren, hab mir während des ladens den inhalt der varriablen angeguckt, scheint alles richtig zu sein. hab mir beispielquelltext und ne shaderklasse (quelle vergessen) angeschaut, hab aber keine wesentlichen unterschiede festellen können; was die verschiedenen beispiele unterschiedlich machen, habe ich jeweils erfolglos ausprobiert.

als mögliche linking-fehlerquellen werden im tutorial genannt:

Zitat:
Die Zahl der von der Implementation unterstützten Attributvariablen wurde überschritten
Der Speicherplatz für Uniformvariablen wurde überschritten
Die Zahl der von der Implementation angebotenen Sampler wurde überschritten
Die main-Funktion fehlt
Die Liste der Varying-Variablen des Vertexshaders stimmt nicht mit der des Fragmentshaders überein
Funktions- oder Variablenname nicht gefunden
Eine gemeinsame Globale ist mit unterschiedlichen Werten oder Typen initialisiert worden
Zwei Sampler unterschiedlichen Typs zeigen auf die selbe Textureneinheit
Ein oder mehrere angehangene(r) Shader wurden nicht erfolgreich kompiliert


das kann ich alles ausschließen. wie habe abermals diverse shader aus der samlung ausprobiert.

woran könnte es also noch liegen? der shader-code aus glsl tutorial 2 hat zb kein #version am anfang, was bei mir zum fehler beim compilieren führt. das projekt an sich compiliert auch nicht (resourcen nicht gefunden). die shaderklasse die ich mir angeschaut habe macht hingegen alles fast genauso wie ich, halt mit einer anderen objekt-struktur. eine mögliche fehlerquelle sehe ich im #version, da die beispiele hier varrieren und ich den punkt auch nicht ganz verstanden habe -> im tutorial 1 heists #version 1.50, im blurshader #version 120, oft tauchts garnicht auf. hab ne radeon hd 4870, sm 3.3

ein Shader, den ich verwende

und übersichtshalber nochmal mein code,

Code:
  1. procedure TShader.Load(pPath,pDirectory,pName: String);
  2. var oStringList: TStringList;
  3.     ShaderText: String;
  4.     ShaderLength: Integer;
  5. begin
  6. //objekte klarmachen
  7. oProgram:=glCreateProgram;
  8. oVertex:=glCreateShader(GL_VERTEX_SHADER);
  9. oFragment:=glCreateShader(GL_FRAGMENT_SHADER);
  10. oStringList:=TStringList.Create;
  11.  
  12. //vertexshader laden
  13. oStringList.LoadFromFile(pPath+pDirectory+pName+'.vs');
  14. ShaderText:=PChar(oStringList.Text); //pchar
  15. ShaderLength:=length(ShaderText);
  16. glShaderSource(oVertex,1,@ShaderText,@ShaderLength);
  17.  
  18. //fragmentshader laden
  19. oStringList.LoadFromFile(pPath+pDirectory+pName+'.fs');
  20. ShaderText:=PChar(oStringList.Text); //pchar
  21. ShaderLength:=length(ShaderText);
  22. glShaderSource(oFragment,1,@ShaderText,@ShaderLength);
  23.  
  24. //compilieren & loggen
  25. oStringList.Clear;
  26.  
  27. glCompileShader(oVertex);
  28. oStringList.Add(GetShaderLog(oVertex));
  29.  
  30. glCompileShader(oFragment);
  31. oStringList.Add(GetShaderLog(oFragment));
  32.  
  33. glAttachShader(oProgram,oVertex);
  34. glAttachShader(oProgram,oFragment);
  35.  
  36. glLinkProgram(oProgram);
  37.  
  38. glDeleteShader(oVertex);
  39. glDeleteShader(oFragment);
  40.  
  41. oStringList.Add(GetProgramLog(oProgram));
  42. oStringList.SaveToFile(pPath+pDirectory+pName+'-log.txt');
  43. oStringList.Free;
  44. end;


und natürlich der log

Zitat:
Vertex shader was successfully compiled to run on hardware.

Fragment shader was successfully compiled to run on hardware.

Vertex shader(s) failed to link, fragment shader(s) failed to link.
ERROR: error(#280) Not all shaders have valid object code
ERROR: error(#280) Not all shaders have valid object code



ideen, was ich ausprobieren könnte?

edit: achso, binde ich den shader trozdem und zeichne mein fullscreen-quad, habe ich einen leichten blur effekt, allerdings unabhängig davon, welchen shadercode ich verwende (zb auch beim sepia-shader)

edit2: glslEditor compiliert und link't die shader problemlos.

Autor:  dj3hut1 [ Mo Mär 26, 2012 08:32 ]
Betreff des Beitrags:  Re: glsl fehler

Hallo,

bei glShaderSource steht immer die Id 1 drin, eigentlich sollte dort die mit glCreateShader erzeugte Id drin stehen, also oProgram bzw. oVertex. sorry, die stehn ja vorne :oops:

Viele Grüße
dj3hut1

Autor:  Lord Horazont [ Mo Mär 26, 2012 18:09 ]
Betreff des Beitrags:  Re: glsl fehler

Also mir kommt ja die Zeile mit PChar(oStringList.Text) sehr spanisch vor.

Mach mal bitte folgendes. Finde heraus, zu was
Code:
  1. Sizeof(Char);
evaluiert.

In der zwischenzeit probiere aus:
Code:
  1. procedure TShader.Load();
  2. var oStringList: TStringList;
  3.     test: AnsiString;
  4.     []
  5. begin
  6.   []
  7.   test := oStringList.Text;
  8.   ShaderLength := Length(test);
  9.   glShaderSource(oFragment, 1, @test[1], @ShaderLength);
  10.   // das gleiche für den vertex-shader.
  11.   []
  12. end;


Ich habe diesem PChar-„Cast“ noch nie vertraut ;).

greetings

//Edit: Tippfehler korrigiert. Danke, Bergmann.

Autor:  Bergmann89 [ Mo Mär 26, 2012 18:22 ]
Betreff des Beitrags:  Re: glsl fehler

Hey,

PChar zeigt auf das erste Zeichen im String. Also sollte da lieber das stehen:
Code:
  1. glShaderSource(oFragment, 1, @test[1], @ShaderLength);
Bei mir meckert da auch der Compiler, wenn ich bei nem String auf Index 0 zugreifen will.

€: hab mir grad nochmal den Code angesehen:
Code:
  1. //vertexshader laden
  2. oStringList.LoadFromFile(pPath+pDirectory+pName+'.vs');
  3. ShaderText:=PChar(oStringList.Text); //pchar
  4. ShaderLength:=length(ShaderText);
  5. glShaderSource(oVertex,1,@ShaderText,@ShaderLength);
ShaderText ist ein String. Also kannst du dir das PChar auch sparen, weil Delphi das wieder auf einen String zurück bricht. Und jetzt kommt das entscheidende: @ShaderText is kein PChar, sondern ein Zeiger auf einen String, also ein PString und das ist nicht das selbe! Also hier einfach @ShaderText[1] dann sollte es funktionieren.

Code:
  1. glShaderSource(oVertex,1,PChar(oStringList.Text),@ShaderLength);
Das sollte rein theoretisch auch funktionieren. Zumindest is der Zeiger derselbe, wie bei @oStringList.Text[1]. Aber da das Ganze ein Rückgabewert aus einer Funktion ist würde ich dem auch nicht so vertrauen. Der Weg über den String als lokale Variable ist hier der bessere (so wie du das jetzt hast).

MfG Bergmann.

MfG Bergmann.

Autor:  sirrk [ Di Mär 27, 2012 11:40 ]
Betreff des Beitrags:  Re: glsl fehler

da hab ich wenigstens schonmal was gelernt.

sizeof(cahr) gibt 2 aus.

wenn ich aus Shadertext nen AnsiString mache, und @shadertext[1] verwende (0 geht nicht) bekomme ich im log für die shader einen fehler beim compilieren. benutze ich einfach nur @shadertext1 und lasse shadertext nen string sein, ändert sich nichts.

aber ich habs trozdem hinbekommen:

Code:
  1. procedure TShader.Load(pPath,pDirectory,pName: String);
  2. var oStringList: TStringList;
  3.     ShaderText: AnsiString;
  4.     ShaderLength: Integer;
  5. begin
  6.  
  7. [...]
  8.  
  9. //vertexshader laden
  10. oStringList.LoadFromFile(pPath+pDirectory+pName+'.vs');
  11. ShaderText:=oStringList.Text;
  12. ShaderLength:=length(ShaderText);
  13. glShaderSource(oVertex,1,@ShaderText,@ShaderLength);
  14.  
  15. [...]
  16.  


so. :) also nur n ansistring draus machen, aber keinen index mitgeben

danke für die hilfe!

Autor:  Lord Horazont [ Di Apr 03, 2012 16:25 ]
Betreff des Beitrags:  Re: glsl fehler

Okay, das mit der 0 war nen harter Fehler von mir. Daran merkt man, dass ich wohl fast nen Jahr kein Pascal mehr angefasst habe…

Dass @ShaderText funktioniert ist „einfach falsch“. Der Lesbarkeit halber würde ich @ShaderText[1] verwenden.

greetings

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/