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.
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:
vstringlist := TStringlist.Create;
vstringlist.LoadFromFile('vshader.txt');
vshadertext := vstringlist.Text;
vshaderlength := length(vshaderText);
fstringlist := TStringlist.Create;
fstringlist.LoadFromFile('fshader.txt');
fshadertext := fstringlist.Text;
fshaderlength := length(fshaderText);
showmessage(vshadertext); // hier wird zum testen einmal der jeweilige shadertext ausgegeben,
showmessage(fshadertext); // an diesem punkt scheint auch noch alles in ordnung zu sein und der geladene shadertext ist korrekt
glShaderSourceARB(VertexShaderObject, 1, @vShaderText, @vShaderLength); // hier nehme ich an liegt irgendwo der fehler. der gespreicherte shader-string
glShaderSourceARB(FragmentShaderObject, 1, @fShaderText, @fShaderLength); // wird wohl irgendwie falsch übergeben durch die änderung in neueren delphis, dass gewisse strings nun anders
// behandelt werden. ich hab hier schon sämtliche typecasts ausprobiert, pchar, pansichar, pwidechar,
//compilieren // string, pglchararb, ppglchararb etc... nützt alles nichts. ich weiß auch ehrlich gesagt nicht wo ich genau suchen soll
glCompileShaderARB(VertexShaderObject); // oder was ich wo überhaupt ändern könnte.
glCompileShaderARB(FragmentShaderObject);
ShowMessage(pansichar(glSlang_GetInfoLog(VertexShaderObject))); // und hier kommt es dann natürlich zu den fehlern
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.
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.
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!
Super, das ich helfen konnte. Somit hat mein brand neues Tutorial schon den ersten Nutzen gehabt. Es ist nicht mal eine Woche alt.
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.
Mitglieder in diesem Forum: 0 Mitglieder und 42 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.