Escolar Documentos
Profissional Documentos
Cultura Documentos
Shading in OpenGL
Polygonal Shading Light Source in OpenGL Material Properties in OpenGL Normal Vectors in OpenGL Approximating a Sphere [Angel 6.5-6.9]
Polygonal Shading
Curved surfaces are approximated by polygons How do we shade?
Flat shading Interpolative shading Gouraud shading Phong shading (different from Phong illumination)
Two questions:
How do we determine normals at vertices? How do we calculate shading at interior points?
09/23/2003
15-462 Graphics I
Flat Shading
Normal: given explicitly before vertex
glNormal3f(nx, ny, nz); glVertex3f(x, y, z);
Shading constant across polygon Single polygon: first vertex Triangle strip:Vertex n+2 for triangle n
09/23/2003
15-462 Graphics I
09/23/2003
15-462 Graphics I
09/23/2003
15-462 Graphics I
09/23/2003
15-462 Graphics I
09/23/2003
15-462 Graphics I
Interpolative Shading
Enable with glShadeModel(GL_SMOOTH); Calculate color at each vertex Interpolate color in interior Compute during scan conversion (rasterization) Much better image (see Assignment 1) More expensive to calculate
09/23/2003
15-462 Graphics I
Gouraud Shading
Special case of interpolative shading How do we calculate vertex normals? Gouraud: average all adjacent face normals
09/23/2003
15-462 Graphics I
09/23/2003
15-462 Graphics I
10
Phong Shading
Interpolate normals rather than colors Significantly more expensive Mostly done off-line (not supported in OpenGL)
09/23/2003
15-462 Graphics I
11
Must calculate vertex normals! Must normalize vertex normals to unit length!
09/23/2003
15-462 Graphics I
13
Outline
Polygonal Shading Light Sources in OpenGL Material Properties in OpenGL Normal Vectors in OpenGL Example: Approximating a Sphere
09/23/2003
15-462 Graphics I
14
09/23/2003
15-462 Graphics I
15
09/23/2003
15-462 Graphics I
16
09/23/2003
15-462 Graphics I
17
09/23/2003
15-462 Graphics I
18
Spotlights
Create point source as before Specify additional properties to create spotlight
GLfloat sd[] = {-1.0, -1.0, 0.0}; glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, sd); glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, 45.0); glLightf (GL_LIGHT0, GL_SPOT_EXPONENT, 2.0);
Outline
Polygonal Shading Light Sources in OpenGL Material Properties in OpenGL Normal Vectors in OpenGL Example: Approximating a Sphere
09/23/2003
15-462 Graphics I
20
GL_COLOR_MATERIAL Mode
Can shortcut material properties using glColor Must be explicitly enabled and disabled
glEnable(GL_COLOR_MATERIAL);
/* affect front face, diffuse reflection properties */
glDisable(GL_COLOR_MATERIAL);
Outline
Polygonal Shading Light Sources in OpenGL Material Properties in OpenGL Normal Vectors in OpenGL Example: Approximating a Sphere
09/23/2003
15-462 Graphics I
23
Length changes under some transformations Ask OpenGL to re-normalize (all tfms)
glEnable(GL_NORMALIZE);
Example: Icosahedron
Define the vertices
#define X .525731112119133606 #define Z .850650808352039932 static GLfloat vdata[12][3] = { {-X, 0, Z}, {X, 0, Z}, {-X, 0, -Z}, {X, 0, -Z}, {0, Z, X}, {0, Z, -X}, {0, -Z, X}, {0, -Z, -X}, {Z, X, 0}, {-Z, X, 0}, {Z, -X, 0}, {-Z, -X, 0} };
09/23/2003
15-462 Graphics I
25
09/23/2003
15-462 Graphics I
26
09/23/2003
15-462 Graphics I
27
28
The Icosahedron
Using simple lighting setup
09/23/2003
15-462 Graphics I
30
Sphere Normals
Set up instead to use normals of sphere Unit sphere normal is exactly sphere point
glBegin(GL_TRIANGLES); for (i = 0; i < 20; i++) { glNormal3fv(&vdata[tindices[i][0]][0]); glVertex3fv(&vdata[tindices[i][0]][0]); glNormal3fv(&vdata[tindices[i][1]][0]); glVertex3fv(&vdata[tindices[i][1]][0]); glNormal3fv(&vdata[tindices[i][2]][0]); glVertex3fv(&vdata[tindices[i][2]][0]); } glEnd();
09/23/2003
15-462 Graphics I
31
09/23/2003
15-462 Graphics I
32
Recursive Subdivision
General method for building approximations Research topic: construct a good mesh
Low curvature, fewer mesh points High curvature, more mesh points Stop subdivision based on resolution Some advanced data structures for animation Interaction with textures
09/23/2003
15-462 Graphics I
33
Methods of Subdivision
(a) Bisecting angles (b) Computing centroid (c) Bisecting sides
09/23/2003
15-462 Graphics I
35
36
09/23/2003
15-462 Graphics I
38
Icosahedron Unsubdivided
09/23/2003
15-462 Graphics I
39
One Subdivision
09/23/2003
15-462 Graphics I
40
Two Subdivisions
Each time, multiply number of faces by 4
09/23/2003
15-462 Graphics I
41
Three Subdivisions
Reasonable approximation to sphere
09/23/2003
15-462 Graphics I
42
09/23/2003
15-462 Graphics I
43
glShadeModel(GL_SMOOTH); /* enable smooth shading */ glEnable(GL_LIGHTING); /* enable lighting */ glEnable(GL_LIGHT0); /* enable light #0 */
09/23/2003
15-462 Graphics I
44
Summary
Polygonal Shading Light Sources in OpenGL Material Properties in OpenGL Normal Vectors in OpenGL Example: Approximating a Sphere
09/23/2003
15-462 Graphics I
45
Preview
Either
Basic texture mapping Curves and surfaces
09/23/2003
15-462 Graphics I
46