Emboss Bump Mapping Michael I. Gold NVIDIA Corporation 1 Bump Mapping Real bump mapping uses per-pixel lighting • Lighting calculation at each pixel based on perturbed normal vectors • Computationally expensive • For more information see: Blinn, J. Simulation of Wrinkled Surfaces. Computer Graphics. 12, 3 (August 1978), 286292 2 Emboss Bump Mapping Emboss bump mapping is a hack • • • • Diffuse lighting only, no specular component Under-sampling artifacts Possible on today’s consumer hardware If it looks good, do it! 3 Diffuse Lighting Calculation C = (L•N) Dl Dm • • • • • • L is light vector N is normal vector Dl is light diffuse color Dm is material diffuse color Bump mapping changes N per pixel Emboss bump mapping approximates (L•N) 4 Approximate diffuse factor L•N Texture map represent height field • • • • [0,1] height represents range of bump function First derivative represents slope m m increases/decreases base diffuse factor Fd (Fd+m) approximates (L•N) per pixel 5 Approximate derivative Embossing approximates derivative • Lookup height H0 at point (s,t) • Lookup height H1 at point slightly perturbed toward light source (s+s, t+t) • subtract original height H0 from perturbed height H1 • difference represents instantaneous slope m=H1-H0 6 Compute the Bump Original bump (H0) Original bump (H0) overlaid with second bump (H1) perturbed toward light source brightens image darkens image Subtract original bump from second (H1-H0) 7 Compute the Lighting Evaluate fragment color Cf • Cf = (L•N) Dl Dm • (L•N) (Fd + (H1-H0)) • Dm Dl encoded in surface texture color Ct – Could control Dl seperately if you’re clever • Cf = (Fd + (H1-H0)) Ct 8 Is that all? Its so easy! We’re not quite done yet. We still must • • • • Build a texture Calculate texture coordinate offsets s, t Calculate diffuse factor Fd Both are derived from normal N and light vector L • Now we have to do some math 9 Building a Texture Conserve Textures! • Current multitexture hardware only supports two textures • Bump map in ALPHA channel – Maximum bump = 1.0 – Level ground = 0.5 – Maximum depression = 0.0 • Surface color in RGB channels • Set internalformat to RGBA8 !! 10 Calculate Texture Offsets Rotate light vector into normal space • Need Normal coordinate system • Derive coordinate system from normal and “up” vector – Normal is z-axis – Cross product is x-axis – Throw away up vector, derive y-axis as cross product of x- and z-axes • Build 3x3 matrix from axes • Transform light vector into Normal space 11 Calc Texture Offsets (cont’d) Use normal-space light vector for offsets • L’ = Mn L • Use L’x, L’y for s, t • Use L’z for diffuse factor! – If light vector is near normal, L’x, L’y are small – If light vector is near tangent plane, L’x and L’y are large • What is L’z is less than zero? – Light is on opposite side from normal – Fade contribution toward zero 12 Implementation on TNT • Calculate vectors, texcoords on the host • Pass diffuse factor as vertex alpha – Could use vertex color for light diffuse color • H0 and surface color from texture unit 0 • H1 from texture unit 1 (same texture, different coordinates) • ARB_multitexture extension • Combiners extension (TBD) 13 Implementation on TNT (cont’d) Combiner 0 alpha setup: • (1-T0a) + T1a - 0.5 – T1a-T0a maps to [-1,1] but hardware clamps to [0,1] – 0.5 bias balances the loss from clamping • Could modulate light diffuse color with T0c Combiner 1 rgb setup • (T0c*C0a + T0c*Fda - 0.5) * 2 – 0.5 bias balances the loss from clamping – scale by 2 brightens the image 14