normalmap_pars_fragment.glsl.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. export default /* glsl */`
  2. #ifdef USE_NORMALMAP
  3. uniform sampler2D normalMap;
  4. uniform vec2 normalScale;
  5. #endif
  6. #ifdef OBJECTSPACE_NORMALMAP
  7. uniform mat3 normalMatrix;
  8. #endif
  9. #if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )
  10. // Per-Pixel Tangent Space Normal Mapping
  11. // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html
  12. vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {
  13. // Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
  14. vec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );
  15. vec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );
  16. vec2 st0 = dFdx( vUv.st );
  17. vec2 st1 = dFdy( vUv.st );
  18. float scale = sign( st1.t * st0.s - st0.t * st1.s ); // we do not care about the magnitude
  19. vec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );
  20. vec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );
  21. vec3 N = normalize( surf_norm );
  22. #ifdef DOUBLE_SIDED
  23. // Workaround for Adreno GPUs gl_FrontFacing bug. See #15850 and #10331
  24. bool frontFacing = dot( cross( S, T ), N ) > 0.0;
  25. mapN.xy *= ( float( frontFacing ) * 2.0 - 1.0 );
  26. #else
  27. mapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );
  28. #endif
  29. mat3 tsn = mat3( S, T, N );
  30. return normalize( tsn * mapN );
  31. }
  32. #endif
  33. `;