# Michael I. Gold NVIDIA Corporation

## Presentation on theme: "Michael I. Gold NVIDIA Corporation"— Presentation transcript:

Michael I. Gold NVIDIA Corporation
Emboss Bump Mapping Michael I. Gold NVIDIA Corporation

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),

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!

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)

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

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

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)

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

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

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 !!

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

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

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)

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 scale by 2 brightens the image