DGL https://delphigl.com/forum/ |
|
Phong-Beleuchtung https://delphigl.com/forum/viewtopic.php?f=20&t=9358 |
Seite 1 von 1 |
Autor: | SunBlack [ Sa Jul 24, 2010 19:12 ] |
Betreff des Beitrags: | Phong-Beleuchtung |
Hallo ihr, ich versuche mich gerade an der Phong-Beleuchtung. Nur scheitere ich gerade gedanklich an der spekularen Reflexion. Woher bekomme ich die Reflexionsrichtung? Die Lichtrichtung ist ja einfach gl_LightSource[0].position.xyz. Zur Reflexionsrichtung habe ich gefunden, dass das hier gehen soll: gl_LightSource[0].halfVector.xyz. Nur was ist der halfVector hier genau? Also zwischen welchen beiden Vectoren ist er die Hälfte? Zw. Lichtrichtung und ...? Oder muss Reflexionsrichtung selbere berechnen (Lichtrichtung an der Normalen spiegeln)? Besten Dank im Voraus SunBlack |
Autor: | Flash [ So Jul 25, 2010 00:35 ] |
Betreff des Beitrags: | Re: Phong-Beleuchtung |
Vielleicht hilft dir das was im Wiki unter Beleuchtung steht. |
Autor: | SunBlack [ So Jul 25, 2010 10:23 ] |
Betreff des Beitrags: | Re: Phong-Beleuchtung |
Leider nein, da dort der HalfVector nicht erklärt wird. |
Autor: | Sellmann [ So Jul 25, 2010 10:25 ] |
Betreff des Beitrags: | Re: Phong-Beleuchtung |
Der Reflexionsvektor ist wie der Name schon sagt, der Vektor in dem das Licht auf der Oberfläche reflektiert wird. Da gibts ein einfaches Gesetz für. Eintrittswinkel = Austrittswinkel. Im Prinzip muss der Lichtvektor um 180° an der Normalen gedreht werden und wird hinterher invertiert, damit er wieder von der Oberfläche wegzeigt. Gibt vielleicht auch einfacherer Möglichkeiten den Vektor zu berechnen. Die Sache mit dem Halfvektor funktioniert anders. Man nimmt den Betrachtervektor und den Lichtvektor und sucht den idealen Vektor dazwischen. Das ist genau der Vektor in der mitte, deshalb ja Halfvektor. Anhand der Abweichung zwischen Betrachtervektor und Halfvektor (beide Vektoren normieren und Skalarprodukt anwenden) kann jetzt ermittelt werden, wie hoch die Intensität der Spekularanteile ist. P.S.: Den Halfvektor könnte man glaub ich berechnen indem man den Betrachtervektor und den Lichtvektor addiert, normiert und dann invertiert. |
Autor: | Flash [ So Jul 25, 2010 11:49 ] |
Betreff des Beitrags: | Re: Phong-Beleuchtung |
Also das mit dem Halfvector hab ich jetzt nicht wirklich verstanden. Das was im Wiki steht ist das, was man mir an der Uni zum Phong Shading beigebracht hat. inkl. der Zeichnungen. Da ist jetzt kein Halfvector mit dabei, sondern nur der Winkel zwischen Reflektierten Licht und Betrachtervector. Für was brauchst du denn den Halfvector? |
Autor: | Coolcat [ So Jul 25, 2010 12:09 ] | ||
Betreff des Beitrags: | Re: Phong-Beleuchtung | ||
Zitat: Für was brauchst du denn den Halfvector? Es gibt zwei Beleuchtungsmodelle: "Phong" und "Phong-Blinn Approximation" Das erste steht im Wiki, das zweite ist geringfügig schneller und wird von OpenGL benutzt. Ich hänge einfach mal die zwei Seiten dazu aus dem Skript meiner CG-Vorlesung an.
|
Autor: | SunBlack [ So Jul 25, 2010 12:22 ] |
Betreff des Beitrags: | Re: Phong-Beleuchtung |
Flash hat geschrieben: Für was brauchst du denn den Halfvector? Alle Implementierungen vom Phong-Shader haben bisher diesen Halfvector benutzt. Des wegen hatte ich jetzt nachgrefragt, was er genau bedeutet. PS: Wie spiegele ich den Lichtvektor an der normalen? |
Autor: | mrtrain [ So Jul 25, 2010 12:46 ] |
Betreff des Beitrags: | Re: Phong-Beleuchtung |
Also, wenn man das per Shader (GLSL) implementiert, wird man dafür wohl die fertige Funktion reflect verwenden. Im Wiki steht, dass diese folgende Formel verwendet: Resultierender Vektor = I-2 * dot(N,I) * N Wobei I der Vektor ist, der an der Ebene mit dem Normalenvektor N reflektiert wird. Gruß mrtrain |
Autor: | SunBlack [ So Jul 25, 2010 13:19 ] |
Betreff des Beitrags: | Re: Phong-Beleuchtung |
Danke für den Tipp mit reflect. Nur leider klappt es noch nicht ganz. Vertex-Shader: Code: ////////////////////////////////////////////////////////////////////////// // gebe Normale an Fragmentshader weiter ////////////////////////////////////////////////////////////////////////// varying vec3 lightDir; varying vec3 vertexNormal; void main() { // TODO: transformiere normale in eye space und normalisiere (1P) vertexNormal = normalize(gl_NormalMatrix * gl_Normal); lightDir = normalize(gl_LightSource[0].position.xyz); // standardtransformation des aktuellen Vertex gl_Position = ftransform(); } Fragmentshader: Code: ////////////////////////////////////////////////////////////////////////// // Berechne Beleuchtung fuer aktuelles Fragment. ////////////////////////////////////////////////////////////////////////// varying vec3 lightDir; varying vec3 vertexNormal; void main() { // TODO: phong shading implementieren (3P) // Berechne Terme für ambientes, diffuses und spekulares light // auf basis der Lichtquelle und Materialeigenschaften // ... // Setze berechnete Farbe vec4 ambient = (gl_LightModel.ambient + gl_LightSource[0].ambient) * gl_FrontMaterial.ambient; vec4 diffuse = gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse * max(0.0, dot(vertexNormal, lightDir)); float RdotV = max(0.0, dot(reflect(lightDir, vertexNormal), vertexNormal)); vec4 specular = gl_FrontMaterial.specular * gl_FrontMaterial.specular * pow(RdotV, gl_FrontMaterial.shininess); gl_FragColor = ambient + diffuse + specular; } Was ich mich dabei gerade auch Frage: Wird der Vertexshader nicht eigentlich pro Shader aufgerufen? Wenn ja ist doch die Normale zwischen zwei Vertexen nicht interpoliert, oder? |
Autor: | Coolcat [ So Jul 25, 2010 14:16 ] |
Betreff des Beitrags: | Re: Phong-Beleuchtung |
Zitat: Was ich mich dabei gerade auch Frage: Wird der Vertexshader nicht eigentlich pro Shader aufgerufen? Der Vertexshader wird pro Vertex aufgerufen, deswegen heißt der auch so ![]() Varying-Variablen wie z.B. dein vertexNormal werden dann über das Dreieck interpoliert bevor sie an den Fragmentshader gehen. Hier steckt der Fehler: Code: float RdotV = max(0.0, dot(reflect(lightDir, vertexNormal), vertexNormal)); Vermutlich hast du hier "Phong" und "Phong-Blinn" durcheinander geworfen. Der reflektierte Vektor ist NICHT der HalfVektor. Du berechnest den Winkel zwischen dem reflektierten Vektor und der Normale. Du brauchst aber den Winkel zwischen reflektiertem Vektor und Vektor zur Kamera. |
Autor: | SunBlack [ So Jul 25, 2010 14:49 ] |
Betreff des Beitrags: | Re: Phong-Beleuchtung |
Coolcat hat geschrieben: Vermutlich hast du hier "Phong" und "Phong-Blinn" durcheinander geworfen. Der reflektierte Vektor ist NICHT der HalfVektor. Du berechnest den Winkel zwischen dem reflektierten Vektor und der Normale. Du brauchst aber den Winkel zwischen reflektiertem Vektor und Vektor zur Kamera. Danke - das war es ![]() ![]() |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |