230 likes | 263 Views
Learn how different materials in OpenGL respond to light, affecting the colors perceived, and how to control material properties like ambient, diffuse, and specular reflections. Understand color tracking and two-sided materials with examples. Discover OpenGL functions for light attenuation.
E N D
CS425 OpenGL Materials
What Color Is It? white light green & blue absorbed Looks red
What Color Is It? white light red & blue absorbed Looks green
What Color Is It? white light blue absorbed Looks yellow
What Color Is It? red light ? red absorbed cyan
What Color Is It? red light red absorbed cyan Looks black
What Color Is It? magenta light ? blue absorbed
What Color Is It? magenta light blue absorbed Looks red
Material Response to Light • The material specified in OpenGL can have three different responses to the light hitting it plus one emissive characteristic. • You can separately specify the response to: • Ambient • Diffuse • Specular • And you can specify that the material “emits light”
glMaterial{if}v(face, pname, param) • face • GL_FRONT • GL_BACK • GL_FRONT_AND_BACK
glMaterial{if}v(face, pname, param) • pname • GL_AMBIENT (ambient color of material) • GL_DIFFUSE (diffuse color of material) • GL_AMBIENT_AND_DIFFUSE (both) • GL_SPECULAR (specular color of material) • GL_SHININESS (specular exponent) • GL_EMISSION (emissive color of material) • GL_COLOR_INDEXES (ambient, diffuse, and specular color indices)
param The value for the pname’d material property Example GLfloat mat_amb_diff [ ] = {0.1, 0.5, 0.8, 1.0}; glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff); glMaterial{if}v(face, pname, param )
diffuse & specular (low shininess) diffuse & specular (high shininess) + (.3,.2,.2,.0) emmissive, no specular Diffuse only (.1, .5, .8. 1.0) NO Ambient specular (1,1,1,1) shininess (5.0) specular (1,1,1,1) shininess (100.0) (.7, .7, .7) Ambient (.8, .8, .2) Ambient
Color Material Mode • I didn’t find this previously. • Causes the material property specified to track the value of the current color (glColor*) • glColorMaterial(face, mode) • “face” and “mode” are same as for glMaterial. • Must use glEnable (see example)
glColorMaterial example glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT, GL_DIFFUSE); glColor3f(0.2, 0.5, 0.8); /* draw some objects */ glColorMaterial(GL_FRONT, GL_SPECULAR); /*glColor no longer changes diffuse reflection, it now changes secular reflection */ glColor3f(0.9, 0.0, 0.2); /* draw some other objects */ glDisable(GL_COLOR_MATERIAL);
Two Sided Materials GLfloat outside = {0.2, 1.0, 1.0, 1.0}; GLfloat inside = {1.0, 0.5, 0.5, 1.0}; … glMaterialfv(GL_FRONT, GL_DIFFUSE, outside); glMaterialfv(GL_BACK, GL_DIFFUSE, inside); … glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
Additional Clipping Plane A B C D Plane equation GLdouble eqn[ ] = {0.0, -1.0, 0.07, 0.5}; … glEnable(GL_CLIP_PLANE0); … glClipPlane(GL_CLIP_PLANE0, eqn); See cutting.c (handout)
Same formula that Denbigh gave. OpenGL Attenuation c = constant factor l = linear factor q = quadratic factor d = distance
Function Calls • You use the glLightf function to select attenuation factors. Default values are kc=1, kl=0, kq=0. • glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0); • glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0); • glLlightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.0);
kc=0 kl=0 kq=0.001 kc=0 kl=1 kq=0 kc=0 kl=0.5 kq=0 kc=0 kl=0.2 kq=0 kc=0 kl=0.1 kq=0 kc=0 kl=0.01 kq=0 kc=0 kl=0 kq=0.1 kc=1 kl=0 kq=0.001 kc=1 kl=0 kq=0 + =