2016-05-08 13 views
0

Ich habe Probleme mit der Intensität in Toon Shader. Der Wert der Intensität ist immer 0, sollte aber nicht sein und ich berechne ihn aus der Scheitelpunktnormalen und Lichtrichtung. Ich habe diese reference card verwendet.Null Intensität in GLSL Toon Shader

vertexShader: 

varying vec2 vUv; 
uniform vec3 ec_light_dir; 
uniform mat3 normal_matrix;     
varying float intensity; 
attribute vec3 a_normal; 
void main() { 
    vec3 ec_normal = normalize(normal_matrix * a_normal);   
    intensity = dot(ec_light_dir,ec_normal); 
    vUv = uv; 
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);} 


fragmentShader: 

uniform sampler2D tDiffuse; 
varying vec2 vUv; 

varying float intensity; 

void main() { 
    vec4 color = texture2D(tDiffuse, vUv); 
    if (intensity > 0.95) 
     color = vec4(1.0,1.0,0.5,0.5); 
    else if (intensity > 0.5) 
     color = vec4(0.6,0.3,0.3,1.0); 
    else if (intensity > 0.25) 
     color = vec4(0.4,0.2,0.2,1.0); 
    else 
     color = vec4(0.2,0.1,0.1,1.0); 
    gl_FragColor = color; 
} 

Können Sie mir sagen, was ich falsch mache? Warum ist Intensität immer Null?

+1

Es könnte negativ sein. Versuchen Sie, abs (...) – mrVoid

+0

Welche OpenGL-Version verwenden Sie? Dies kann nicht der vollständige Shader-Code sein, da Sie nicht definierte Variablen hätten. –

Antwort

0

Stellen Sie sicher, ec_light_dir ist normalisiert und a_normal ist kein Nullvektor. Zu diesem Zweck können Sie ihre Werte (einen pro Durchlauf) in gl_FragColor schreiben und die gezeichnete Farbe betrachten. Hinweis: Durch die Übergabe von ec_light_dir durch normalize() wird nicht sichergestellt, dass es normalisiert ist, da diese Funktion ein undefiniertes Verhalten hat, wenn ihr arg an erster Stelle ein Nullvektor war.