43 lines
1.1 KiB
Plaintext
43 lines
1.1 KiB
Plaintext
|
#ifdef USE_NORMALMAP
|
||
|
|
||
|
uniform sampler2D normalMap;
|
||
|
uniform vec2 normalScale;
|
||
|
|
||
|
#ifdef OBJECTSPACE_NORMALMAP
|
||
|
|
||
|
uniform mat3 normalMatrix;
|
||
|
|
||
|
#else
|
||
|
|
||
|
// Per-Pixel Tangent Space Normal Mapping
|
||
|
// http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html
|
||
|
|
||
|
vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {
|
||
|
|
||
|
// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
|
||
|
|
||
|
vec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );
|
||
|
vec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );
|
||
|
vec2 st0 = dFdx( vUv.st );
|
||
|
vec2 st1 = dFdy( vUv.st );
|
||
|
|
||
|
float scale = sign( st1.t * st0.s - st0.t * st1.s ); // we do not care about the magnitude
|
||
|
|
||
|
vec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );
|
||
|
vec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );
|
||
|
vec3 N = normalize( surf_norm );
|
||
|
mat3 tsn = mat3( S, T, N );
|
||
|
|
||
|
vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;
|
||
|
|
||
|
mapN.xy *= normalScale;
|
||
|
mapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );
|
||
|
|
||
|
return normalize( tsn * mapN );
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif
|