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

Aktuelle Zeit: Fr Jul 18, 2025 22:00

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: GLSL: .xyz - mal ja mal nein?
BeitragVerfasst: Di Okt 13, 2009 19:24 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
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


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:13, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 13, 2009 19:38 
Offline
DGL Member
Benutzeravatar

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

_________________
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:
BeitragVerfasst: Di Okt 13, 2009 19:45 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
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!


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:14, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 13, 2009 19:56 
Offline
DGL Member
Benutzeravatar

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

_________________
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:
BeitragVerfasst: Di Okt 13, 2009 20:17 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
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


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:14, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 13, 2009 20:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Zeig mal deinen Code her... Vielleicht kann man dann mehr machen ;)

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  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 13, 2009 20:46 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
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


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:14, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 14, 2009 05:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
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...

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 14, 2009 09:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 14, 2009 12:28 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
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


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:14, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 14, 2009 12:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Vielleicht ist beim anderen Shader das letzte Zeichen ein Newline oder sonstiges Whitespace?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 14, 2009 16:46 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Damit habe ich auch schon rumexperimentiert. :( Hilft nix.


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:15, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 14, 2009 16:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Oder vielleicht ist die andere Datei falsch kodiert? Ansi statt UTF8 oder so?
Ich weiß leider nicht, was OpenGL will...

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 14, 2009 17:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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 ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 14, 2009 23:48 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
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


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:15, insgesamt 1-mal geändert.

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 2 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.011s | 15 Queries | GZIP : On ]