Share
Embed
SER332 Lecture 19
Introduction to Graphics and Game Development
Lighting
(201804)
Javier Gonzalez-Sanchez PRO
April 03, 2018
Transcript
16 slides
-
jgs SER332 Introduction to Graphics and Game Development Lecture 19:
Lighting Javier Gonzalez-Sanchez [email protected] PERALTA 230U Office Hours: By appointment -
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 -
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); -
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(); -
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. -
Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 6 jgs
Light Source’s Attributes Peter Wonka -
Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 7 jgs
Example (original code without lighting) § https://github.com/javiergs/SER332/blob/master/Lecture19/original.cpp -
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); } -
Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 9 jgs
Example (update one) § https://github.com/javiergs/SER332/blob/master/Lecture19/light.cpp -
Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 10 jgs
Add Normals § Per Face Normals § Per Vertex Normals § Per Vertex Weight Normals -
Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 11 jgs
Example (update two) struct Mesh { // vertex vector<Vec3f> dot_vertex; vector<Vec3f> dot_normalPerFace; vector<Vec3f> dot_normalPerVertex; vector<Vec2f> dot_texture; // faces vector<int> face_index_vertex; vector<int> face_index_normalPerFace; vector<int> face_index_normalPerVertex; vector<int> face_index_texture; }; -
jgs Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 12
// normal per face void calculateNormalPerFace(Mesh* m) { Vec3<float> 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); } } -
Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 13 jgs
Example (update two) § https://github.com/javiergs/SER332/blob/master/Lecture19/light.cpp -
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<float> 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]); } } -
Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 15 jgs
Per Vertex Normal § https://github.com/javiergs/SER332/blob/master/Lecture19/light.cpp -
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.