2016-05-08 5 views
0

トゥーンシェイダーの強度に問題があります。強度の値は常に0ですが、頂点の法線と光の方向から計算してはいけません。私はこれを使用しました reference cardGLSLトゥーンシェイダーの強度がゼロ

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

私が間違っていることを教えてください。なぜ強度は常にゼロですか?

+1

マイナスの可能性があります。試してみてください(...) – mrVoid

+0

どのようなOpenGLのバージョンを使用していますか?未定義の変数があるため、完全なシェーダコードにすることはできません。 –

答えて

0

ec_light_dirが正規化され、a_normalがゼロベクトルでないことを確認してください。この目的のために、値を(実行ごとに1つ)gl_FragColorに書き込んで、描画された色を見ることができます。注:ec_light_dirからnormalize()を渡しても、argが最初にゼロベクトルだった場合、その関数は未定義の振る舞いをしているため、正規化されているとは限りません。