2IV60 Computer graphics set 8: Illumination Models and Surface-Rendering Methods Jack van Wijk TU/e OpenGL Illumination example Glfloat lightPos[] = {2.0, 0.0, 3.0, 0.0}; Glfloat whiteColor[] = {1.0, 1.0, 1.0, 1.0}; Glfloat pinkColor[] = {1.0, 0.5, 0.5, 1.0}; glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); // Use smooth shading // Enable lighting // Enable light source #0 glLightfv(GL_LIGHT0, GL_POSITION, lightPos); // position LS 0 glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteColor); // set color LS 0 glMaterialfv(GL_FRONT, GL_DIFFUSE, pinkColor); // set surface // color glBegin(GL_TRIANGLES); glNormal3fv(n1); glVertex3fv(v1); // draw triangle, give glNormal3fv(n2); glVertex3fv(v2); // first normal, followed glNormal3fv(n3); glVertex3fv(v3); // by vertex glEnd(); What is going on here? Introduction 1 Illumination model: Given a point on a surface, what is the perceived color and intensity? Known as Lighting Model, or Shading Model Surface rendering: Apply the Illumination model to color all pixels of the surface. H&B 17:531-532 Introduction 2 Example: • Illumination model gives color vertices, • Surface is displayed via interpolation of these colors. H&B 17:531-532 Introduction 3 Illumination: • Physics: – Material properties, light sources, relative positions, properties medium • Psychology: – Perception, what do we see – Color! • Often approximating models H&B 17:531-532 Light sources 1 Light source: object that radiates energy. Sun, lamp, globe, sky… Intensity I = (Ired , Igreen , Iblue) If Ired = Igreen = Iblue : white light H&B 17-1:532-536 Light sources 2 Simple model: point light source - position P and intensity I - Light rays along straight lines - Good approximation for small light sources H&B 17-1:532-536 Light sources 3 Simpler yet: point light source at infinity - Direction V and intensity I - Sunlight V H&B 17-1:532-536 Light sources 4 Damping: intensity of light decreases with distance Energy is distributed over area sphere, hence I l = I / d 2, d with d distance to light source. In practice often too ‘agressive’, hence Il = I / (a0 +a1d+a2d2) If light source at infinity: No damping with distance H&B 17-1:532-536 Light sources 5 Directed light source, spotlight: Light is primarily send in direction of Vlight . If cos cos l then Q is illuminated. Or : QP If Vlight cos l then Q is illuminated. |QP| P Q l light cone Vlight H&B 17-1:532-536 Light sources 6 More subtle: Let I decrease with increasing angle . Often used : I l cos n I . The larger n, the stronger the light decreases. P Q l light cone Vlight H&B 17-1:532-536 Surface illumination 1 • When light hits a surface, three things can happen: reflection absorption transmission H&B 17-2:536-537 Surface illumination 2 • Suppose, a light source radiates white light, consisting of red, green and blue light. reflection absorption transmission If only red light is reflected, then we see a red surface. H&B 17-2:536-537 Surface illumination 3 • Diffuse reflection: Light is uniformly reflected in all directions • Specular reflection: Light is stronger reflected in one direction. specular reflection diffuse reflection H&B 17-2:536-537 Surface illumination 4 • Ambient light: light from the environment. Undirected light, models reflected light of other objects. H&B 17-2:536-537 Basic illumination model 1 Basic illumination model: • Ambient light; • Point light sources; Ia I l , P of V • Ambient reflection; k a • Diffuse reflection; k d • Specular reflection. k s , ns ka , kd , k s : reflection coefficien ts k p (kp,red , kp,green , kp,blue) H&B 17-3:537-546 Basic illumination model 2 • Ambient light: environment light. Undirected light, models reflected light of other objects. I amb ka I a H&B 17-3:537-546 Basic illumination model 3 Perfect diffuse reflector: light is reflected uniformly in all directions. dA/cos energy Intensity projected area. dA dA / cos cos H&B 17-3:537-546 Basic illumination model 4 Perfect diffuse reflector: light is reflected uniformly in all directions. . Lambert’s law: N L dA/cos Reflected energy is proportional with cos , where denotes the angle between the normal N and a vector to the light source L. H&B 17-3:537-546 Basic illumination model 5 Perfect diffuse reflector: light is reflected uniformly in all directions. Psource L Graphics model diffuse reflection : N Psurf k d I l ( N L) if N L 0 I l,diff 0 if N L 0 with 0 k d 1 and L Psource Psurf | Psource Psurf | H&B 17-3:537-546 Basic illumination model 6 Perfect specular reflector: light is only reflected in one direction. Angle of incidence is angle of reflection. N L R H&B 17-3:537-546 Basic illumination model 7 Imperfect specular reflector: light is distributed in the direction of the angle of reflection, dependent on the roughness of the surface. N N L R L R glad ruw H&B 17-3:537-546 Basic illumination model 8 Phong model: empirical model for specular reflection I l , spec W ( ) I l cos ns , N L with W ( ) k s , R V ns smoothness(1 ruw, 100 glad), : angle between N and L, : angle between R and V, R : direction reflected ray of light V : direction viewer H&B 17-3:537-546 Basic illumination model 9 Phong model: empirical model for specular reflection N L R V ns k I ( V R ) s l I l , spec 0 if V R 0 and N L 0 if V R 0 or N L 0 H&B 17-3:537-546 Basic illumination model 10 Phong model: calculating the vectors L L N N.L R L ( 2N L) N hence R V R ( 2N L) N L Pview Psurf V | Pview Psurf | H&B 17-3:537-546 Basic illumination model 11 Phong model: variant with halfway vector H. Use instead of . N L LV H |LV| H R V Il ,spec ks Il (N H)ns If light source and viewer far away: H constant. H&B 17-3:537-546 Basic illumination model 12 All together: I I amb I dif I spec k a I a k d I l (max(0, N L)) k s I l (max(0, N H )) n s Multiple light sources : n I ka I a k d I l (max(0, N L)) k s I l (max(0, N H )) n s l 1 H&B 17-3:537-546 Basic illumination model 13 Color (reprise): Light intensity I and reflection coefficients k: (r,g,b) triplets So for instance: I dif ,R kd , R Il ,R (max(0, N L)) Plastic: kd is colored (r,g,b), ks is grey (w,w,w) Metal: kd and ks same color Basic model: simple but effective. It can be done much better though… H&B 17-3:537-546 Transparancy 1 Transparant object: - reflected and transmitted light - refraction - scattering H&B 17-4:546-549 Transparancy 2 Snell’s law of refraction: i i sin i , : index of refraction r i T cos i cos r N i L r r N L sin r i r T R T.T 1, T N cos r , T N L, and solve for and Derivation : Use Snell's law, H&B 17-4:546-549 Transparancy 3 Thin surface: - double refraction - shift of light ray H&B 17-4:546-549 Transparancy 3 Very thin surface: - Discard shift Simplemodel : I (1 kt ) I refl kt I trans 0 kt 1 kt : transparancy 1 kt: opacity Poor result for silhouette edges… H&B 17-4:546-549 Atmospheric effects 1 Atmospheric effects: - dust, smoke, vapor - colors are dimmed - objects less well visible H&B 10-5:549-550 Atmospheric effects 2 Attenuation by atmosphere : f atmo (d ) e d , with d : distance : attenuation factor d d min Simpler: f atmo (d ) d max d min Perceived intensity: I f atmo (d ) I obj [1 f atmo (d )]I atmo = 0.25 + [ 1 0.25 ] H&B 10-5:549-550 Rendering polygons 1 Basic illumination model: Can be used per point, but that’s somewhat expensive More efficient: Illumination model gives color for some points; Surface is filled in using interpolation of these colors. H&B 17-10:559-564 Rendering polygons 2 Constant-intensity rendering aka flat surface rendering: • Determine color for center of polygon; • Fill the polygon with a constant color. Ok if: • Object consists of planar faces, and • Light sources are far away, and • Eye point is far away, or • Polygons are about a pixel in size. H&B 17-10:559-564 Rendering polygons 2 Constant-intensity rendering aka flat surface rendering: • Determine color for center of polygon; • Fill the polygon with a constant color. Highlights not visible, Facetted appearance, increased by Mach banding effect. H&B 17-10:559-564 Mach banding • Human perception: edges are given emphasis, contrast is increased near edges. Angel (2000) H&B 17-10:559-564 Rendering polygons 2 Gouraud surface rendering: • Determine average normal on vertices; • Determine color for vertices; • Interpolate the colors per polygon (incrementally). N2 N3 N1 N4 V NV n k 1 n k 1 Nk Nk H&B 17-10:559-564 Rendering polygons 3 Gouraud surface rendering: • Much better result for curved surfaces • Errors near highlights • Linear interpolation still gives Mach banding • Silhouettes are still not smooth Gouraud Flat Rendering polygons 4 Phong surface rendering: • Determine average normal per vertex; • Interpolate normals per polygon (incrementally); • Calculate color per pixel. Fast Phong surface rendering: Like Phong surface rendering, but use 2nd order approximation of color over polygon: I ( x, y) ax2 bxy cy2 dx ey f H&B 17-10:559-564 Rendering polygons 5 Phong surface rendering: • Even better result for curved surfaces • No errors at high lights • No Mach banding • Silhouettes remain coarse • More expensive than flat or Gouraud shading H&B 17-10:559-564 Rendering polygons 5 Flat Gouraud Phong H&B 17-10:559-564 OpenGL Illumination Glfloat lightPos[] = {2.0, 0.0, 3.0, 0.0}; Glfloat whiteColor[] = {1.0, 1.0, 1.0, 1.0}; Glfloat pinkColor[] = {1.0, 0.5, 0.5, 1.0}; glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); // Use smooth shading // Enable lighting // Enable light source #0 glLightfv(GL_LIGHT0, GL_POSITION, lightPos); // position LS 0 glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteColor); // set color LS 0 glMaterialfv(GL_FRONT, GL_DIFFUSE, pinkColor); // set surface // color glBegin(GL_TRIANGLES); glNormal3fv(n1); glVertex3fv(v1); // draw triangle, give glNormal3fv(n2); glVertex3fv(v2); // first normal, followed glNormal3fv(n3); glVertex3fv(v3); // by vertex glEnd(); H&B 17-11:564-574 OpenGL Light-sources 1 First, enable lighting in general: glEnable(GL_LIGHTING); OpenGL provides (at least) eight light-sources: lightName = GL_LIGHT0, GL_LIGHT1, … , GL_LIGHT7 Enable the one(s) you need with: glEnable(lightName); Set properties with glLight*(lightName, lightProperty, propertyValue); * = i, f, iv, or fv (i: integer, f: float, v vector) H&B 17-11:564-574 OpenGL Light-sources 2 Position light-source: Glfloat sunlightPos[] Glfloat lamplightPos[] = {2.0, 0.0, 3.0, 0.0}; = {2.0, 0.0, 3.0, 1.0}; glLightfv(GL_LIGHT1, GL_POSITION, sunlightPos); glLightfv(GL_LIGHT2, GL_POSITION, lamplightPos); • Fourth coordinate = 0: source at infinity • Fourth coordinate = 1: local source • Specified in world-coordinates, according to the current ModelView specification – just like geometry. Hence, take care when you specify the position. • Light from above looks more natural H&B 17-11:564-574 OpenGL Light-sources 3 Color light-source: Glfloat greyColor[] = {0.3, 0.3, 0.3, 1.0}; Glfloat pinkColor[] = {1.0, 0.7, 0.7, 1.0}; Glfloat whiteColor[] = {1.0, 1.0, 1.0, 1.0}; glLightfv(GL_LIGHT1, GL_AMBIENT, greyColor); glLightfv(GL_LIGHT1, GL_DIFFUSE, pinkColor); glLightfv(GL_LIGHT1, GL_SPECULAR, whiteColor); • OpenGL light-source has three color properties, dependent on reflection surface. Not realistic, can be used for special effects. • If you don’t have ambient light, things often appear black. • Colors are always 4-vectors here: Fourth coordinate is alpha. Most cases: set it to 1.0. H&B 17-11:564-574 • More settings: See book OpenGL Global Lighting Global parameters: glLightModel*(paramName, paramValue); * = i, f, iv, or fv (i: integer, f: float, v vector) Global ambient light: Glfloat globalAmbient[] = {0.3, 0.3, 0.3, 1.0}; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, globalAmbient); More precise specular reflection, take view position into account: glLightModelI(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); Two-sided lighting: glLightModelI(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); H&B 17-11:564-574 OpenGL Surface properties 1 Surface reflection parameters: glMaterial*(surfFace, surfProperty, propertyValue); * = i, f, iv, or fv (i: integer, f: float, v vector) surfFace = GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK Glfloat emissionColor[] Glfloat diffuseColor[] Glfloat specularColor[] = {0.2, 0.3, 0.1, 1.0}; = {0.6, 0.3, 0.1, 1.0}; = {0.1, 0.1, 0.1, 1.0}; glMaterialfv(GL_FRONT, GL_EMISSION, glMaterialfv(GL_FRONT, GL_DIFFUSE, glMaterialfv(GL_FRONT, GL_SPECULAR, glMaterialf(GL_FRONT, GL_SHININESS, emissionColor); diffuseColor); specularColor); 25.0f); H&B 17-11:564-574 OpenGL Surface properties 2 If colors are changed often (for instance, per vertex): glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glBegin(…); for i = ... for j = ... glColor3f(red(i,j), green(i,j), blue(i,j)); glVertex3f(x(i,j), y(i,j), z(i,j)); glEnd(…); H&B 17-11:564-574 OpenGL Surface properties 3 Transparent surfaces: • First, draw all opaque surfaces; • Next, draw transparent surfaces, back to front*, using something like: glColor4f(R, G, B, A); // A: alpha, for instance 0.40 glEnable(GL_BLEND); glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); ... Draw transparent surfaces. glDisable(GL_BLEND); * OpenGL cannot automatically handle transparency, because of the z-buffer algorithm used for hidden surface removal. More on this later. H&B 17-11:564-574 OpenGL Surface properties 4 Color Blending (see also H&B: 135-136): Source: the new graphics object to be drawn; Destination: the current image built up. (RS, GS, BS, AS): Source color + alpha (RD, GD, BD, AD): Destination color + alpha (SR, SG, SB, SA): Source blending factors (DR, DG, DB, DA): Destination blending factors Components of Source and Destination are weighted and added: (SRRS+ DRRD, SGGS+ DGGD, SBBS+ DBBD, SAAS+ DAAD) is stored in the current image. H&B 17-11:564-574 OpenGL Surface properties 5 (RS, GS, BS, AS): Source color + alpha (RD, GD, BD, AD): Destination color + alpha (SR, SG, SB, SA): Source blending factors (DR, DG, DB, DA): Destination blending factors glBlendFunc(sFactor, dFactor): specify the blending factors. glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // Use alpha of source as transparency glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Use alpha of source as opacity More options available for special effects. H&B 17-11:564-574 OpenGL Surface-Rendering 1 specify the rendering method m = GL_FLAT or m = GL_SMOOTH (Gouraud, default) Ny, Nz) : specify the normal vector glShadeModel(m): glNormal*(Nx, Flat version: Smooth version: glNormal3fv(nV); glBegin(GL_TRIANGLES); glVertex3fv(V1); glVertex3fv(V2); glVertex3fv(V3); glEnd(); glBegin(GL_TRIANGLES); glNormal3fv(nV1); glVertex3fv(V1); glNormal3fv(nV2); glVertex3fv(V2); glNormal3fv(nV3); glVertex3fv(V3); glEnd(); H&B 17-11:564-574 OpenGL Surface-Rendering 2 specify the rendering method m = GL_FLAT or m = GL_SMOOTH (Gouraud, default) Ny, Nz) : specify the normal vector glShadeModel(m): glNormal*(Nx, glEnable(GL_NORMALIZE): Let OpenGL normalize the normals for you. And, also take care of effects of scaling, shearing, etc. H&B 17-11:564-574 Next • Now that we know how to render curved surfaces, let’s study how to define these…