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:

Wie man sieht, schaut der speculare Lichtanteil nicht rund, sondern sternförmig aus.
Vertex-Shader:
Fragment-Shader:
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.
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:

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
}
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: