DGL
https://delphigl.com/forum/

GLSL: .xyz - mal ja mal nein?
https://delphigl.com/forum/viewtopic.php?f=20&t=8737
Seite 1 von 2

Autor:  mrtrain [ Di Okt 13, 2009 19:24 ]
Betreff des Beitrags:  GLSL: .xyz - mal ja mal nein?

Hallo!
Ich habe hier mal eine Frage zur Syntax von glSlang. Und zwar ist mir aufgefallen, dass in GLSL-Shadern häufig sowas
Code:
  1. vec3 vector;
  2. // ...
  3. vector.xyz = vec3(0.0, 1.0, 0.5);


verwendet wird und manchmal das Gleiche ohne .xyz:
Code:
  1. vector = vec3(0.0, 1.0, 0.5);


Ebenso werden .rgb, .rgba, usw. mal weggelassen und mal nicht. Bei meinen ersten Gehversuchen in GLSL musste ich feststellen, dass es scheinbar nicht immer egal ist, ob man es hinschreibt oder nicht (sonst meckert der Compiler :(). Gibt es da eine Regel oder hilft da wirklich nur jedesmal rumprobieren bis es klappt? :?:

Danke schonmal im Voraus für eure Antworten!

Gruß mrtrain

Autor:  Lord Horazont [ Di Okt 13, 2009 19:38 ]
Betreff des Beitrags: 

Vorallem musst du es dann verwenden, wenn die Dimensionen der Vektoren nicht passen. Also z.B. bei:
Code:
  1. vec4 vector;
  2. // ...
  3. vector.xyz = vec3(1.0, 2.0, 3.0);


greetings

Autor:  mrtrain [ Di Okt 13, 2009 19:45 ]
Betreff des Beitrags: 

Okay, danke für die ultra-schnelle Antwort! :D Das wäre ja schon eine Regel, aber u.a. auch weil du sie mit "Vorallem" einschränkst, denke ich mal, dass es nicht die einzige ist, oder?

Bin weiterhin dankbar für jede Antwort!

Autor:  Lord Horazont [ Di Okt 13, 2009 19:56 ]
Betreff des Beitrags: 

Naja, ansonsten isses auch noch Hilfreich, wenn du spezielle Komponenten eines Vektors extrahieren willst. Sollte auch mit .x, .y und so weiter gehen. Meine Einschränkung rührt daher, dass ich ne ganze weile nichts mehr mit Shadern gemacht habe. Deshalb überlasse ich jetzt mal den "Profis" das Feld ;).

Im Zweifelsfall sind die Meldungen der Compiler eigentlich auch hilfreich, also try'n'error ist vielleicht eine Divise ;)

greetings

Autor:  mrtrain [ Di Okt 13, 2009 20:17 ]
Betreff des Beitrags: 

Zitat:
Im Zweifelsfall sind die Meldungen der Compiler eigentlich auch hilfreich, also try'n'error ist vielleicht eine Divise


Leider nicht wirklich. :( Momentan bekomm' ich immer irgendwelche Fehlermeldungen / Warnungen wie diese hier:
Zitat:
0(53) : warning C7022: unrecognized profile specifier "ecular"


Dabei heißt der Bezeichner (an dem wahrscheinlich gar nichts zu beanstanden ist) "specular". Irgendwie zerhackt der Nvidia-Compiler die Namen immer so blöd. Zeile 53 ist in diesem Fall übrigens die letzte (:!:) Zeile, in der nichts anderes steht als die geschweifte schließende Klammer der main()-Prozedur. Ich dachte Nvidia bietet immernoch vergleichsweise gut OpenGL-Unterstüzung? :?: Oder machen sie bei GLSL eine Ausnahme, damit alle brav ihr Cg verwenden? :x

Gruß mrtrain

Autor:  Lord Horazont [ Di Okt 13, 2009 20:26 ]
Betreff des Beitrags: 

Zeig mal deinen Code her... Vielleicht kann man dann mehr machen ;)

greetings

Autor:  mrtrain [ Di Okt 13, 2009 20:46 ]
Betreff des Beitrags: 

Okay also hier der GLSL-Code für den Vertexshader:
Code:
  1. // Bumpmapping.vert //
  2.  
  3. // input
  4. uniform int LightsMax;
  5.  
  6. // Diese Vektoren sind normalisiert
  7. attribute vec3 attrTangent;
  8. attribute vec3 attrBitangent;
  9.  
  10. // output
  11. varying vec3 vPos;
  12. varying vec3 vLight[4];
  13. varying vec4 cAmbient;
  14. varying mat3 tangentToEyeMatrix;
  15.  
  16.  
  17. // Möglicherweise macht es Performance-techn. Sinn, sie ersten beiden tangentEyeMatrix- und die 2. glTexCoord-
  18. // Anweisung in _eine_ (nicht 2) if(useBumpMap) zu packen
  19. void main(void)
  20. {
  21.   vPos = vec3(gl_ModelViewMatrix * gl_Vertex);
  22.   tangentToEyeMatrix[0] = attrTangent;
  23.   tangentToEyeMatrix[1] = attrBitangent;
  24.   tangentToEyeMatrix[2] = gl_Normal;
  25.  
  26.   cAmbient = vec4(0.0, 0.0, 0.0, 0.0);
  27.   for(int i=0; i<LightsMax; i++)
  28.   {
  29.     vLight[i].xyz = gl_LightSource[i].position.xyz - vPos.xyz;
  30.     vLight[i].xyz = normalize(vLight[i]);
  31.     cAmbient  = cAmbient + gl_LightSource[i].ambient * gl_FrontMaterial.ambient;
  32.   }
  33.  
  34.   gl_Position    = gl_ModelViewProjectionMatrix * gl_Vertex;
  35.   gl_TexCoord[0] = gl_MultiTexCoord0;
  36.   gl_TexCoord[1] = gl_MultiTexCoord1;
  37. }


Dann haben wir noch den Fragmentshader:
Code:
  1. // Bumpmapping.frag //
  2. uniform sampler2D ColorMap;
  3. uniform sampler2D BumpMap;
  4. uniform bool useBumpMap;
  5. uniform int LightsMax;
  6.  
  7. varying vec3 vPos;
  8. varying vec3 vLight[4];
  9. varying vec4 cAmbient;
  10. varying mat3 tangentToEyeMatrix;
  11.  
  12. vec3 GetTextureNormal(void)
  13. {
  14.   vec3 value = texture2D(BumpMap, gl_TexCoord[1].st).xyz;
  15.   // transform range
  16.   value = 2.0 * value - vec3( 1.0, 1.0, 1.0);
  17.   // change coordinate system
  18.   return tangentToEyeMatrix * value;
  19. }
  20.  
  21. float GetTextureSpecular(void)
  22. {
  23.   return texture2D(BumpMap, gl_TexCoord[1].st).a * gl_FrontMaterial.shininess;
  24. }
  25.  
  26. void main(void)
  27. {
  28.   vec3 Eye = normalize(-vPos);
  29.   vec3 vNormal;
  30.   vec3 vReflected;
  31.   vec4 cDiffuse; cDiffuse  = vec4(0.0, 0.0, 0.0, 0.0);
  32.   vec4 cSpecular; cSpecular = vec4(0.0, 0.0, 0.0, 0.0);
  33.   float fSpecularFactor;
  34.   if(useBumpMap == true)
  35.   {
  36.     vNormal = GetTextureNormal();
  37.     fSpecularFactor = GetTextureSpecular();
  38.   }
  39.   else
  40.   {
  41.     vNormal = tangentToEyeMatrix[2];
  42.     fSpecularFactor = gl_FrontMaterial.shininess;
  43.   }
  44.  
  45.   for(int l=0; l<LightsMax; l++)  
  46.   {
  47.     vReflected = normalize(reflect( -vLight[l], vNormal));
  48.     cDiffuse  = cDiffuse  + gl_LightSource[l].diffuse * max(dot(vNormal, vLight[l]), 0.0) * gl_FrontMaterial.diffuse;
  49.     cSpecular = cSpecular + gl_LightSource[l].specular * pow(max(dot(vReflected, Eye), 0.0), fSpecularFactor) * gl_FrontMaterial.specular;
  50.   }
  51.  
  52.   gl_FragColor   = texture2D(ColorMap, gl_TexCoord[0].st).rgba * vec4(cAmbient + cDiffuse + cSpecular);
  53. }


So und schließlich noch den Compiler-Log:
Zitat:
Vertex info
-----------
0(37) : error C0000: syntax error, unexpected $end at token "<EOF>"
0(37) : error C0501: type name expected at token "<invalid atom -1>"
0(37) : warning C7022: unrecognized profile specifier "_Te"

Fragment info
-------------
0(53) : error C0000: syntax error, unexpected ')' at token ")"
0(53) : error C0501: type name expected at token ")"
0(53) : warning C7022: unrecognized profile specifier "ecular"


Ist jetzt leider 'ne Menge Code, aber so'ne Hilfe kann ich ja nicht ablehnen :)
Achja, ShaderModel 3.0 kann meine GraKa auch, es ist 'ne GeForce 7100 mit einem halbwegs aktuellen Treiber (182.06). for()-Schleifen sollten also unterstützt werden.

Hoffe du wirst daraus schlau und kannst mir helfen (oder auch jemand anderes aus dem Forum!). Danke für die Hilfsbereitschaft!

Gruß mrtrain

Autor:  Ziz [ Mi Okt 14, 2009 05:25 ]
Betreff des Beitrags: 

Für mich sieht das so aus, als würdest du den String irgendwie falsch an OpenGL (bzw. den kompilierenden Treiber) übergeben. Wie sieht denn deine Compilierfunktion aus? Vielleicht gibt es irgendein Problem mit Unicode, den Delphistrings oder weiß der Deibel was...

Autor:  Coolcat [ Mi Okt 14, 2009 09:50 ]
Betreff des Beitrags: 

Ich vermute auch das du da beim laden irgendwas falsch machst. Kann es sein das dein String vielleicht um ein Zeichen zu kurz ist? Dann würde beim Vertexshader nämlich die Klammer am Ende fehlen, was die Probleme erklären würde.

Autor:  mrtrain [ Mi Okt 14, 2009 12:28 ]
Betreff des Beitrags: 

An sich 'ne gute Idee, aber andere Shader funktionieren auch. Ich hatte einen funktionierenden Shader (wenn ihr wollt kann ich ihn auch noch posten) und dann habe ich einfach nur in fopen() (achja - ich verwende C++ ;) ) den Dateinamen geändert. Der Fehler muss also beim Shader (oder beim Treiber) liegen.

Gruß mrtrain

Autor:  Coolcat [ Mi Okt 14, 2009 12:39 ]
Betreff des Beitrags: 

Vielleicht ist beim anderen Shader das letzte Zeichen ein Newline oder sonstiges Whitespace?

Autor:  mrtrain [ Mi Okt 14, 2009 16:46 ]
Betreff des Beitrags: 

Damit habe ich auch schon rumexperimentiert. :( Hilft nix.

Autor:  Ziz [ Mi Okt 14, 2009 16:58 ]
Betreff des Beitrags: 

Oder vielleicht ist die andere Datei falsch kodiert? Ansi statt UTF8 oder so?
Ich weiß leider nicht, was OpenGL will...

Autor:  Coolcat [ Mi Okt 14, 2009 17:11 ]
Betreff des Beitrags: 

Ja, wäre möglich das es daran liegt, nimm mal die Umlaute aus den Kommentaren, also ÄÖÜäöü und ß. Normalerweise kommentiert man Programme auf Englisch, dann hat man das Problem einfach nicht ;)

Autor:  mrtrain [ Mi Okt 14, 2009 23:48 ]
Betreff des Beitrags: 

Hmmm... Umlaute hab' ich nur einmal geunden bei "Möglicherweise" im Vertexshader. Die Suchfunktion von Notepad++ sollte eigentlich auch nix übersehen haben ;). Schade, immernoch die gleiche Fehlermeldung. Kann vielleicht mal einer von euch versuchen den Shader zu kompilieren? Ne Angabe von GPU-Hersteller und Treiber wär dabei natürlich auch ganz sinnvoll ;)

Edit: Äh, das mit dem UTF8 Standard war doch eher andersrum gemeint, oder? Hier muss doch ANSI-Code verwendet werden? Jedenfalls habe ich diesen Shader genauso abgespeichert, geladen und compiliert wie seinen funktionierenden Vorgänger.
Könnte nicht *bitte* einer von euch kurz versuchen den Shader zu kompilieren? Vielleicht hat ja einer einen anderen Treiber (z.B. von ATI), der eine hilfreichere Fehlermeldung ausgibt.

Gruß mrtrain

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