Emboss Bump Mapping

advertisement
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
Download