DGL
https://delphigl.com/forum/

Betrachterposition im Shader
https://delphigl.com/forum/viewtopic.php?f=20&t=5845
Seite 1 von 1

Autor:  Lord Horazont [ Mi Aug 23, 2006 13:00 ]
Betreff des Beitrags:  Betrachterposition im Shader

Hi @ll

Ich arbeite immernoch an meiner kleinen Wasserszene und wollte jetzt einen "Unterwassernebel" bauen. Allerdings bräuchte ich dazu die Betrachterposition, also mit Rotation und Translation.

Wie komme ich an diese Position?

Gruß Lord Horazont

Autor:  WhiteHunter [ Do Aug 24, 2006 00:41 ]
Betreff des Beitrags: 

Hi,

das dürfte ziemlich simpel sein, wenn ich mich nicht irre:
Die Position des Vertex relativ zum Betrachter ist die ModelView-Matrix multipliziert mit den Vertexkoordinaten.
Code:
  1. (gl_ModelViewMatrix * gl_Vertex)

Das ist der Vektor ausgehend vom Betrachter zum Vertex. Eventuell wirst du dann auch eine normalisierte Form mittels normalize() bevorzugen.
Falls du einen Vektor ausgehend vom Vertex zum Betrachter willst, einfach das Ergebnis negieren; sprich
Code:
  1. -(gl_ModelViewMatrix * gl_Vertex)


MfG

Autor:  Lord Horazont [ Do Aug 24, 2006 10:35 ]
Betreff des Beitrags: 

hmm...
schaut schonmal besser aus, als meine versuche.
Aber so ganz klappen tuts noch nicht. Ich habe das erstmal in einer Testszene mit einer 20x20 Einheiten großen Quad-Fläche getestet.

Szene:
Code:
  1.  
  2.   glColor4f(1.0, 1.0, 1.0, 1.0);
  3.   glBegin(GL_QUADS);
  4.     glVertex3f(-10.0, 0.0, -10.0);
  5.     glVertex3f(-10.0, 0.0, 10.0);
  6.     glVertex3f(10.0, 0.0, 10.0);
  7.     glVertex3f(10.0, 0.0, -10.0);
  8.   glEnd;
  9.  


Vertex shader:
Code:
  1.  
  2. varying vec4 vpos;
  3. varying vec4 cpos;
  4.  
  5. void main(void)
  6. {
  7.   vpos            = gl_Vertex;
  8.   cpos            = gl_ModelViewMatrix * gl_Vertex;
  9.   gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  10.   gl_TexCoord[0]  = gl_MultiTexCoord0;
  11.   gl_FrontColor   = gl_Color;
  12. }
  13.  


Fragment shader:
Code:
  1.  
  2. varying vec4 vpos;
  3. varying vec4 cpos;
  4.  
  5. void main(void)
  6. {
  7.   gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0) * (1.0 - distance(vpos, cpos)/10.0);
  8. }
  9.  


Das entspricht noch nicht so ganz meinen vorstellungen.

// EDIT:
Ich habs! ich habe anstatt vpos in der distance() funktion einfach vec4(0.0, 0.0, 0.0, 0.0) eingesetzt und schon funktionierts =)
Ein neuer Screenshot meines Wassers:
Bild
Hmm... Allerdings müsste ich irgendwie die Rotation der Y-Achse ausklinken.

Gruß Lord Horazont

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