2IV60_8_shading

advertisement
2IV60 Computer graphics
set 8: Illumination Models and
Surface-Rendering Methods
Jack van Wijk
TU/e
OpenGL Illumination example
Glfloat lightPos[]
= {2.0, 0.0, 3.0, 0.0};
Glfloat whiteColor[] = {1.0, 1.0, 1.0, 1.0};
Glfloat pinkColor[] = {1.0, 0.5, 0.5, 1.0};
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
// Use smooth shading
// Enable lighting
// Enable light source #0
glLightfv(GL_LIGHT0, GL_POSITION, lightPos); // position LS 0
glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteColor); // set color LS 0
glMaterialfv(GL_FRONT, GL_DIFFUSE, pinkColor); // set surface
// color
glBegin(GL_TRIANGLES);
glNormal3fv(n1); glVertex3fv(v1); // draw triangle, give
glNormal3fv(n2); glVertex3fv(v2); // first normal, followed
glNormal3fv(n3); glVertex3fv(v3); // by vertex
glEnd();
What is going on here?
Introduction 1
Illumination model:
Given a point on a surface, what is the perceived
color and intensity? Known as Lighting Model,
or Shading Model
Surface rendering:
Apply the Illumination model to color all pixels
of the surface.
H&B 17:531-532
Introduction 2
Example:
• Illumination model gives color
vertices,
• Surface is displayed via
interpolation of these colors.
H&B 17:531-532
Introduction 3
Illumination:
• Physics:
– Material properties, light sources, relative
positions, properties medium
• Psychology:
– Perception, what do we see
– Color!
• Often approximating models
H&B 17:531-532
Light sources 1
Light source: object that radiates energy.
Sun, lamp, globe, sky…
Intensity I = (Ired , Igreen , Iblue)
If Ired = Igreen = Iblue : white light
H&B 17-1:532-536
Light sources 2
Simple model: point light source
- position P and intensity I
- Light rays along straight lines
- Good approximation for small
light sources
H&B 17-1:532-536
Light sources 3
Simpler yet: point light source at infinity
- Direction V and intensity I
- Sunlight
V
H&B 17-1:532-536
Light sources 4
Damping: intensity of light decreases with distance
Energy is distributed over area sphere, hence
I l = I / d 2,
d
with d distance to light source.
In practice often too ‘agressive’,
hence Il = I / (a0 +a1d+a2d2)
If light source at infinity: No damping with distance
H&B 17-1:532-536
Light sources 5
Directed light source, spotlight:
Light is primarily send in direction of Vlight .
If cos   cos  l then Q is illuminated. Or :
QP
If
 Vlight  cos  l then Q is illuminated.
|QP|
P
Q

l
light cone
Vlight
H&B 17-1:532-536
Light sources 6
More subtle: Let I decrease with increasing angle .
Often used : I l  cos n  I .
The larger n, the stronger the light decreases.
P
Q

l
light cone
Vlight
H&B 17-1:532-536
Surface illumination 1
• When light hits a surface, three things can
happen:
reflection
absorption
transmission
H&B 17-2:536-537
Surface illumination 2
• Suppose, a light source radiates white light,
consisting of red, green and blue light.
reflection
absorption
transmission
If only red light is reflected,
then we see a red surface.
H&B 17-2:536-537
Surface illumination 3
• Diffuse reflection: Light is uniformly reflected in
all directions
• Specular reflection: Light is stronger reflected in
one direction.
specular reflection
diffuse reflection
H&B 17-2:536-537
Surface illumination 4
• Ambient light: light from the environment. Undirected
light, models reflected light of other objects.
H&B 17-2:536-537
Basic illumination model 1
Basic illumination model:
• Ambient light;
• Point light sources;
Ia
I l , P of V
• Ambient reflection; k a
• Diffuse reflection; k d
• Specular reflection. k s , ns
ka , kd , k s : reflection coefficien ts
k p  (kp,red , kp,green , kp,blue)
H&B 17-3:537-546
Basic illumination model 2
• Ambient light: environment light. Undirected light,
models reflected light of other objects.
I amb  ka I a
H&B 17-3:537-546
Basic illumination model 3
Perfect diffuse reflector: light is reflected
uniformly in all directions.

dA/cos 
energy
Intensity 
projected area.
dA

dA / cos 
 cos 
H&B 17-3:537-546
Basic illumination model 4
Perfect diffuse reflector: light is reflected
uniformly in all directions.
.
Lambert’s law:
N
L


dA/cos 
Reflected energy is
proportional with cos , where
 denotes the angle between the
normal N and a vector to the light
source L.
H&B 17-3:537-546
Basic illumination model 5
Perfect diffuse reflector: light is reflected
uniformly in all directions.
Psource
L
Graphics model diffuse reflection :
N
Psurf
k d I l ( N  L) if N  L  0
I l,diff  
0
if N  L  0

with 0  k d  1 and
L
Psource  Psurf
| Psource  Psurf |
H&B 17-3:537-546
Basic illumination model 6
Perfect specular reflector: light is only reflected in one
direction. Angle of incidence is angle of reflection.
N
L
R
 
H&B 17-3:537-546
Basic illumination model 7
Imperfect specular reflector: light is distributed in the
direction of the angle of reflection, dependent on the
roughness of the surface.
N
N
L
R
L
R
 
 
glad
ruw
H&B 17-3:537-546
Basic illumination model 8
Phong model: empirical model for specular reflection
I l , spec  W ( ) I l cos ns  ,
N
L
with W ( )  k s ,
R
 
V
ns  smoothness(1  ruw, 100  glad),
 : angle between N and L,
 : angle between R and V,
R : direction reflected ray of light
V : direction viewer
H&B 17-3:537-546
Basic illumination model 9
Phong model: empirical model for specular reflection
N
L
R
 
V

ns
k
I
(
V

R
)
 s l


I l , spec  

0



if V  R  0
and N  L  0
if V  R  0
or N  L  0
H&B 17-3:537-546
Basic illumination model 10
Phong model: calculating the vectors
L
L
N
N.L
R  L  ( 2N  L) N
hence
R
V
R  ( 2N  L) N  L
Pview  Psurf
V
| Pview  Psurf |
H&B 17-3:537-546
Basic illumination model 11
Phong model: variant with halfway vector H.
Use  instead of .
N
L
LV
H
|LV|
H
R


V
Il ,spec  ks Il (N H)ns
If light source and viewer far away:
H  constant.
H&B 17-3:537-546
Basic illumination model 12
All together:
I  I amb  I dif  I spec
 k a I a  k d I l (max(0, N  L))  k s I l (max(0, N  H )) n s
Multiple light sources :
n
I  ka I a 

k d I l (max(0, N  L))  k s I l (max(0, N  H )) n s
l 1
H&B 17-3:537-546
Basic illumination model 13
Color (reprise):
Light intensity I and reflection coefficients k: (r,g,b) triplets
So for instance: I dif ,R  kd , R Il ,R (max(0, N L))
Plastic: kd is colored (r,g,b), ks is grey (w,w,w)
Metal: kd and ks same color
Basic model: simple but effective.
It can be done much better though…
H&B 17-3:537-546
Transparancy 1
Transparant object:
- reflected and transmitted
light
- refraction
- scattering
H&B 17-4:546-549
Transparancy 2
Snell’s law of refraction:
i
i
sin i ,  : index of refraction
r
 i


T   cos i  cos r N  i L
r
 r

N
L
sin r 
i
r T
R













T.T  1,

T   N  cos  r ,


T  N   L,
and solve for  and  
Derivation :
Use Snell's law,
H&B 17-4:546-549
Transparancy 3
Thin surface:
- double refraction
- shift of light ray
H&B 17-4:546-549
Transparancy 3
Very thin surface:
- Discard shift
Simplemodel :
I  (1  kt ) I refl  kt I trans
0  kt  1
kt : transparancy
1  kt: opacity
Poor result for silhouette
edges…
H&B 17-4:546-549
Atmospheric effects 1
Atmospheric effects:
- dust, smoke, vapor
- colors are dimmed
- objects less well visible
H&B 10-5:549-550
Atmospheric effects 2
Attenuation by atmosphere :
f atmo (d )  e  d , with
d : distance
 : attenuation factor
d  d min
Simpler: f atmo (d ) 
d max  d min
Perceived intensity:
I  f atmo (d ) I obj  [1  f atmo (d )]I atmo
= 0.25
+ [ 1  0.25 ]
H&B 10-5:549-550
Rendering polygons 1
Basic illumination model:
Can be used per point, but that’s
somewhat expensive
More efficient:
Illumination model gives color for some
points;
Surface is filled in using interpolation of
these colors.
H&B 17-10:559-564
Rendering polygons 2
Constant-intensity rendering aka flat surface rendering:
• Determine color for center of polygon;
• Fill the polygon with a constant color.
Ok if:
• Object consists of planar faces, and
• Light sources are far away, and
• Eye point is far away,
or
• Polygons are about a pixel in size.
H&B 17-10:559-564
Rendering polygons 2
Constant-intensity rendering aka flat surface rendering:
• Determine color for center of polygon;
• Fill the polygon with a constant color.
Highlights not visible,
Facetted appearance, increased by Mach banding effect.
H&B 17-10:559-564
Mach banding
• Human perception: edges are given
emphasis, contrast is increased near edges.
Angel (2000)
H&B 17-10:559-564
Rendering polygons 2
Gouraud surface rendering:
• Determine average normal on vertices;
• Determine color for vertices;
• Interpolate the colors per polygon (incrementally).
N2
N3
N1
N4
V
NV 


n
k 1
n
k 1
Nk
Nk
H&B 17-10:559-564
Rendering polygons 3
Gouraud surface rendering:
• Much better result for curved surfaces
• Errors near highlights
• Linear interpolation still gives Mach banding
• Silhouettes are still not smooth
Gouraud
Flat
Rendering polygons 4
Phong surface rendering:
• Determine average normal per vertex;
• Interpolate normals per polygon (incrementally);
• Calculate color per pixel.
Fast Phong surface rendering:
Like Phong surface rendering, but use
2nd order approximation of color over
polygon:
I ( x, y)  ax2  bxy  cy2  dx  ey  f
H&B 17-10:559-564
Rendering polygons 5
Phong surface rendering:
• Even better result for curved surfaces
• No errors at high lights
• No Mach banding
• Silhouettes remain coarse
• More expensive than flat or Gouraud shading
H&B 17-10:559-564
Rendering polygons 5
Flat
Gouraud
Phong
H&B 17-10:559-564
OpenGL Illumination
Glfloat lightPos[]
= {2.0, 0.0, 3.0, 0.0};
Glfloat whiteColor[] = {1.0, 1.0, 1.0, 1.0};
Glfloat pinkColor[] = {1.0, 0.5, 0.5, 1.0};
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
// Use smooth shading
// Enable lighting
// Enable light source #0
glLightfv(GL_LIGHT0, GL_POSITION, lightPos); // position LS 0
glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteColor); // set color LS 0
glMaterialfv(GL_FRONT, GL_DIFFUSE, pinkColor); // set surface
// color
glBegin(GL_TRIANGLES);
glNormal3fv(n1); glVertex3fv(v1); // draw triangle, give
glNormal3fv(n2); glVertex3fv(v2); // first normal, followed
glNormal3fv(n3); glVertex3fv(v3); // by vertex
glEnd();
H&B 17-11:564-574
OpenGL Light-sources 1
First, enable lighting in general:
glEnable(GL_LIGHTING);
OpenGL provides (at least) eight light-sources:
lightName = GL_LIGHT0, GL_LIGHT1, … , GL_LIGHT7
Enable the one(s) you need with:
glEnable(lightName);
Set properties with
glLight*(lightName, lightProperty, propertyValue);
* = i, f, iv, or fv (i: integer, f: float, v vector)
H&B 17-11:564-574
OpenGL Light-sources 2
Position light-source:
Glfloat sunlightPos[]
Glfloat lamplightPos[]
= {2.0, 0.0, 3.0, 0.0};
= {2.0, 0.0, 3.0, 1.0};
glLightfv(GL_LIGHT1, GL_POSITION, sunlightPos);
glLightfv(GL_LIGHT2, GL_POSITION, lamplightPos);
• Fourth coordinate = 0: source at infinity
• Fourth coordinate = 1: local source
• Specified in world-coordinates, according to the current
ModelView specification – just like geometry. Hence, take
care when you specify the position.
• Light from above looks more natural
H&B 17-11:564-574
OpenGL Light-sources 3
Color light-source:
Glfloat greyColor[] = {0.3, 0.3, 0.3, 1.0};
Glfloat pinkColor[] = {1.0, 0.7, 0.7, 1.0};
Glfloat whiteColor[] = {1.0, 1.0, 1.0, 1.0};
glLightfv(GL_LIGHT1, GL_AMBIENT, greyColor);
glLightfv(GL_LIGHT1, GL_DIFFUSE, pinkColor);
glLightfv(GL_LIGHT1, GL_SPECULAR, whiteColor);
• OpenGL light-source has three color properties, dependent on
reflection surface. Not realistic, can be used for special effects.
• If you don’t have ambient light, things often appear black.
• Colors are always 4-vectors here: Fourth coordinate is alpha.
Most cases: set it to 1.0.
H&B 17-11:564-574
• More settings: See book
OpenGL Global Lighting
Global parameters:
glLightModel*(paramName, paramValue);
* = i, f, iv, or fv (i: integer, f: float, v vector)
Global ambient light:
Glfloat globalAmbient[] = {0.3, 0.3, 0.3, 1.0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, globalAmbient);
More precise specular reflection, take view position into account:
glLightModelI(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
Two-sided lighting:
glLightModelI(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
H&B 17-11:564-574
OpenGL Surface properties 1
Surface reflection parameters:
glMaterial*(surfFace, surfProperty, propertyValue);
* = i, f, iv, or fv (i: integer, f: float, v vector)
surfFace = GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK
Glfloat emissionColor[]
Glfloat diffuseColor[]
Glfloat specularColor[]
= {0.2, 0.3, 0.1, 1.0};
= {0.6, 0.3, 0.1, 1.0};
= {0.1, 0.1, 0.1, 1.0};
glMaterialfv(GL_FRONT, GL_EMISSION,
glMaterialfv(GL_FRONT, GL_DIFFUSE,
glMaterialfv(GL_FRONT, GL_SPECULAR,
glMaterialf(GL_FRONT, GL_SHININESS,
emissionColor);
diffuseColor);
specularColor);
25.0f);
H&B 17-11:564-574
OpenGL Surface properties 2
If colors are changed often (for instance, per vertex):
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glBegin(…);
for i = ...
for j = ...
glColor3f(red(i,j), green(i,j), blue(i,j));
glVertex3f(x(i,j), y(i,j), z(i,j));
glEnd(…);
H&B 17-11:564-574
OpenGL Surface properties 3
Transparent surfaces:
• First, draw all opaque surfaces;
• Next, draw transparent surfaces, back to front*, using
something like:
glColor4f(R, G, B, A); // A: alpha, for instance 0.40
glEnable(GL_BLEND);
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
... Draw transparent surfaces.
glDisable(GL_BLEND);
* OpenGL cannot automatically handle transparency, because of the
z-buffer algorithm used for hidden surface removal. More on this
later.
H&B 17-11:564-574
OpenGL Surface properties 4
Color Blending (see also H&B: 135-136):
Source:
the new graphics object to be drawn;
Destination: the current image built up.
(RS, GS, BS, AS): Source color + alpha
(RD, GD, BD, AD): Destination color + alpha
(SR, SG, SB, SA): Source blending factors
(DR, DG, DB, DA): Destination blending factors
Components of Source and Destination are weighted and added:
(SRRS+ DRRD, SGGS+ DGGD, SBBS+ DBBD, SAAS+ DAAD)
is stored in the current image.
H&B 17-11:564-574
OpenGL Surface properties 5
(RS, GS, BS, AS): Source color + alpha
(RD, GD, BD, AD): Destination color + alpha
(SR, SG, SB, SA): Source blending factors
(DR, DG, DB, DA): Destination blending factors
glBlendFunc(sFactor, dFactor):
specify the blending factors.
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
// Use alpha of source as transparency
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Use alpha of source as opacity
More options available for special effects.
H&B 17-11:564-574
OpenGL Surface-Rendering 1
specify the rendering method
m = GL_FLAT or m = GL_SMOOTH (Gouraud, default)
Ny, Nz) : specify the normal vector
glShadeModel(m):
glNormal*(Nx,
Flat version:
Smooth version:
glNormal3fv(nV);
glBegin(GL_TRIANGLES);
glVertex3fv(V1);
glVertex3fv(V2);
glVertex3fv(V3);
glEnd();
glBegin(GL_TRIANGLES);
glNormal3fv(nV1);
glVertex3fv(V1);
glNormal3fv(nV2);
glVertex3fv(V2);
glNormal3fv(nV3);
glVertex3fv(V3);
glEnd();
H&B
17-11:564-574
OpenGL Surface-Rendering 2
specify the rendering method
m = GL_FLAT or m = GL_SMOOTH (Gouraud, default)
Ny, Nz) : specify the normal vector
glShadeModel(m):
glNormal*(Nx,
glEnable(GL_NORMALIZE):
Let OpenGL normalize the normals for
you. And, also take care of effects of
scaling, shearing, etc.
H&B 17-11:564-574
Next
• Now that we know how to render curved
surfaces, let’s study how to define these…
Download