Guten Morgen, ich habe mich in den letzten Tagen ein wenig mit GlSlang beschäftigt und bin davon insgesamt eigentlich sehr angetan. Das Tutorial hab ich mir natürlich durchgelesen, bezüglich meines Problems hilft es mir jedoch nicht weiter. Das Problem ist das Laden der Shader Codes, dafür benutze ich folgende Methode:
Code:
FShader:= TStringList.Create;
FShader.LoadFromFile(FFilename);
VShader:= TStringList.Create;
VShader.LoadFromFile(VFilename);
FShaderText:=FShader.Text;
VShaderText:=VShader.Text;
In FShaderText und VShaderText sind auch jeweils die richtigen Strings drin, allerdings mir Steuerzeichen, ist das ein Problem? Hiermit erzeuge ich nun die Shader und das dazugehörige Programm.
Weiterhin benutze ich dann noch die im Tutorial beschriebene Methode um mir die Meldungen zu den 3 erzeugten Objekten ausgeben zu lassen. Bei den beiden Shadern ist dies jeweils: " Shader was successfully to run on hardware". Dies hört sich ja eigentlich erstmal gut an, das Problem ist das beim Programm grundsätzlich folgendes ausgegeben wird: "Fragment Shader failed to link. Error: error(#280)Not all shaders have valid object code. Das dann auchnoch für den anderen Shader. Ich habe bei google geguckt und herausgefunden (http://stackoverflow.com/questions/1938 ... aders-glsl) dass die Shader erst beim Linken wirklich kompiliert werden. Daraufhin habe ich mir mit glslDevil die geladenen Shader codes einmal angeguckt und es wird grundsätzlich nichts geladen. Das Problem scheint also am glShaderSource zu liegen, ich habe schon mit den übergebenen Parametern herumgespielt aber nichts hat geholfen.
Hier noch der der Fragment Shader:
Code:
void main (void)
{
gl_FragColor = vec4 (0.8, 0.3, 0.3, 1.0);
}
Und der Vertex Shader:
Code:
void main(void)
{
vec4 a = gl_Vertex;
a.x = a.x * 0.5;
a.y = a.y * 0.5;
gl_Position = gl_ModelViewProjectionMatrix * a;
}
Beide lassen sich in verschiedenen Shader Programmen ohne Probleme kompilieren und sie sind ja auch nicht sonderlich kompliziert.
Über jegliche hilfe würde ich mich freuen.
P.S. Gibt es einen wirklichen Unterschied zwischen "glCreateShader" und "glCreateShaderObjectARB", oder ist das einfach nur durch die verschiedenen Versionen bedingt?
...der zweite Parameter ist nämlich die Anzahl der Strings die du übergeben willst.
Zitat:
Ich habe (...) herausgefunden (..) dass die Shader erst beim Linken wirklich kompiliert werden.
Nein, eigentlich nicht. Allerdings ist das was man umgangssprachlich als "Anwendung compilieren" bezeichnet die Zusammenfassung von compilieren und linken. Beim compilieren wird jedes Modul (meist Klassen o.ä, hier natürlich Vertex- oder Fragmentshader) für sich genommen in maschinenlesbaren Object-Code umgewandelt. Wenn Vertex- und Fragmentshader nicht zusammenpassen wird das erst beim linken festgestellt, den erst hier werden die einzelnen Objekte zu einem Executable miteinander verbunden.
Zitat:
P.S. Gibt es einen wirklichen Unterschied zwischen "glCreateShader" und "glCreateShaderObjectARB", oder ist das einfach nur durch die verschiedenen Versionen bedingt?
In diesem Fall gibt es wahrscheinlich keinen Unterschied. Generell kann es aber Unterschiede geben. Die Funktionen sind in dieser Reihenfolge zu bevorzugen:
kein Postfix: fester Teil von OpenGL, funktioniert überall wo OpenGL in der entsprechenden Version vorhanden ist
ARB (Extension vor der Aufnahme in den OpenGL Kern)
Ersteinmal danke für deine schnelle antwort. Ich habe das natürlich sofort ausprobiert, es gibt nun allerdings andere Fehler, ersteinmal zu den Shadern: "Vertex Shader failed to comile with the following errors: Error : 0:1: error(#132)Syntax error: 'v' parse error Error : error(#273) 1 compilation errors. No code generated"
Der Fehler beim Programm ist dann: "Vertex and Fragment Shaders were not successfully compiled before glLinkProgramm() was called. Link failed." Das ist ja auch verständlich.
Hier ist noch der Inhalt von VShaderText den ich an glShaderSource übergebe: 'void main(void)'#$D#$A'{'#$D#$A' vec4 a = gl_Vertex;'#$D#$A' a.x = a.x * 0.5;'#$D#$A' a.y = a.y * 0.5; '#$D#$A' gl_Position = gl_ModelViewProjectionMatrix * a;'#$D#$A'}'#$D#$A
und FShaderText: 'void main (void)'#$D#$A'{'#$D#$A' gl_FragColor = vec4 (0.8, 0.3, 0.3, 1.0);'#$D#$A'}'#$D#$A
Das sieht ja bis auf die Steuerzeichen auch ganz in Ordnung aus. Irgendwelche Ideen? Mir fehlt nämlich im Moment jeder Anhaltspunkt.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Versuch mal anstatt @VShaderText ein @VShaderText[1]. Sonst übergibst du nämlich einen Pointer auf einen Pointer (Strings sind Pointer) und das ist nicht so schön für OpenGL.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Jetzt werden die beiden Shader angeblich wieder korrekt compiliert aber dafür gibt es beim linken den selben Fehler wie zu Begin. Ist es richtig das da Steuerzeichen übergeben werden?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hast du die sache mit @...[1] auch für FShaderText gemacht?
Ja, die Steuerzeichen sind die Zeilenumbrüche, das stimmt schon so.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
muss als stringlängenangabe nicht ein Integer übergeben werden? '@tmplen' sieht für mich wie ne Adresse aus. Ich gehe mal davon aus, dass das 'tmplen' heißen sollte.
Also vom Delphi compiler wird auch tmplen, also ohne Pointer, akzeptiert. Man muss es dann zwar als PGLInt casten aber das geht auchnoch. Beim ausführen des Programmes stürtzt es dann aber genau an der Stelle mit einer exception ab, diese lautet: "Access violation at adress 696E9474 in module 'atioglxx.dll'. Read of adress 00000086."
Ich habe übrigens eine Readon 4850, passt also zusammen.
Mir ist noch etwas anderes aufgefallen, wenn ich "@VShaderText[1]" benutze, müsste dann nicht nur auf das erste Element des Strings zugegriffen werden? Kann es sein das das ein Delphi Versions Problem ist denn ich benutze Delphi 2010 und wie hier im Forum zu lesen ist, hat es bei anderen Leuten vor 4 Jahren noch geklappt.
Mitglieder in diesem Forum: 0 Mitglieder und 21 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.