• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

phong shader mit sternförmigen specular light

m1au

New member
Hallo :)

Mich verwirrt mein Phong Shader. Ich habe:

- eine Kugel modelliert (um local-space (0, 0, 0) herum mit Radius 0.5)
- verschiebe diese Kugel um 2 in negative z-Richtung
- und habe die Lichtquelle im view-space auf (0, 0, 0) (also dort, wo die Kamera ist).

Vertex- und Fragment-shader sind absolut minimalistisch, damit ich ausschließen kann, dass der Fehler nicht im Javascript-Programm liegt.

Das Ergebnis schaut folgendermaßen aus:

stern.jpg

Wie man sieht, schaut der speculare Lichtanteil nicht rund, sondern sternförmig aus.

Vertex-Shader:
PHP:
uniform mat4 pMatrix;  // projection-Matrix zum Transformieren des Vertex vom view-space in clip-space

attribute vec4 mV;  // Vertex im model-space
attribute vec3 mVN; // Vertex-Normale im model-space
         
varying vec3 vVN;
varying vec3 vV;
varying vec3 vNegativeL;
         
void main(void)  
{     
   vV = mV.xyz + vec3(0.0, 0.0, -2.0); // Kugel-Vertices um 2 nach hinten verschieben
   vVN = normalize(mV.xyz); //mVN; // Vertex-Normale in view-space

   vNegativeL = normalize(-vV);

   gl_Position = pMatrix * vec4(vV, 1.0); // Vertex in clip-space 
}
Fragment-Shader:
PHP:
precision highp float;
                         
uniform vec3 colorAmbient;     
uniform vec3 colorDiffuse; 
uniform vec3 colorSpecular; 
uniform float materialShininess; 

varying vec3 vVN; // interpolierte Vertex-Normale in view-space
varying vec3 vV; // interpolierter Vertex in view-space     

varying vec3 vNegativeL;

void main (void)  
{   
   //calculate Ambient Term:  
   vec3 Iamb = colorAmbient;

   //calculate Diffuse Term:  
   vec3 Idiff = colorDiffuse * dot(vVN, vNegativeL);
   Idiff = clamp(Idiff, 0.0, 1.0);     
   
   // calculate Specular Term:
   vec3 h = normalize(-vV); // half-Vektor = normalize(fragment2Light + fragment2Eye), Lichtquelle und Auge auf (0, 0, 0)
   vec3 Ispec = colorSpecular * pow(dot(vVN, h), materialShininess);
   
   Ispec = clamp(Ispec, 0.0, 1.0); 

   // write Total Color:  
   gl_FragColor = vec4(Iamb + Idiff + Ispec, 1.0);                 
}

Kann mein Ergebnis wirklich stimmen? Sollte die Kugel wirklich so aussehen? Mit so einem sternförmigen specular Lichtanteil?

EDIT: Änderung. Habe im Vertex-Shader statt der mvpMatrix jetzt nur eine pMatrix, um eine mögliche Fehlerquelle zu eliminieren.

- - - Aktualisiert - - -

Also ich habe es jetzt irgendwie - mehr oder weniger durch Zufall - hinbekommen. Jetzt ist das specular light schön rund. Aber woran es gelegen hat, weiß ich nicht. Ich vermute, es hat irgendwo ein normalize gefehlt.
 
Zuletzt bearbeitet:
Sieht das Ergebniss denn genauso aus, wenn du von einem anderen Winkel auf die Kugel schaust? Denn man hat da ja nie eine perfekte Kugel und das könnten Artefakte vom Diskretisieren sein.

- - - Aktualisiert - - -

Ups... Aktualisierung nicht gelesen.
 
Zurück
Oben