2016-05-08 3 views
0

J'ai un problème d'intensité dans le toon shader. La valeur de l'intensité est toujours 0 mais elle ne devrait pas l'être et je la calcule à partir de la direction normale et de la direction du vertex. J'ai utilisé ce reference card.intensité zéro dans le shader GLSL toon

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

Pourriez-vous me dire ce que je fais mal? Pourquoi l'intensité est-elle toujours nulle?

+1

Il peut être négatif. Essayez abs (...) – mrVoid

+0

Quelle version d'OpenGL utilisez-vous? Cela ne peut pas être le code de shader complet, puisque vous auriez des variables indéfinies. –

Répondre

0

Assurez-vous que ec_light_dir est normalisé et que a_normal n'est pas un vecteur zéro. Pour ce faire, vous pouvez écrire leurs valeurs (une par série) dans gl_FragColor et regarder la couleur dessinée. Note: passer ec_light_dir à normalize() ne garantit pas qu'il est normalisé, car cette fonction a un comportement indéfini si son argument était un vecteur zéro en premier lieu.