DGL
https://delphigl.com/forum/

Sphere-Mapping in GLSL
https://delphigl.com/forum/viewtopic.php?f=20&t=6566
Seite 1 von 1

Autor:  MatReno [ Sa Mai 05, 2007 15:25 ]
Betreff des Beitrags:  Sphere-Mapping in GLSL

Hi,
ich frage mich, wie ich in GLSL das Sphere-Mapping der festen Pipeline nachbauen könnte.
Ich habe schon ein bisschen rumprobiert es hat allerdings nicht wirklich geklappt.
Es würde mir schon sehr helfen wenn ich wüsste wie ich die entsprechenden
Texturcoordinaten der Sphere Map berechnen kann, oder zumindest die Idee dahinter verstehe.

Vielen Dank für eure Antworten (die hoffentlich kommen :wink:),
MatReno

Autor:  Traude [ Sa Mai 05, 2007 22:46 ]
Betreff des Beitrags: 

Ist das jetzt eine Shaderfrage oder eine Frage zum Kugelmapping? Denn bei Shadern kenne ich mich nicht aus. Dafür habe ich hier einen 1A Link für Dich, was das Verständnis für Kugelmapping anlangt. Es handelt sich um Kartenprojektionen. Nicht erschrecken - runterblättern bis zur Überschrift "Zylindrische Projektionen" und dort das Bild mit der Unterschrift "Entstehung der Mercatorkarte" ansehen: http://www.kowoma.de/gps/geo/Projektionen.htm Der übrige Inhalt der Website ist aber auch ziemlich interessant für Leute, die sich mit dem Erstellen von Texturkoordinaten beschäftigen.
Traude

EDIT: offensichtlich hab ich Dich missverstanden. Denn ich hab in einer anderen Website (http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node176.html) die Erklärung gefunden:

Zitat:
OpenGL has built in support for an environment mapping parameterization know as sphere mapping. Sphere mapping is a type of environment mapping in which the irradiance image is equivalent to that which would be seen in a perfectly reflective hemisphere when viewed using an orthographic projection.


Wie man eine orthographische Projektion einer Kugeloberfläche anfertigt, ist in der ersten angeführten Website prinzipiell auch zu sehen (nur vom Verständnis her, Formeln sind keine enthalten): siehe dort unter "Planare oder azimutale Projektionen".




Ha, ich habe noch etwas gefunden: http://www.bluevoid.com/opengl/sig00/advanced00/notes/node184.html betitelt "The Mathematics of Sphere Mapping" und bezieht sich auf OpenGL.

Autor:  MatReno [ So Mai 06, 2007 11:42 ]
Betreff des Beitrags: 

Hey thanks,
hat mir schon mal weitergeholfen. Mal sehen, ob ich mit der Berechnung die da angegeben ist auch zu einem Ergebnis komme.
Ich hatte nämlich schon vorher eine Berechnung zu den koordinaten gesehen, die aber nicht funktioniert hat.
Diese sieht schon mal anders aus!
Werde mich nochmal melden, falls was bei heraus kommt, und wenn nicht auch ;)

Autor:  MatReno [ Di Mai 08, 2007 15:17 ]
Betreff des Beitrags: 

So, da bin ich wieder ;)
Ich habe jetzt einen einigermaßen stimmig aussehenden Shader gebastelt.
Wenn ich das Objekt drehe (rechte Maustaste + drag) scheint es zu stimmen.
Am besten zu sehen ist es auf der Kugel (mit Space Objekte durchschalten)!
Dreht die Objekte einfach mal alle, denn für mich sieht das so aus, als ob es stimmt, oder?

Wenn man sich jetzt allerdings mit der Camera bewegt stimmt das ganze nicht mehr (linke Maustaste + drag + WASD) :(
Zur Veranschaulichung habe ich das Beispielprogramm mal hier: http://texelviews.delphigl.com/downloads/SphereMapping.zip hochgeladen.

Zu test-zwecken habe ich eine Spheremap benutzt, die relativ einfach nachvollziehbar ist. (FR.bmp)
Ich hoffe ihr könnt mir helfen.

PS: Was ganz wichtig ist für die, die sich den Shader anschauen: Meine Camera wird in der Projection-Matrix gesetzt!!

Autor:  MatReno [ Di Sep 11, 2007 09:36 ]
Betreff des Beitrags: 

Der Shader funktioniert nun :D
Aber eine Frage bleibt noch offen:
Momentan setze ich die Kamera in der ModelviewMatrix, möchte sie aber gern in
die ProjektionsMatrix packen.
Jedoch wenn ich das tue funktioniert das Spheremapping nur,
wenn ich die Kamera auf <0, 0, z> stehen lasse (ViewVector: <0, 0, -1>).
Sobald ich die kamera bewege, stimmen offensichtlich die Berechnungen nicht mehr :(

Was müsste ich im Shader ändern, damit die Camera auch in der ProjektionsMatrix
stehen kann?

Hier der aktuelle VertexShader (funzt mit Kamera in der ModelviewMatrix):
Code:
  1. uniform vec3 uEyePos;
  2.  
  3. void main(void)
  4. {
  5.   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  6.  
  7.   // Position des Vertex'
  8.   vec3 v = normalize(vec3(gl_ModelViewMatrix * gl_Vertex));
  9.  
  10.   // Normale des Vertex'
  11.   vec3 n = normalize(gl_NormalMatrix * gl_Normal);
  12.  
  13.   // Vector von der Camera zum Vertex
  14.   vec3 view = normalize(v - uEyePos);
  15.  
  16.   vec3 r = reflect(v, n);
  17.  
  18.   float m = 2.0 * sqrt( r.x*r.x + r.y*r.y + (r.z+1.0)*(r.z+1.0) );
  19.   gl_TexCoord[0].s = r.x/m + 0.5;
  20.   gl_TexCoord[0].t = r.y/m + 0.5;
  21. }


Im Fragment Shader wird nur gl_FragColor mit Hilfe der berechneten TexturKoordinaten gesetzt.
Bitte um Hilfe :)

PS: Der oben angegebene Link funktioniert nicht mehr.

Autor:  WhiteHunter [ Di Sep 11, 2007 15:29 ]
Betreff des Beitrags: 

MatReno hat geschrieben:
Code:
  1.  
  2.   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  3.  
  4.   // Position des Vertex'
  5.   vec3 v = normalize(vec3(gl_ModelViewMatrix * gl_Vertex));
  6.  


Schon mal bei v auch gl_ModelViewProjectionMatrix probiert?

MfG

Autor:  MatReno [ Mi Sep 12, 2007 09:33 ]
Betreff des Beitrags: 

Danke für deine Antwort!
Leider hab ich das schon mal probiert... Das Ergebnis hatte sich verschlechtert, d.h. es war kein Ansatz von SphereMapping mehr zu erkennen.
Ich schätze, dass man noch irgendwas mit den Normalen machen muss... Denn die gl_NormalMatrix ist ja die Inverse der 3er gl_ModelViewMatrix und nicht die der gl_ModelViewProjectionMatrix.

Vielleicht muss ich ja nur irgendwie die berechneten Normalen (n) verändern, die Kamera-Position hab ich ja und auch den View-Vektor, diese beiden resultieren ja quasi aus der Projektions-Matrix...
Leider weiß ich nicht wo ich was ändern muss, und stupide rumprobieren hat auch nix gebracht :(
Ich bin für jeden Tipp/Idee sehr dankbar!

Autor:  WhiteHunter [ Mi Sep 12, 2007 16:47 ]
Betreff des Beitrags: 

Eben nachgeschaut, scheint zu stimmen: gl_NormalMatrix ist die transponierte und inverse Bearbeitung der linken oberen mat3 von gl_ModelViewMatrix. Nach den GLSL-Doks zu urteilen, müsstest du mal statt
Code:
  1. gl_NormalMatrix
Code:
  1. mat3(gl_ModelViewProjectionMatrixInverseTranspose)
probieren.

MfG

Autor:  MatReno [ Do Sep 13, 2007 14:37 ]
Betreff des Beitrags: 

Ich hab es mal probiert und auch sämtliche Kombinationen die mir eingefallen sind.
Es will einfach nicht funktionieren :x
So langsam frage ich mich, ob das überhaupt möglich ist...
Trotzdem Danke für deine Tipps!
Wäre es hilfreich, wenn ich das Beispielprogramm noch mal hochladen würde? Dann könntest du / ihr mal versuchen den
VertexShader zu verändern.
Außerdem könnte ich noch das Programm hochladen, wo die Kamera in der ModelviewMatrix steckt. Quasi als funktionierende Referenz.

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