CS425 OpenGL Materials
What Color Is It? green & blue absorbed white light Looks red
What Color Is It? red & blue absorbed white light Looks green
What Color Is It? blue absorbed white light Looks yellow
What Color Is It? red absorbed red light ? cyan
What Color Is It? red absorbed red light cyan Looks black
What Color Is It? blue absorbed magenta light ?
What Color Is It? blue absorbed magenta light 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)
glMaterial{if}v(face, pname, param ) 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);
NO Ambient (.7,.7,.7) Ambient (.8,.8,.2) Ambient Diffuse only (.1,.5, ) diffuse & specular (low shininess) diffuse & specular (high shininess) + (.3,.2,.2,.0) emmissive, no specular specular (1,1,1,1) shininess (5.0) specular (1,1,1,1) shininess (100.0)
Nate Robbins Lightmaterial
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);
colormat.c
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 GLdouble eqn[ ] = {0.0, -1.0, 0.07, 0.5}; … glEnable(GL_CLIP_PLANE0); … glClipPlane(GL_CLIP_PLANE0, eqn); ABCD Plane equation See cutting.c (handout)
Two Sided Materials with Cutting Plane
OpenGL Attenuation Same formula that Denbigh gave. 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=1 kl=0 kq=0 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=0 kl=0 kq=0.001 kc=1 kl=0 kq= =