DGL
https://delphigl.com/forum/

Forward compatible Fehler
https://delphigl.com/forum/viewtopic.php?f=20&t=11097
Seite 1 von 2

Autor:  mathias [ So Jan 19, 2014 18:59 ]
Betreff des Beitrags:  Forward compatible Fehler

Ich habe meine Fehlerabfrage in der Shaderinizialisierung abgeändert nun habe ich folgende Warnung:
Zitat:
WARNING: -1:65535: '#version' : version number deprecated in OGL 3.0 forward compatible context driver


Je nach dem wie ich RC erzeuge, gibt es eine Warnung.
im Shader Kopf steht dies #version 330, dies müsste doch stimmen oder ?

Code:
  1. // ohne Warnung
  2. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  3. // mit Warnung.
  4. RC := CreateRenderingContextVersion(DC, [opDoubleBuffered], 3, 3, True, 32, 24, 8, 0, 0, 0); 




Früher war die Abfrage so und es kahmen nur Fehler:
Code:
  1.   // Check  Shader
  2.   glGetShaderiv(FragmentShaderObject, GL_COMPILE_STATUS, @ErrorStatus);
  3.   if ErrorStatus = GL_FALSE then begin
  4.     glGetShaderiv(FragmentShaderObject, GL_INFO_LOG_LENGTH, @InfoLogLength);
  5.     SetLength(Str, InfoLogLength);
  6.     glGetShaderInfoLog(FragmentShaderObject, InfoLogLength, InfoLogLength, @Str[1]);
  7.     Application.MessageBox(PChar(Str), 'OpenGL Fragment Fehler', 48);
  8.   end;  


Jetzt kommen auch Warnungen:
Code:
  1.   //  glGetShaderiv(VertexShaderObject, GL_COMPILE_STATUS, @ErrorStatus);
  2.   //  if ErrorStatus = GL_FALSE then begin
  3.   glGetShaderiv(VertexShaderObject, GL_INFO_LOG_LENGTH, @InfoLogLength);
  4.   if InfoLogLength > 1 then begin
  5.     SetLength(Str, InfoLogLength);
  6.     glGetShaderInfoLog(VertexShaderObject, InfoLogLength, InfoLogLength, @Str[1]);
  7.     Application.MessageBox(PChar(Str), 'OpenGL Vertex Fehler', 48);
  8.   end;    

Autor:  Vinz [ Mi Jan 22, 2014 11:06 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

So wie ich es verstanden habe, ist es unsinnig die Shaderversion festzulegen, wenn der Shader aufwärtskompatibel sein soll.
Zitat:
Früher war die Abfrage so un es kahmen nur Fehler:
...
Jetzt kommen auch Warnungen:

Würd ich so lassen.
Wenn Du die Warnungen ignorierst, ist ein anderes Verhalten des Shaders auf anderer Harware so sicher wie das Amen in der Kirche.

Autor:  mathias [ Mi Jan 22, 2014 16:27 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Ich habe die Zeile mit #version 330 entfernt.

Wen ich RC folgendermassen erzeuge:
Code:
  1. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);

Kommt folgende Warnung:
Code:
  1. WARNING: 0:17: 'constructor' : constructing matrix from matrix is allowed from GLSL 1.20 (reserved in GLSL 1.10)
  2.  
  3.  
  4.  
  5. WARNING: 0:8: 'assigning' : implict conversion between types allowed from GLSL 1.20
  6. WARNING: 0:8: 'assigning' : implict conversion between types allowed from GLSL 1.20
  7. WARNING: 0:12: 'assigning' : implict conversion between types allowed from GLSL 1.20


Wen ich RC so erzeuge:
Code:
  1. RC := CreateRenderingContextVersion(DC, [opDoubleBuffered], 3, 3, True, 32, 24, 8, 0, 0, 0);  

Kommt folgender Error:
Code:
  1. RC := CreateRenderingContextVersion(DC, [opDoubleBuffered], 3, 3, True, 32, 24, 8, 0, 0, 0);  
  2.  
  3.  
  4. WARNING: -1:65535: '#version' :  version number deprecated in OGL 3.0 forward compatible context driver
  5. ERROR: 0:2: '' : syntax error: #version is mandatory and should be set before any other token
  6. ERROR: 0:? : 'pre-mature EOF' : syntax error syntax error 

Autor:  glAwesome [ Mi Jan 22, 2014 17:44 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Das #version sollte man in keinem Fall weglassen - es sei denn man programmiert für die erste Version von GLSL. Das sagt dir freundlicherweise ja der Compiler und auch in der Spec steht's drin. Allerdings ist diese Zeile
Code:
  1. WARNING: -1:65535: '#version' :  version number deprecated in OGL 3.0 forward compatible context driver
ein Hinweis darauf, dass irgendetwas anderes nicht stimmt. Der Compiler behauptet, der Fehler liegt in Unit -1 in Zeile (2^16)-1. Möglicherweise machst du beim Übergeben des Shadercodes irgendwas falsch.

Mich würde - auch in Bezug auf den DGL-Header - interessieren, ob die Warnung immer noch kommt, wenn du deinen Kontext in dieser Reihenfolge initialisierst:
Code:
  1. procedure MyGLInit;
  2. begin
  3.   DC := GetDC(...);
  4.   RC := CreateRenderingContextVersion(DC, [opDoubleBuffered], 3, 3, True, 32, 24, 8, 0, 0, 0);
  5.   InitOpenGL;
  6.   // ...
  7. end;

Autor:  mathias [ Mi Jan 22, 2014 18:02 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Code:
  1.   DC := GetDC(Handle);
  2. //  RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  3.   RC := CreateRenderingContextVersion(DC, [opDoubleBuffered], 3, 3, True, 32, 24, 8, 0, 0, 0);
  4.   ActivateRenderingContext(DC, RC);
  5.   if not InitOpenGL then Application.Terminate;

Es kommt genau die gleiche Warnung.

Wieso machst du bei deinem Code keine if not Prüfung ?

Zitat:
Möglicherweise machst du beim Übergeben des Shadercodes irgendwas falsch.

Wen der Code nicht richtig ankommt, müsste doch ein Error kommen oder ?

Autor:  glAwesome [ Mi Jan 22, 2014 18:17 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Das Prüfen des Rückgabewerts ist natürlich keine schlechte Idee. Das ist auch nicht "mein" Code, sondern aus dem DGL-Header Beispiel, das verbessert werden sollte.

mathias hat geschrieben:
Wen der Code nicht richtig ankommt, müsste doch ein Error kommen oder ?
Einerseits ja, andererseits vielleicht übergibst du den Code ja korrekt, aber außerdem noch mehr, als du übergeben musst oder was weiß ich. Eine Fehlermeldung/Warnung in Zeile 65535 hatte ich jedenfalls noch nie und ist ganz klar ein Hinweis darauf, dass irgendwo was schiefgeht.

Autor:  mathias [ Mi Jan 22, 2014 18:27 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Der Shader übergebe ich folgedermassen von der Text-Datei:
Code:
  1.   StringList := TStringList.Create;
  2.   ProgramObject := glCreateProgram();
  3.  
  4.   VertexShaderObject := glCreateShader(GL_VERTEX_SHADER);
  5.   StringList.LoadFromFile(VertexDatei);
  6.   Str := StringList.Text;
  7.   strlen := Length(StringList.Text);
  8.   glShaderSource(VertexShaderObject, 1, @Str, @strlen);
  9.   glCompileShader(VertexShaderObject);
  10.   glAttachShader(ProgramObject, VertexShaderObject);  


Nur komisch, es kommt nur bei dem einten CreateContext, wie ich oben schon beschrieben habe.
Code:
  1. // ohne Warnung
  2. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  3. // mit Warnung.
  4. RC := CreateRenderingContextVersion(DC, [opDoubleBuffered], 3, 3, True, 32, 24, 8, 0, 0, 0);

Autor:  glAwesome [ Mi Jan 22, 2014 18:38 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

mathias hat geschrieben:
Code:
  1. Str := StringList.Text;
  2. strlen := Length(StringList.Text);
  3. glShaderSource(VertexShaderObject, 1, @Str, @strlen);
Aufgrund meiner schlechten Pascal-Skills kann ich nichts mit Sicherheit sagen, aber intuitiv sieht das komisch aus. Der dritte Parameter von glShaderSource soll ein Pointer auf ein Null-terminiertes Array von char*-Pointern sein. Du übergibst offenbar(?) einen Pointer auf die Instanz einer String-Klasse.

Autor:  Lord Horazont [ Mi Jan 22, 2014 18:49 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

@Str sollte ein Pointer auf einen Pointer auf einen Null-Terminierten String sein. So wie ich das lese, will glShaderSource ein Array (der Länge 1, in diesem Fall) von Null-Terminierten C-Strings (char*). Das ist genau das.

Außer bei neueren Delphis. Da gilt obiges nur dann, wenn es ein AnsiString und nicht ein String ist.

grüße

Autor:  glAwesome [ Mi Jan 22, 2014 18:57 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Ach klar, da habe ich bezüglich des dritten Parameters Unsinn geredet. Allerdings: Wenn String/TString oder wie das bei Delphi heißt eine Klasse ist, dann könnte ich mir vorstellen, dass dort neben einem Array auch noch ein Integer enthalten ist. Gibt es nicht sowas wie c_str() als Methode?

Autor:  mathias [ Mi Jan 22, 2014 19:41 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Ich habe den Code ein bisschen geändert, die Warnung kommt immer noch.

Ichj habe im Wiki gelesen, das man bei Length 0 schreiben kann, wen der String Nullterminiert ist.
Code:
  1.   VertexShaderObject := glCreateShader(GL_VERTEX_SHADER);
  2.   StringList.LoadFromFile(VertexDatei);
  3.   Str := StringList.Text;
  4.   str:=str+#0;
  5.   strlen := Length(StringList.Text);
  6.   glShaderSource(VertexShaderObject, 1, @str, nil);
  7. //  glShaderSource(VertexShaderObject, 1, @Str, @strlen);
  8.   glCompileShader(VertexShaderObject);
  9.   glAttachShader(ProgramObject, VertexShaderObject);    


Im Wiki-Text ist mir noch was unklar:
Zitat:
Beschreibung

glShaderSource ersetzt den kompletten Quellcode eines Shaders mit dem der per Parameter angegeben wurden. Via count wird angegeben wie viele Elemente _string beinhaltet. Wenn lengths gleich Null ist, dann wird angenommen das jeder String im Quellcode null-terminiert ist, ansonsten gibt lengths an wie lange jedes Quellcodeelement (in Zeichen) ist. Jedes Element in lengths beinhaltet dann die Länge des entsprechenden Quellcodestrings, oder einen Wert < 0 um anzuzeigen dass der entsprechende String null-terminiert ist. Der Quellcode wird zu diesem Zeitpunkt jedoch nicht geprüft, sondern einfach im passenden Shaderobjekt abgelegt.

Kann der Shader-Code mehrere Strings haben ?
Muss Length = 0 sein oder Length < 0 ?

Autor:  glAwesome [ Mi Jan 22, 2014 19:49 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Ja, du kannst mehrere Strings übergeben und dadurch den Shader in mehrere Units aufteilen. Details dazu weiß ich nicht. Wenn der Compiler Fehlermeldungen verteilt, sagt er dir ja neben der betreffenden Zeile auch die Nummer der Unit (bei deiner mysteriösen Warnung -1).

Dein String ist aber höchstwahrscheinlich schon Null-terminiert - habe noch keine Stringklasse gesehen, die Strings nicht nullterminiert gespeichert hat.

Autor:  mathias [ Mi Jan 22, 2014 20:28 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Zitat:
Muss Lengths = 0 sein oder Lengths < 0 ?

Diese Frage ist noch nicht geklärt.

Gelbe Schrift im Wiki-Ausschnitt.

Autor:  glAwesome [ Mi Jan 22, 2014 20:52 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Hier muss differenziert werden. lengths ist ein Zeiger auf ein Array, dessen Elemente Integer sind, die die Länge der Strings angeben. Wenn du den Nullzeiger (nil) übergibst, heißt das, dass alle übergebenen Strings nullterminiert sind. Wenn nur einige nullterminiert sind, darfst du lenghts nicht auf nil setzen. Dann gibst du in lengths[i] die Länge des Strings mit dem Index i an. Falls der eine String mit dem Index i nullterminiert ist, darfst du aber auch einen negativen Wert angeben - für dieses eine Array-Element, nicht für den Zeiger auf das Array.

Das ist aber eigentlich nicht so praxisrelevant. Übergib doch einfach den gesamten Shadercode als einen String, gib seine Länge an und gut ist.

Autor:  OpenglerF [ Mi Jan 22, 2014 20:54 ]
Betreff des Beitrags:  Re: Forward compatible Fehler

Bei solchen Fragen ist ein Blick in die OpenGL Spezifikation unabdingbar.
Beim Übersetzten können Fehler passieren, genauso kann sich mit der Zeit etwas ändern. Deshalb ist das Original für Detailfragen die beste Quelle.
opengl.org/sdk/docs/man4/xhtml/glShaderSource.xml

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