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

Aktuelle Zeit: Mo Jun 17, 2024 10:09

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jan 04, 2010 13:21 
Offline
DGL Member

Registriert: So Jan 03, 2010 20:24
Beiträge: 7
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:
  1.      
  2.       FShader:= TStringList.Create;
  3.       FShader.LoadFromFile(FFilename);
  4.  
  5.       VShader:= TStringList.Create;
  6.       VShader.LoadFromFile(VFilename);
  7.  
  8.       FShaderText:=FShader.Text;
  9.       VShaderText:=VShader.Text;
  10.  

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.
Code:
  1.  
  2. ProgramObject  := glCreateProgram;
  3.  
  4.       if Length(VShaderText) > 0 then
  5.       begin
  6.         tmplen:=Length(VShaderText);
  7.  
  8.         VertexShader := glCreateShader(GL_VERTEX_SHADER);
  9.         glShaderSource(VertexShader, 0, @VShaderText, @tmplen);
  10.         glCompileShader(VertexShader);
  11.         glAttachShader(ProgramObject, VertexShader);
  12.       end;
  13.  
  14.       if Length(FShaderText) > 0 then
  15.       begin
  16.         tmplen:=Length(FShaderText);
  17.  
  18.         FragmentShader := glCreateShader(GL_FRAGMENT_SHADER);
  19.         glShaderSource(FragmentShader, 0, @FShaderText, @tmplen);
  20.         glCompileShader(FragmentShader);
  21.         glAttachShader(ProgramObject, FragmentShader);
  22.       end;
  23.       glLinkProgram(ProgramObject);
  24.  

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:
  1.  
  2. void main (void)
  3. {
  4.    gl_FragColor = vec4 (0.8, 0.3, 0.3, 1.0);
  5. }
  6.  

Und der Vertex Shader:
Code:
  1.  
  2. void main(void)
  3. {
  4.  vec4 a = gl_Vertex;
  5.  a.x = a.x * 0.5;
  6.  a.y = a.y * 0.5;
  7.  gl_Position = gl_ModelViewProjectionMatrix * a;
  8. }
  9.  

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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 04, 2010 14:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Es liegt tatsächlich am glShaderSource:
Code:
  1. glShaderSource(VertexShader, 0, @VShaderText, @tmplen);

=>
Code:
  1. glShaderSource(VertexShader, 1, @VShaderText, @tmplen);

...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:
  1. kein Postfix: fester Teil von OpenGL, funktioniert überall wo OpenGL in der entsprechenden Version vorhanden ist
  2. ARB (Extension vor der Aufnahme in den OpenGL Kern)
  3. EXT (standardisierte Extension)
  4. NV, ATI, SGI, ... (Herstellerspezifisch)
Siehe auch ARB.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 04, 2010 15:06 
Offline
DGL Member

Registriert: So Jan 03, 2010 20:24
Beiträge: 7
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.

Danke im voraus für die Hilfe.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 04, 2010 15:41 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 04, 2010 15:46 
Offline
DGL Member

Registriert: So Jan 03, 2010 20:24
Beiträge: 7
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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 04, 2010 15:48 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 04, 2010 15:51 
Offline
DGL Member

Registriert: So Jan 03, 2010 20:24
Beiträge: 7
Ja, beide Shader werden "korrekt" compiliert aber das linken ist nicht erfolgreich.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 04, 2010 18:16 
Offline
DGL Member
Benutzeravatar

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.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 04, 2010 18:58 
Offline
DGL Member

Registriert: So Jan 03, 2010 20:24
Beiträge: 7
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 05, 2010 06:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
hab nochmal nachgeblättert, es muss tatsächlich @tmplen heißen. Hab mich gestern abend in der funktion verguckt.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 05, 2010 10:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zeig doch bitte mal den deinen kompletten aktuellen Code zum Laden von Shadern.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 05, 2010 11:33 
Offline
DGL Member

Registriert: So Jan 03, 2010 20:24
Beiträge: 7
Ersteinmal die Initialisierung, das mit dem Host benutze ich, weil das Form in einer anderen Unit/Klasse ist.
Code:
  1.  
  2. Constructor TRenderer.Create(HostT: TForm1);
  3. begin
  4.   Host:=HostT;
  5.   Camera:=TCamera(Host.Items.Camera.Zeiger);
  6.   InitOpenGL;
  7.   DC:=GetDC(Host.Handle);
  8.   RC:=CreateRenderingContext(DC,          //Device Contest
  9.                              [opDoubleBuffered], //Optionen
  10.                              32,          //ColorBits
  11.                              24,          //ZBits
  12.                              0,           //StencilBits
  13.                              0,           //AccumBits
  14.                              0,           //AuxBuffers
  15.                              0);          //Layer
  16.   ActivateRenderingContext(DC, RC);
  17.   glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  18.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  19.   glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  20. //  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  21.   glEnable(GL_TEXTURE_2D);
  22. end;
  23.  

Dann der Teil in dem die Shader geladen werden, der wird nach der Initialisierung des Restes aufgerufen
Code:
  1.  
  2. Class function TShaderLoader.LoadFragmentandVertexShader(FFilename: string; VFilename: string): GLHandle;
  3.  var
  4.   FShader: TStringList;
  5.   FShaderText: string;
  6.  
  7.   VShader: TStringList;
  8.   VShaderText: string;
  9.  
  10.   tmpLen : Integer;
  11.   ProgramObject,VertexShader,FragmentShader : GLHandle;
  12.   I: Integer;
  13. begin
  14.   if FileExists(FFilename)= True then
  15.     if FileExists(VFilename)= True then
  16.     begin
  17.       FShader:= TStringList.Create;
  18.       FShader.LoadFromFile(FFilename);
  19.  
  20.       VShader:= TStringList.Create;
  21.       VShader.LoadFromFile(VFilename);
  22.  
  23.       FShaderText:=FShader.Text;
  24.       VShaderText:=VShader.Text;
  25.  
  26.  
  27.       ProgramObject  := glCreateProgram;
  28.  
  29.       if Length(VShaderText) > 0 then
  30.       begin
  31.         tmplen:=Length(VShaderText);
  32.  
  33.         VertexShader := glCreateShader(GL_VERTEX_SHADER);
  34.         glShaderSource(VertexShader, 1, @VShaderText[1], @tmplen);
  35.         glCompileShader(VertexShader);
  36.         glAttachShader(ProgramObject, VertexShader);
  37.       end;
  38.  
  39.       if Length(FShaderText) > 0 then
  40.       begin
  41.         tmplen:=Length(FShaderText);
  42.  
  43.         FragmentShader := glCreateShader(GL_FRAGMENT_SHADER);
  44.         glShaderSource(FragmentShader, 1, @FShaderText[1], @tmplen);
  45.         glCompileShader(FragmentShader);
  46.         glAttachShader(ProgramObject, FragmentShader);
  47.       end;
  48.       glLinkProgram(ProgramObject);
  49.  
  50.       ShowMessage(glSlang_GetInfoLog(VertexShader));
  51.       ShowMessage(glSlang_GetInfoLog(FragmentShader));
  52.       ShowMessage(glSlang_GetInfoLog(ProgramObject));
  53.  
  54.       Result:=ProgramObject;
  55.     end
  56.     else
  57.     ShowMessage('Fehler: Shader-Datei konnte nicht gefunden werden!')
  58.   else
  59.   ShowMessage('Fehler: Shader-Datei konnte nicht gefunden werden!')
  60. end;
  61.  

Und noch die Methode um mir die möglichen Fehler anzeigen zu lassen.
Code:
  1.  
  2. Class Function TShaderLoader.glSlang_GetInfoLog(glObject : GLHandleARB) : String;
  3. var
  4.  blen,slen : GLInt;
  5.  InfoLog   : PGLCharARB;
  6. begin
  7.   glGetObjectParameterivARB(glObject, GL_OBJECT_INFO_LOG_LENGTH_ARB , @blen);
  8.   if blen > 1 then
  9.    begin
  10.    GetMem(InfoLog, blen*SizeOf(GLCharARB));
  11.    glGetInfoLogARB(glObject, blen, slen, InfoLog);
  12.    Result := (InfoLog);
  13.    Dispose(InfoLog);
  14.    end;
  15. end;
  16.  

Die Shaderdateien sind .txt Dateien in denen einfachnur der Shadercode drinsteht.

Danke für die Hilfe!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 05, 2010 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also das sieht so richtig aus, wahrscheinlich ist es wirklich ein Versionsproblem. Vielleicht hilft dir dieser Thread:
viewtopic.php?f=19&t=8861

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 05, 2010 12:05 
Offline
DGL Member

Registriert: So Jan 03, 2010 20:24
Beiträge: 7
Ich habe die Strings zu AnsiStrings geändert und....es läuft!
Nun muss ich nurnoch vernünftige Shader schreiben. Mal sehen.

Euch allen vielen vielen dank!


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


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.210s | 17 Queries | GZIP : On ]