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

Aktuelle Zeit: Do Mär 28, 2024 11:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Forward compatible Fehler
BeitragVerfasst: So Jan 19, 2014 18:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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;    

_________________
OpenGL


Zuletzt geändert von mathias am Mi Jan 22, 2014 13:52, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 11:06 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
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.

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 16:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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 

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 17:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
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;

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 18:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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 ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 18:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
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.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 18:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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);

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 18:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
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.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 18:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
@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

_________________
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  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 18:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
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?

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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 ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 19:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
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.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 20:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Muss Lengths = 0 sein oder Lengths < 0 ?

Diese Frage ist noch nicht geklärt.

Gelbe Schrift im Wiki-Ausschnitt.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 20:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
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.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Forward compatible Fehler
BeitragVerfasst: Mi Jan 22, 2014 20:54 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

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