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

Aktuelle Zeit: Do Jul 17, 2025 14:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jun 21, 2007 18:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hi @ll

Ich hab mal wieder ein Shaderproblem.

Und zwar will ich den Winkel zwischen einer Ebene (die Normale wird bereits mit übergeben) und dem Betrachtervektor berechnen. Allerdings klappt das überhaupt nicht, das Ergebnis ist alles andere als befriedigend...

Vertex Shader:
Code:
  1.  
  2. varying vec4 vpos;
  3. varying vec3 normal;
  4. varying vec3 view;
  5.  
  6. void main(void)
  7. {
  8.   normal          = normalize(gl_Normal);
  9.   vpos            = gl_Vertex;
  10.   view            = normalize(vec3(-(gl_ModelViewMatrix * gl_Vertex)));
  11.   gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  12.   gl_TexCoord[0]  = gl_MultiTexCoord0;
  13.   gl_FrontColor   = gl_Color;
  14. }
  15.  


Fragment Shader:
Code:
  1.  
  2. varying vec4 vpos;
  3. varying vec3 normal;
  4. varying vec3 view;
  5.  
  6. void main(void)
  7. {
  8.   float angle;
  9.  
  10.   angle = acos(dot(view, normal)/(length(view)*length(normal)));
  11.  
  12.   gl_FragColor = vec4(angle/(2.0*3.14159), 0.0, 0.0, 1.0);
  13. }
  14.  


Also ein Problem ist beispielsweise, dass wenn ich den Blickwinkel verändere sich das ganze ganz komisch mitbewegt. Oder auch nicht.

Ich hoffe, mir kann da irgendjemand helfen.

Gruß Lord Horazont

_________________
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: Fr Jun 22, 2007 15:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

müsstest du nicht vorher noch die Normale mit der Normalen-Transformationsmatrix multiplizieren?

Viele Grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 22, 2007 18:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das verbessert das ganze zwar, löst das Problem allerdings nicht. Es kommt immernoch zu komischen Rotationen....

Gruß Lord Horazont

_________________
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: Fr Jun 22, 2007 21:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Du brauchst übrigens bei der Winkelberechnung nicht durch die Längen des Normalen- und Betrachtervektors zu teilen, da diese durch die Normalisierung jeweils 1 sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 24, 2007 11:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das bringt mich allerdings auch nicht sonderlich weiter... Ich habe immernoch das Problem, dass sich das ziehmlich komisch verhält. Irgendwie sieht es fast so aus wie schlechtes Per-Vertex Lightning, nur invertiert.

Gruß Lord Horazont

_________________
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: So Jun 24, 2007 21:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hmm...was mich noch gewundert hat, ist das Minus bei deinem View-Vektor und das du bei gl_FragColor durch 2*Pi teilst...normalerweise liefert acos einen Wert zwischen 0 und Pi...

Kannst du vielleicht nochmal deinen geänderten Code schicken und am besten noch einen Screenshot?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 26, 2007 15:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Im moment ungünstig, ich komme an meine Festplatte wegen Rechnerumbauten nur schwer ran, kann also noch ein wenig dauern.

Gruß Lord Horazont

_________________
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: So Jul 01, 2007 14:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 28, 2007 16:40
Beiträge: 7
Das ist wohl GLSL, das kann ich nicht wirklich lesen.

Aber allgemein:

dot, also das Punktprodukt, liefert dir ja den Kosinus zwischen den Vektoren (wenn sie wie bei dir normalisiert sind)
Wenn die also in die gleiche Richtung zeigen (Winkel = 0 Grad), kriegst du eine 1,
wenn der Winkel zwischen den beiden 90 Grad ist, eine 0 und
wenn sie in die entgegengesetzte Richtung zeigen (Winkel = 180 Grad) eine -1.

Ich schätze mal, du willst den rot Anteil = 1 haben, wenn du genau von oben auf die Fläche guckst, und rot = 0, wenn du seitlich drauf guckst.

Dann müsstest du schreiben (wenn view die Richtung ist, in die die Kamera guckt (Achtung es muss die Richtung sein und nicht die Viewing Position) ):

gl_FragColor = vec4(-1.0 * dot(view, normal), 0.0, 0.0, 1.0);

Dann hättest du allerdings für rot einen negativen Wert, wenn du von hinten auf die Fläche guckst (also der Winkel zwischen Blickrichtung und Normale zwischen 0 und 90 Grad ist), aber das sollte ja egal sein, ansonsten könntest du z.B. den absolut Wert vom Punktprodukt benutzen (wenn die Fläche auch von hinten gerendert werden soll): abs(dot(view, normal))

Da fällt mir gerade auf, du berechnest dot im Fragment Shader. Das beseitigt zumindest bei mir alle Klarheiten. Trotzdem was ich grad geschrieben habe, stimmt schon mal, vielleicht hilfts ja.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]