5.2 shading in opengl - hao li - about me · 2018. 9. 23. · csci 420: computer graphics hao li ...

47
CSCI 420: Computer Graphics Hao Li http://cs420.hao-li.com Fall 2018 5.2 Shading in OpenGL 1

Upload: others

Post on 05-Mar-2021

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

CSCI 420: Computer Graphics

Hao Lihttp://cs420.hao-li.com

Fall 2018

5.2 Shading in OpenGL

1

Page 2: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Outline

• Normal Vectors in OpenGL

• Polygonal Shading

• Light Sources in OpenGL

• Material Properties in OpenGL

• Example: Approximating a Sphere

2

Page 3: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Defining and Maintaining Normals

• Define unit normal before each vertex

3

glNormal3f(nx, ny, nz);glVertex3f(x1, y1, z1);glVertex3f(x2, y2, z2);glVertex3f(x3, y3, z3);

glNormal3f(nx1, ny1, nz1);glVertex3f(x1, y1, z1);glNormal3f(nx2, ny2, nz2);glVertex3f(x2, y2, z2);glNormal3f(nx3, ny3, nz3);glVertex3f(x3, y3, z3);

same normal for all vertices different normals

Page 4: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Normalization

• Length of normals changes under some modelview transformations (but not under translations and rotations)

• Ask OpenGL to automatically re-normalize

• Faster alternative (works only with translate, rotate and uniform scaling)

4

glEnable(GL_NORMALIZE);

glEnable(GL_RESCALE_NORMAL);

Page 5: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Outline

• Normal Vectors in OpenGL

• Light Sources in OpenGL

• Material Properties in OpenGL

• Polygonal Shading

• Example: Approximating a Sphere

5

Page 6: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

glEnable(GL_LIGHTING);

Enabling Lighting and Lights

• Lighting “master switch” must be enabled:

• Each individual light must be enabled:

• OpenGL supports at least 8 light sources

6

glEnable(GL_LIGHT0);

Page 7: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

What Determines Vertex Color in OpenGL

7

Is OpenGL lighting enabled?

NO YES

Color determined by glColor3f(...) Ignored: • normals • lights • material properties

Color determined by Phong lighting which uses: • normals • lights • material properties

See also: http://www.sjbaker.org/steve/omniv/opengl_lighting.html

Page 8: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Reminder: Phong Lighting

8

= unit vector to light = surface normalln

= reflected about = vector to viewerrv

l n

• Light components for each color: - Ambient ( ), diffuse ( ), specular ( )

• Material coefficients for each color: - Ambient ( ), diffuse ( ), specular ( )

• Distance q for surface point from light source

La Ld Ls

kskdka

Page 9: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

• Set ambient intensity for entire scene

• The above is default

• Also: local vs infinite viewer

- Local viewer: Correct specular highlights More expensive, but sometimes more accurate - Non-local viewer: Assumes camera is far from object Approximate, but faster (this is default)

Global Ambient Light

9

GLfloat al[] = {0.2, 0.2, 0.2, 1.0};glLightModelfv(GL_LIGHT_MODEL_AMBIENT, al);

glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);

Page 10: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Defining a Light Source

• Use vectors {r, g, b, a} for light properties

• Beware: light positions will be transformed by the modelview matrix

10

GLfloat light_ambient[] = {0.2, 0.2, 0.2, 1.0};GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};GLfloat light_position[] = {-1.0, 1.0, -1.0, 0.0};glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);glLightfv(GL_LIGHT0, GL_POSITION, light_position);

Page 11: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

• Directional light given by “position” vector

• Point source given by “position” point

Point Source vs Directional Source

11

GLfloat light_position[] = {-1.0, 1.0, -1.0, 0.0};glLightfv(GL_LIGHT0, GL_POSITION, light_position);

GLfloat light_position[] = {-1.0, 1.0, -1.0, 1.0};glLightfv(GL_LIGHT0, GL_POSITION, light_position);

Page 12: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Spotlights

• Create point source as before

• Specify additional properties to create spotlight

12

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);

Page 13: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Outline

• Normal Vectors in OpenGL

• Light Sources in OpenGL

• Material Properties in OpenGL

• Polygonal Shading

• Example: Approximating a Sphere

13

Page 14: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Defining Material Properties

14

GLfloat mat_a[] = {0.1, 0.5, 0.8, 1.0};GLfloat mat_d[] = {0.1, 0.5, 0.8, 1.0};GLfloat mat_s[] = {1.0, 1.0, 1.0, 1.0};GLfloat low_sh[] = {5.0};glMaterialfv(GL_FRONT, GL_AMBIENT, mat_a);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_d);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_s);glMaterialfv(GL_FRONT, GL_SHININESS, low_sh);

OpenGL is a state machine: material properties stay in effect until changed.

Page 15: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Color Material Mode

• Alternative way to specify material properties

• Uses glColor

• Must be explicitly enabled and disabled

15

glEnable(GL_COLOR_MATERIAL);/* affect all faces, diffuse reflection properties */glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);glColor3f(0.0, 0.0, 0.8);/* draw some objects here in blue */glColor3f(1.0, 0.0, 0.0);/* draw some objects here in red */glDisable(GL_COLOR_MATERIAL);

Page 16: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Outline

• Normal Vectors in OpenGL

• Light Sources in OpenGL

• Material Properties in OpenGL

• Polygonal Shading

• Example: Approximating a Sphere

16

Page 17: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Polygonal Shading

• Now we know vertex colors - either via OpenGL lighting, - or by setting directly via glColor3f if lighting disabled

• How do we shade the interior of the triangle ?

17

?

Page 18: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Polygonal Shading

• Curved surfaces are approximated by polygons

• How do we shade? - Flat shading - Interpolative shading - Gouraud shading - Phong shading (different from Phong illumination!)

18

Page 19: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Flat Shading

• Enable with glShadeModel(GL_FLAT);

• Shading constant across polygon

• Color of last vertex determines interior color

• Only suitable for very small polygons

19v1v0

v2

Page 20: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Flat Shading Assessment

• Inexpensive to compute

• Appropriate for objects with flat faces

• Less pleasant for smooth surfaces

20

Page 21: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Interpolative Shading

• Enable with glShadeModel(GL_SMOOTH); • Interpolate color in interior • Computed during scan conversion (rasterization) • Much better than flat shading • More expensive to calculate (but not a problem for modern graphics cards)

21v1v0

v2

Page 22: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Gouraud Shading

22

• Invented by Henri Gouraud, Univ. of Utah, 1971

• Special case of interpolative shading

• How do we calculate vertex normals for a polygonal surface? Gouraud: 1. average all adjacent face normals

2. use n for Phong lighting 3. interpolate vertex colors into the interior

• Requires knowledge about which faces share a vertex

n =n1 + n2 + n3 + n4

|n1 + n2 + n3 + n4|

Page 23: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Data Structures for Gouraud Shading

• Sometimes vertex normals can be computed directly (e.g. height field with uniform mesh)

• More generally, need data structure for mesh

• Key: which polygons meet at each vertex

23

Page 24: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Phong Shading (“per-pixel lighting”)

• Invented by Bui Tuong Phong, Univ. of Utah, 1973

• At each pixel (as opposed to at each vertex) : 1. Interpolate normals (rather than colors) 2. Apply Phong lighting to the interpolated normal

• Significantly more expensive

• Done off-line or in GPU shaders (not supported in OpenGL directly)

24

Page 25: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Phong Shading Results

25

Michael Gold, Nvidia

Single light Phong Lighting

Gouraud Shading

Two lights Phong Lighting

Gouraud Shading

Two lights Phong Lighting Phong Shading

Page 26: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Polygonal Shading Summary

• Gouraud shading - Set vertex normals - Calculate colors at vertices - Interpolate colors across polygon

• Must calculate vertex normals!

• Must normalize vertex normals to unit length!

26

Page 27: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Outline

• Normal Vectors in OpenGL

• Light Sources in OpenGL

• Material Properties in OpenGL

• Polygonal Shading

• Example: Approximating a Sphere

27

Page 28: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

• Define the vertices

• For simplicity, this example avoids the use of vertex arrays

Example: Icosahedron

28

#define X .525731112119133606#define Z .850650808352039932

static GLfloat vdata[12][3] = { {-X, 0.0, Z}, {X, 0.0, Z}, {-X, 0.0, -Z}, {X, 0.0, -Z}, {0.0, Z, X}, {0.0, Z, -X}, {0.0, -Z, X}, {0.0, -Z, -X}, {Z, X, 0.0}, {-Z, X, 0.0}, {Z, -X, 0.0}, {-Z, -X, 0.0}};

Page 29: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Defining the Faces

• Index into vertex data array

• Be careful about orientation!

29

static GLuint tindices[20][3] = { {1,4,0}, {4,9,0}, {4,9,5}, {8,5,4}, {1,8,4}, {1,10,8}, {10,3,8}, {8,3,5}, {3,2,5}, {3,7,2}, {3,10,7}, {10,6,7}, {6,11,7}, {6,0,11}, {6,1,0}, {10,1,6}, {11,0,9}, {2,11,9}, {5,2,9}, {11,2,7}};

Page 30: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Drawing the Icosahedron

• Normal vector calculation next

• Should be encapsulated in display list

30

glBegin(GL_TRIANGLES);for (i = 0; i < 20; i++) { icoNormVec(i); glVertex3fv(&vdata[tindices[i][0]] [0]); glVertex3fv(&vdata[tindices[i][1]] [0]); glVertex3fv(&vdata[tindices[i][2]] [0]);}glEnd();

Page 31: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Calculating the Normal Vectors

• Normalized cross product of any two sides

31

GLfloat d1[3], d2[3], n[3];

void icoNormVec (int i) { for (k = 0; k < 3; k++) { d1[k] = vdata[tindices[i][0]] [k] – vdata[tindices[i][1]] [k]; d2[k] = vdata[tindices[i][1]] [k] – vdata[tindices[i][2]] [k]; } normCrossProd(d1, d2, n); glNormal3fv(n);}

Page 32: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

The Normalized Cross Product

• Omit zero-check for brevity

32

void normalize(float v[3]) { GLfloat d = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); v[0] /= d; v[1] /= d; v[2] /= d;}

void normCrossProd(float u[3], float v[3], float out[3]) { out[0] = u[1]*v[2] – u[2]*v[1]; out[1] = u[2]*v[0] – u[0]*v[2]; out[2] = u[0]*v[1] – u[1]*v[0]; normalize(out);}

Page 33: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

The Icosahedron

• Using simple lighting setup

33

Page 34: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Sphere Normals

• Set up instead to use normals of sphere

• Unit sphere normal is exactly sphere point

34

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();

Page 35: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Icosahedron with Sphere Normals

35

flat shading interpolation

Page 36: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

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

• Here: simplest case

• Approximate sphere by subdividing icosahedron 36

Page 37: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Methods of Subdivision

• Bisecting angles

• Computing center

• Bisecting sides

• Here: bisect sides to retain regularity 37

Page 38: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Bisection of Sides

• Draw if no further subdivision requested

38

void subdivide(GLfloat v1[3], GLfloat v2[3], GLfloat v3[3], int depth) { GLfloat v12[3], v23[3], v31[3]; int i; if (depth == 0) { drawTriangle(v1, v2, v3); } for (i = 0; i < 3; i++) { v12[i] = (v1[i]+v2[i])/2.0; v23[i] = (v2[i]+v3[i])/2.0; v31[i] = (v3[i]+v1[i])/2.0; }...

Page 39: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Extrusion of Midpoints

• Re-normalize midpoints to lie on unit sphere

39

void subdivide(GLfloat v1[3], GLfloat v2[3], GLfloat v3[3], int depth) { ... normalize(v12); normalize(v23); normalize(v31); subdivide(v1, v12, v31, depth-1); subdivide(v2, v23, v12, depth-1); subdivide(v3, v31, v23, depth-1); subdivide(v12, v23, v31, depth-1);}

Page 40: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Start with Icosahedron

• In sample code: control depth with ‘+’ and ‘-’

40

void display(void){ ... for (i = 0; i < 20; i++) { subdivide(&vdata[tindices[i][0]][0], &vdata[tindices[i][1]][0],

&vdata[tindices[i][2]][0], depth);

} glFlush();}

Page 41: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

One Subdivision

41

flat shading interpolation

Page 42: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Two Subdivision

42

flat shading interpolation

• Each time, multiply number of faces by 4

Page 43: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Three Subdivision

43

flat shading interpolation

• Reasonable approximation to sphere

Page 44: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Example Lighting Properties

44

GLfloat light_ambient[]={0.2, 0.2, 0.2, 1.0}; GLfloat light_diffuse[]={1.0, 1.0, 1.0, 1.0}; GLfloat light_specular[]={0.0, 0.0, 0.0, 1.0};

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

Page 45: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Example Material Properties

45

GLfloat mat_specular[]={0.0, 0.0, 0.0, 1.0};GLfloat mat_diffuse[]={0.8, 0.6, 0.4, 1.0};GLfloat mat_ambient[]={0.8, 0.6, 0.4, 1.0};GLfloat mat_shininess={20.0};glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);

glShadeModel(GL_SMOOTH); /*enable smooth shading */glEnable(GL_LIGHTING); /* enable lighting */glEnable(GL_LIGHT0); /* enable light 0 */

Page 46: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

Summary

• Normal Vectors in OpenGL

• Polygonal Shading

• Light Sources in OpenGL

• Material Properties in OpenGL

• Example: Approximating a Sphere

46

Page 47: 5.2 Shading in OpenGL - Hao Li - about me · 2018. 9. 23. · CSCI 420: Computer Graphics Hao Li  Fall 2018 5.2 Shading in OpenGL 1

http://cs420.hao-li.com

Thanks!

47