Virtual Realism
So far we have done flat shading and Gouraud/Phong shading
Not good to represent everything in real world
What are some of our other options?
Represent everything with tiny polygons
Geometry would get complicated very quickly
Apply textures across the polygons
This allows for less geometry but the image looks almost as good
• Pasting an image onto a model
• An image is mapped onto the 2D domain of a 3D model
Textures are almost always rectangular array of pixels called texels
(texture elements)
A texture is usually addressed by two numbers (s, t)
s and t takes values in [0,1]
A vertex can be associated with a point on the texture by giving it one of these texture coordinates
glTexCoord*(s,t); glVertex*(x,y,z);
[0, 1] t
[0,0] s
[1, 0]
Bitmap textures
Bitmapped representation of images
Represented by an array
}
Color3 texture(float s, float t){
Return txtr[(int)(s*c),(int)(t*r)]
Procedural textures
Defined by a mathematical function
In either case, we have a ‘texture function’
texture(s,t)
Texture space
(sx,sy)=T ws
(T tw
(s*,t*))
World space Screen space
• Associate points on texture with points on the polygonal face
– OpenGL uses the function glTexCoord*()
• sets the current texture coordinates
Similar to Gouraud shading
Consider the current scan line y s
For each x s
, compute the correct position P on the face
From that, obtain the correct texture coordinate (s,t)
(s
0
,t
0
) y top
(s
1
,t
1
)
(s
3
,t
3
) y s y bott
(s
2
,t
2
) x left x s x right
Linear interpolation does not work always!
This is because…
Equal steps across a projected space do not corresponds to equal steps across the 3D space
Notice that uniform steps on the image plane do not correspond to uniform steps along the edge.
Proper Interpolation
Texture space Eye space Screen space
If we move in equal steps across L s across texels along L t on the screen, how should we step in texture space?
Proper Interpolation
R(g) = lerp(A,B,g)
r(f)=lerp(a,b,f ), a = (a1, a2, a3, a4) or ( a1/a4, a2/a4, a3/a4)
r1(f) = lerp(a1/a4, b1/b4, f) r(f)
A
R(g) a
M b
B
•R(g) = lerp(A,B,g)
•In homogenous coordinate [R(g),1] t
•= [lerp(A,B,g),1] t
•After perspective transformation M([lerp(A,B,g),1] t )
•= lerp( M(A,1) t , M(B,1) t , g )
•=[ lerp( a1, b1, g ) , lerp( a2, b2, g) , lerp(a3, b3, g) , lerp( a4, b4, g) ]
•r1(f ) = lerp(a1,b1,g)/lerp(a4,b4,g)
Proper Interpolation
r1(f) = lerp(a1/a4, b1/b4, f)
r1(f ) = lerp(a1,b1,g)/lerp(a4,b4,g)
g = f / lerp((b4/a4), 1, f)
R(g) = A(1-g) + Bg
= lerp(A1/a4, B1/b4, f) / lerp( 1/a4, 1/b4, f)
y
Proper Interpolation b b’ right a’ left a
a cooresponds to A which maps to texture (Sa, Ta)
b corresponds to B which maps to texture ( Sb, Tb)
left = lerp(a,b,f)
s left(y)
=lerp(S
A
/a4, S
B
/b4, f) / lerp( 1/a4, 1/b4, f)
Similar for t left(y) and right pixel
Similar hyperbolic interpolation for intermediate pixels
Three different visual effects:
1.
Glowing objects
–
Intensity is set equal to the texture value: I = texture(s,t)
–
–
Object appears to emit light or glow
Color can be added by considering the red, green and blue components separately
2.
I
Modulate reflection coefficients
–
Make texture appear to be painted on the surface texture
I a
a
I d
d
lambert
I sp
s
( phong ) f
3.
Bump mapping
–
Model the roughness of the surface
Bump Mapping
Use texture map to perturb surface normal
Use texture array to set a function which perturbs surface normal
Apply illumination model using perturbed normal
• The ‘perturbed’ surface becomes:
P
texture u , u ,
• One approximation to new normal m ´ ( u,v ) is: m
m
where d is: d
m
P v
texture
m
P u
texture u v
• The ‘perturbed’ surface becomes:
P
texture u , u ,
• To find the new normal m´( u,v )
– Find two vectors tangent to the bumpy surface, then m´( u,v ) is their cross product
– The two vectors follow from the partial derivatives of the P ´(u,v) equation wrt u , v
Wrapping Texture on Curved Surfaces
Wrap a label around a cylinder
• Wrap a label onto a sphere
Hill 8.5.1 – 8.5.3, 8.5.5