DGL
https://delphigl.com/forum/

Winkel zwischen Normale und Betrachter
https://delphigl.com/forum/viewtopic.php?f=20&t=6690
Seite 1 von 1

Autor:  Lord Horazont [ Do Jun 21, 2007 18:18 ]
Betreff des Beitrags:  Winkel zwischen Normale und Betrachter

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

Autor:  dj3hut1 [ Fr Jun 22, 2007 15:19 ]
Betreff des Beitrags: 

Hallo,

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

Viele Grüße
dj3hut1

Autor:  Lord Horazont [ Fr Jun 22, 2007 18:14 ]
Betreff des Beitrags: 

Das verbessert das ganze zwar, löst das Problem allerdings nicht. Es kommt immernoch zu komischen Rotationen....

Gruß Lord Horazont

Autor:  dj3hut1 [ Fr Jun 22, 2007 21:14 ]
Betreff des Beitrags: 

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.

Autor:  Lord Horazont [ So Jun 24, 2007 11:27 ]
Betreff des Beitrags: 

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

Autor:  dj3hut1 [ So Jun 24, 2007 21:36 ]
Betreff des Beitrags: 

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?

Autor:  Lord Horazont [ Di Jun 26, 2007 15:53 ]
Betreff des Beitrags: 

Im moment ungünstig, ich komme an meine Festplatte wegen Rechnerumbauten nur schwer ran, kann also noch ein wenig dauern.

Gruß Lord Horazont

Autor:  fireandice91 [ So Jul 01, 2007 14:00 ]
Betreff des Beitrags: 

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.

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