Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SER332 Lecture 19

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

SER332 Lecture 19

Introduction to Graphics and Game Development
Lighting
(201804)

Avatar for Javier Gonzalez-Sanchez

Javier Gonzalez-Sanchez PRO

April 03, 2018
Tweet

More Decks by Javier Gonzalez-Sanchez

Other Decks in Programming

Transcript

  1. jgs SER332 Introduction to Graphics and Game Development Lecture 19:

    Lighting Javier Gonzalez-Sanchez [email protected] PERALTA 230U Office Hours: By appointment
  2. 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
  3. 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);
  4. 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();
  5. 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.
  6. Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 6 jgs

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

    Example (original code without lighting) § https://github.com/javiergs/SER332/blob/master/Lecture19/original.cpp
  8. 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); }
  9. Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 9 jgs

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

    Add Normals § Per Face Normals § Per Vertex Normals § Per Vertex Weight Normals
  11. 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; };
  12. 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); } }
  13. Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 13 jgs

    Example (update two) § https://github.com/javiergs/SER332/blob/master/Lecture19/light.cpp
  14. 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]); } }
  15. Javier Gonzalez-Sanchez | SER332 | Spring 2018 | 15 jgs

    Per Vertex Normal § https://github.com/javiergs/SER332/blob/master/Lecture19/light.cpp
  16. 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.