45 lines
1.3 KiB
GLSL
45 lines
1.3 KiB
GLSL
#ifdef USE_BUMPMAP
|
|
|
|
uniform sampler2D bumpMap;
|
|
uniform float bumpScale;
|
|
|
|
// Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen
|
|
// http://api.unrealengine.com/attachments/Engine/Rendering/LightingAndShadows/BumpMappingWithoutTangentSpace/mm_sfgrad_bump.pdf
|
|
|
|
// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)
|
|
|
|
vec2 dHdxy_fwd() {
|
|
|
|
vec2 dSTdx = dFdx( vUv );
|
|
vec2 dSTdy = dFdy( vUv );
|
|
|
|
float Hll = bumpScale * texture2D( bumpMap, vUv ).x;
|
|
float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;
|
|
float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;
|
|
|
|
return vec2( dBx, dBy );
|
|
|
|
}
|
|
|
|
vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {
|
|
|
|
// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
|
|
|
|
vec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );
|
|
vec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );
|
|
vec3 vN = surf_norm; // normalized
|
|
|
|
vec3 R1 = cross( vSigmaY, vN );
|
|
vec3 R2 = cross( vN, vSigmaX );
|
|
|
|
float fDet = dot( vSigmaX, R1 );
|
|
|
|
fDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );
|
|
|
|
vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );
|
|
return normalize( abs( fDet ) * surf_norm - vGrad );
|
|
|
|
}
|
|
|
|
#endif
|