normalmap_pars_fragment.glsl 704 B

123456789101112131415161718192021222324252627
  1. #ifdef USE_NORMALMAP
  2. uniform sampler2D normalMap;
  3. uniform vec2 normalScale;
  4. // Per-Pixel Tangent Space Normal Mapping
  5. // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html
  6. vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {
  7. vec3 q0 = dFdx( eye_pos.xyz );
  8. vec3 q1 = dFdy( eye_pos.xyz );
  9. vec2 st0 = dFdx( vUv.st );
  10. vec2 st1 = dFdy( vUv.st );
  11. vec3 S = normalize( q0 * st1.t - q1 * st0.t );
  12. vec3 T = normalize( -q0 * st1.s + q1 * st0.s );
  13. vec3 N = normalize( surf_norm );
  14. vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;
  15. mapN.xy = normalScale * mapN.xy;
  16. mat3 tsn = mat3( S, T, N );
  17. return normalize( tsn * mapN );
  18. }
  19. #endif