Bump Map 1. High Field Function: H(u, v) New Normal : N’
Transcript of Bump Map 1. High Field Function: H(u, v) New Normal : N’
Bump Map
1
Bump Map
Bump Map High Field Function: H(u, v)
New Normal : N’
Bv
vuHT
u
vuHNN
),(),('
Modify Normal
3
Original Surface
normal
Bump Map
∂H∂u
Gradient
TNN
’
Modified Normal
Tangent
4
World Space : R3 Texture Space : R2
T
B
U
V
v
PB
u
PT
,
5
World Space :∆P Texture Space : (∆u, ∆v)∆u
∆v
T
B
∆P
BvTuP
**
Assume Surface is a Plane
Solve The Vector: T, BTriangle vertex position:
P0, P1, P2
Triangle vertex texture coordinates :C0 (U0, V0), C1(U1, V1), C2(U2, V2)
Let
vec3 P10 = P1 - P0
vec3 P20 = P2 – P0
vec2 C10 = C1 - C0 = (U1-U0, V1-V0) = ( U10 ,V10)
vec2 C20 = C2 – C0= (U2-U0, V2-V0) = ( U20 ,V20)
Solve
P10 = U10T + V10B
P20 = U20T + V20B
zyx
zyx
zyx
zyx
BBB
TTT
VU
VU
PPP
PPP
2020
1010
_20_20_20
_10_10_10
zyx
zyx
zyx
zyx
PPP
PPP
UU
VV
VUVUBBB
TTT
_20_20_20
_10_10_10
1020
1020
10202010
1=>
=>
The Codevoid ComputeTangentBasis( const vec3& P1, const vec3& P2, const vec3& P3, const vec2& UV1, const vec2& UV2, const vec2& UV3, vec3 &tangent, vec3 &bitangent ){ vec3 Edge1 = P2 - P1; vec3 Edge2 = P3 - P1; vec2 Edge1uv = UV2 - UV1; vec2 Edge2uv = UV3 - UV1; float cp = Edge1uv.x * Edge2uv.y – Edge2uv.x * Edge1uv.y; if ( cp != 0.0f ) { float mul = 1.0f / cp;
tangent = (Edge1 * Edge2uv.y + Edge2 * -Edge1uv.y) * mul; bitangent = (Edge1 * -Edge2uv.x + Edge2 * Edge1uv.x) * mul; }}