Slide 1

Slide 1 text

jgs SER332 Introduction to Graphics and Game Development Lecture 19: Lighting Javier Gonzalez-Sanchez [email protected] PERALTA 230U Office Hours: By appointment

Slide 2

Slide 2 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 2 jgs Lighting § By default, OpenGL's fixed-function pipeline implements the Blinn-Phong Shading Model. § Three steps to activate OpenGL fixed-function pipeline lighting: 1. Enable light source(s) and define their attributes (position, ambient, diffuse, specular). 1. Define normal vectors 2. Define materials

Slide 3

Slide 3 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 3 jgs Enable Light Source | init method // light position // Point light: w component is 1.0 // Directional light: w component is 0.0 Glfloat light_position[] = {-1.0, 0.0, 1.0, 0.0}; // light configuration glLightfv( GL_LIGHT0, GL_POSITION, light_position); // Enable lighting + each individual light!!! glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);

Slide 4

Slide 4 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 4 jgs Moving Light Sources | display method glPushMatrix(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glPushMatrix(); glRotated(spin, 1.0, 0.0, 0.0); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glPopMatrix() // draw something else here glPopMatrix();

Slide 5

Slide 5 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 5 jgs Ambient + Diffuse + Specular § Ambient It is a constant term. Applies equally to all points on the object § Ambient + Diffuse Diffuse color of light interacts with diffuse component of material. Its intensity depends on the angle between the light source and the surface normal § Ambient + Diffuse + Specular Specular color of light interacts with specular component of material. Its intensity depends on the angle between the viewer and the direction of a ray reflected from the light source.

Slide 6

Slide 6 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 6 jgs Light Source’s Attributes Peter Wonka

Slide 7

Slide 7 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 7 jgs Example (original code without lighting) § https://github.com/javiergs/SER332/blob/master/Lecture19/original.cpp

Slide 8

Slide 8 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 8 jgs Example (update one) void init () { … // RGBA GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 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 }; // what kind of light source? 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); // enable glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); }

Slide 9

Slide 9 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 9 jgs Example (update one) § https://github.com/javiergs/SER332/blob/master/Lecture19/light.cpp

Slide 10

Slide 10 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 10 jgs Add Normals § Per Face Normals § Per Vertex Normals § Per Vertex Weight Normals

Slide 11

Slide 11 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 11 jgs Example (update two) struct Mesh { // vertex vector dot_vertex; vector dot_normalPerFace; vector dot_normalPerVertex; vector dot_texture; // faces vector face_index_vertex; vector face_index_normalPerFace; vector face_index_normalPerVertex; vector face_index_texture; };

Slide 12

Slide 12 text

jgs Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 12 // normal per face void calculateNormalPerFace(Mesh* m) { Vec3 v1, v2, v3, v4, v5; for (int i = 0; i < m->face_index_vertex.size(); i += 3) { v1 = m->dot_vertex[m->face_index_vertex[i]]; v2 = m->dot_vertex[m->face_index_vertex[i + 1]]; v3 = m->dot_vertex[m->face_index_vertex[i + 2]]; v4 = (v2 - v1); v5 = (v3 - v1); v4 = v4.cross(v5); v4.normalize(); m->dot_normalPerFace.push_back(v4); int pos = m->dot_normalPerFace.size() - 1; // same normal for all vertex in this face m->face_index_normalPerFace.push_back(pos); m->face_index_normalPerFace.push_back(pos); m->face_index_normalPerFace.push_back(pos); } }

Slide 13

Slide 13 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 13 jgs Example (update two) § https://github.com/javiergs/SER332/blob/master/Lecture19/light.cpp

Slide 14

Slide 14 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 14 jgs Example (update three) // calculate normal per vertex void calculateNormalPerVertex(Mesh* m) { m->dot_normalPerVertex.clear(); m->face_index_normalPerVertex.clear(); Vec3 suma; suma.x = 0; suma.y = 0; suma.z = 0; //initialize for (unsigned int val = 0; val < m->dot_vertex.size(); val++) { m->dot_normalPerVertex.push_back(suma); } // calculate sum for vertex for (long pos = 0; pos < m->face_index_vertex.size(); pos++) { m->dot_normalPerVertex[m->face_index_vertex[pos]] += m->dot_normalPerFace[m->face_index_normalPerFace[pos]]; } // normalize for vertex for (unsigned int val = 0; val < m->dot_normalPerVertex.size(); val++) { m->dot_normalPerVertex[val] = m->dot_normalPerVertex[val].normalize(); } //normalVertexIndex is the same that vertexIndex for (unsigned int pos = 0; pos < m->face_index_vertex.size(); pos++) { m->face_index_normalPerVertex.push_back(m->face_index_vertex[pos]); } }

Slide 15

Slide 15 text

Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 15 jgs Per Vertex Normal § https://github.com/javiergs/SER332/blob/master/Lecture19/light.cpp

Slide 16

Slide 16 text

jgs SER332 Introduction to Graphics Javier Gonzalez-Sanchez [email protected] Spring 2018 Disclaimer. These slides can only be used as study material for the class SER332 at ASU. They cannot be distributed or used for another purpose.