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

Aktuelle Zeit: Fr Jul 11, 2025 07:06

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Phong-Beleuchtung
BeitragVerfasst: Sa Jul 24, 2010 19:12 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Phong-Beleuchtung
BeitragVerfasst: So Jul 25, 2010 00:35 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Vielleicht hilft dir das was im Wiki unter Beleuchtung steht.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Phong-Beleuchtung
BeitragVerfasst: So Jul 25, 2010 10:23 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Leider nein, da dort der HalfVector nicht erklärt wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Phong-Beleuchtung
BeitragVerfasst: So Jul 25, 2010 10:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
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.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Phong-Beleuchtung
BeitragVerfasst: So Jul 25, 2010 11:49 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
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?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Phong-Beleuchtung
BeitragVerfasst: So Jul 25, 2010 12:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.


Dateianhänge:
phong-blinn.pdf [77.16 KiB]
405-mal heruntergeladen

_________________
Yeah! :mrgreen:
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Phong-Beleuchtung
BeitragVerfasst: So Jul 25, 2010 12:22 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Phong-Beleuchtung
BeitragVerfasst: So Jul 25, 2010 12:46 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
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


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:37, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Phong-Beleuchtung
BeitragVerfasst: So Jul 25, 2010 13:19 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Phong-Beleuchtung
BeitragVerfasst: So Jul 25, 2010 14:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Phong-Beleuchtung
BeitragVerfasst: So Jul 25, 2010 14:49 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
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 :) (abgesehen davon lightDir falsch war ;) )


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 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.010s | 17 Queries | GZIP : On ]