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

Aktuelle Zeit: Sa Jun 24, 2017 21:41

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Apr 13, 2017 17:45 
Offline
DGL Member

Registriert: So Mai 06, 2007 14:10
Beiträge: 7
Hallo zusammen,

Jahrelang hab ich nun mit Delphi 2007 gearbeitet - seit ich damals vor vielen vielen jahren auf delphigl gestoßen bin, und die Beiträge im Forum sowie die ganzen Tutorials haben mir vor allem damals viel geholfen und dein Einstieg in die OpenGL-Welt bereitet :)
Nun habe ich allerdings den Umstieg auf eine etwas zeitgemäßere Delphi-Version gewagt. Dass bei der Portierung meiner Projekte eventuell einige kleinere Probleme aufkommen könnten habe ich bereits vorrausgesehen, aber irgendwann musste ich wohl oder übel da durch, wenn ich nicht dauerhaft mit einer so alten Krücke arbeiten wollte.
Die meisten kleineren Probleme waren schnell ausgebessert (prinzipiell eigentlich nur der umstieg von PChar() zu PAnsiChar()), und meine Projekte waren wieder in einem Lauffähigen Zustand.


Das einzige was nun noch probleme verursacht: die Shader.
Ich benutze seit jahren in verschiedenen Projekten verschiedene shader, alle laufen auch tadellos. (Zumindest bisher in der alten Delphi-Version)
Seit dem Umstieg bekomm ich beim compilen allerdings nur Fehlermeldungen.
Nun, nachdem die Shader ja aus Textdateien geladen werden dachte ich mir gleich, da wird sicher auch wieder die Änderung von PChar und PAnsiChar schuld sein, oder zumindest irgendeine form von falschem String-Auslesen oder zuweisen.

Diese Vermutung bestätigte sich auch recht schnell nachdem ich mir die OpenGL Fehlercodes beim compilieren der Shader angeschaut hab.
Die bestanden nämlich erstmal komplett aus chinesischen Schriftzeichen. Also werden offensichtlich hier schon falsche Zeichen zugewiesen.

Nach einer kurzen Änderung von
Code:
  1.  
  2.   ShowMessage(glSlang_GetInfoLog(VertexShaderObject));
  3.   ShowMessage(glSlang_GetInfoLog(FragmentShaderObject));
  4.  

in
Code:
  1.  
  2.   ShowMessage(pansichar(glSlang_GetInfoLog(VertexShaderObject)));
  3.   ShowMessage(pansichar(glSlang_GetInfoLog(FragmentShaderObject)));
  4.  

waren auch die Fehlermeldungen wieder wunderbar lesbar.

Und es wird anhand dieser Fehlermeldungen schnell klar dass die shader ebenfalls nur als String-Kauderwelsch interpretiert werden. Weshalb es ja überhaupt erst zu Fehlern kommt. Würde der shader wie im bisherigen delphi 2007 korrekt geladen bzw interpretiert werden, käme es ja nicht mal zu fehlern und alles liefe prima.


Jetzt die Große Frage, an der ich momentan mir den Kopf zerbeiße: Was muss ich wo ändern, dass die Shader wieder korrekt geladen werden?
Bisher sieht das ganze so aus:
Code:
  1.  
  2.   vstringlist := TStringlist.Create;
  3.   vstringlist.LoadFromFile('vshader.txt');
  4.   vshadertext := vstringlist.Text;
  5.   vshaderlength := length(vshaderText);
  6.   fstringlist := TStringlist.Create;
  7.   fstringlist.LoadFromFile('fshader.txt');
  8.   fshadertext := fstringlist.Text;
  9.   fshaderlength := length(fshaderText);
  10.  
  11.   showmessage(vshadertext);   // hier wird zum testen einmal der jeweilige shadertext ausgegeben,
  12.   showmessage(fshadertext);   // an diesem punkt scheint auch noch alles in ordnung zu sein und der geladene shadertext ist korrekt
  13.  
  14.  
  15.   //objekte erstellen
  16.   ProgramObject        := glCreateProgramObjectARB;
  17.   VertexShaderObject   := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  18.   FragmentShaderObject := glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  19.  
  20.  
  21.   //code zuweisen
  22.   glShaderSourceARB(VertexShaderObject, 1, @vShaderText, @vShaderLength);   // hier nehme ich an liegt irgendwo der fehler. der gespreicherte shader-string
  23.   glShaderSourceARB(FragmentShaderObject, 1, @fShaderText, @fShaderLength); // wird wohl irgendwie falsch übergeben durch die änderung in neueren delphis, dass gewisse strings nun anders
  24.                                                                             // behandelt werden. ich hab hier schon sämtliche typecasts ausprobiert, pchar, pansichar, pwidechar,
  25.   //compilieren                                                             // string, pglchararb, ppglchararb etc... nützt alles nichts. ich weiß auch ehrlich gesagt nicht wo ich genau suchen soll
  26.   glCompileShaderARB(VertexShaderObject);                                   // oder was ich wo überhaupt ändern könnte.
  27.   glCompileShaderARB(FragmentShaderObject);                
  28.   ShowMessage(pansichar(glSlang_GetInfoLog(VertexShaderObject)));       // und hier kommt es dann natürlich zu den fehlern
  29.   ShowMessage(pansichar(glSlang_GetInfoLog(FragmentShaderObject)));
  30.  

Ein kleines Beispiel vielleicht noch:
Der einfache (normalerweise korrekt laufende) Vertexshader
Code:
  1.  
  2. void main(void)
  3. {
  4.  gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  5.  gl_FrontColor   = gl_Color;
  6.  gl_TexCoord[0]  = gl_MultiTexCoord0;
  7. }
  8.  

liefert die (unsinnige) Fehlermeldung
Code:
  1. (0) : error C0000: syntax error, unexpected $end, expecting "::" at token "<EOF>"


Ich hoffe mir kann vielleicht jemand helfen, da ich mir auch vorstellen könnte, dass eventuell andere bereits auf das problem gestoßen sind beim Umstieg von einer alten Delphi Version auf eine neue.

Vielen Dank schonmal!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 13, 2017 19:11 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1004
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Was für ein OpenGL-Header verwendest du, ist es dglOpenGL.pas ?

Ich bin gerade an einem Tutorial für OpenGL 3.3 am schreiben

viewtopic.php?f=13&t=11565

Es ist momentan in einem sehr frühen Stadium, aber es zeigt, wie man Shader ladet.
PChar und ähnliches wird nicht verwendet, ist wird direkt einen Pointer auf den String übergeben.
Eine Ausnahme ist bei MessageBox, aber dies ist noch falsch.

Es ist zwar für Lazarus, aber ich denke, das die Shader-Routinen funktionieren auch mit Delphi.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 13, 2017 19:44 
Offline
DGL Member

Registriert: So Mai 06, 2007 14:10
Beiträge: 7
Ja genau, ich benutze den DGLOpenGL.pas Header.

Und vielen Dank für deine Antwort. Ich hab mir deinen Thread und dein Projekt angesehen, und deine Variante die Shader als ansistring zu laden war die Lösung für mein Problem.
Von daher ein großes Dankeschön fürs Zeigen und für deine Hilfe!

Viele Grüße


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 13, 2017 20:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1004
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Super, das ich helfen konnte.
Somit hat mein brand neues Tutorial schon den ersten Nutzen gehabt. :shock:
Es ist nicht mal eine Woche alt. :mrgreen:

Was vielleicht noch eine Empfehlung wäre, von Delphi auf Lazarus umzusteigen.
Ich hatte früher auch Delphi, aber unterdessen gibt es keinen Grund mehr umzusteigen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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