Spaces:
Running
Running
| export default /* glsl */ ` | |
| #ifdef USE_BUMPMAP | |
| uniform sampler2D bumpMap; | |
| uniform float bumpScale; | |
| // Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen | |
| // https://mmikk.github.io/papers3d/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, float faceDirection ) { | |
| // 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 ) * faceDirection; | |
| vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 ); | |
| return normalize( abs( fDet ) * surf_norm - vGrad ); | |
| } | |
| #endif | |
| `; | |