0% found this document useful (0 votes)
42 views3 pages

Lights and Materials

This document discusses lighting and material specification in OpenGL. It covers enabling lights, specifying light parameters like position and type (distant, spot), setting material properties, and controlling lighting calculations. Functions like glLight and glMaterial are used to configure lights and materials. Lighting is calculated based on ambient, diffuse, and specular components. Flat and smooth shading modes are also discussed.

Uploaded by

ahm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
42 views3 pages

Lights and Materials

This document discusses lighting and material specification in OpenGL. It covers enabling lights, specifying light parameters like position and type (distant, spot), setting material properties, and controlling lighting calculations. Functions like glLight and glMaterial are used to configure lights and materials. Lighting is calculated based on ambient, diffuse, and specular components. Flat and smooth shading modes are also discussed.

Uploaded by

ahm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 3

Lights and Materials Enabling Lights

Woo, Neider et Al., Chapter 4 • To enable lights from a single source (Light0):
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

Defaults:
Light 0: white light (1.0, 1.0, 1.0, 1.0) in RGBA
diffuse and specular components
Other lights: black (0.0, 0.0, 0.0, 1.0)
Position: (0.0, 0.0, 1.0, 0.0) in HC, w=0.0 means f distance,
i.e. the HCs represent a direction, not a point

• Once lighting is enabled, colors assigned by glColor*( ) are


no longer used

Normals Specifying a Distant Light Source


• When specifying polygon vertices, we must supply • Main functions to set scalar or vector parameters
the normal vectors to each vertex: for OpenGL light sources:

void glNormal3*(TYPE dx, TYPE dy, TYPE dz) void glLight*(GLenum light,
void glNormal3*v(TYPE norm); GLenum param, TYPE value);
void glLight*v(GLenum light,
•Lighting calculations require unitary normals GLenum param, TYPE *value);
• Scaling changes the length of the normals light: GL_LIGHT0, GL_LIGHT1, GL_LIGHT2,…
• To enable automatic normalization, use: param: GL_POSITION, GL_DIFFUSE,
glEnable(GL_NORMALIZE); GL_AMBIENT, GL_SPECULAR, others…

Specifying a Distant Light Source Specifying a Distant Light Source


• Example: specifying light source parameters
• Example: source position never changes
I = Iamb+Idiff+Ispec= Ia Ka + Id Kd N˜L + Is Ks (R˜V)n
void init( ) {
GLfloat light_pos[] = {1.0, 2.0, 3.0, 1.0}; GLfloat position0[] = {1.0, 1.0, 1.0, 0.0};
GLfloat diffuse0[] = {1.0, 0.0, 0.0, 1.0}; // Id term - Red
// ---- Rest of init( ) ---- GLfloat specular0[] = {1.0, 1.0, 1.0, 1.0}; // Is term - White
glEnable(GL_LIGHTING); GLfloat ambient0[] = {0.1, 0.1, 0.1, 1.0}; // Ia term - Gray
glEnable(GL_LIGHT0); glEnable(GL_LIGHTING);
glMatrixMode(GL_MODELVIEW); glEnable(GL_LIGHT0);

glLoadIdentity( ); glLightfv(GL_LIGHT0, GL_POSITION, position0);


glLightfv(GL_LIGHT0, GL_POSITION, light_pos); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular0);
} glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);
Specifying a Spot Light Specifying a Spot Light
• Spot light is a close light source with direction, • Attenuation with distance generates a softer and
angle and exponential drop off more realistic image:
1
void glLight*(GLenum light, GLenum param, f att (d )
a  bd  cd 2
TYPE value);
void glLight*v(GLenum light, GLenum param, d is the distance computed by OpenGL
TYPE *value);
a = GL_CONSTANT_ATTENUATION (default 1.0)
param: GL_SPOT_DIRECTION b = GL_LINEAR_ATTENUATION (default 0.0)
GL_SPOT_CUTOFF (default 180o) c = GL_QUADRATIC_ATTENUATION (default 0.0)
GL_SPOT_EXPONENT (default 0)
Default is no attenuation: a=1, b=0, c=0
GL_POSITION has the form (x, y, z, 1.0)

Specifying a Material Specifying a Material


• Once lighting is enabled, colors are no longer used
I = Iamb+Idiff+Ispec= Ia Ka + Id Kd N˜L + Is Ks (R˜V)n
• Main functions to set scalar or vector parameters
for OpenGL faces: param: GL_AMBIENT // Ka term
void glMaterial*(GLenum face, GL_DIFFUSE // Kd term
GLenum param, TYPE value); GL_SPECULAR // Ks term
void glMaterial*v(GLenum face, GL_SHININESS // exponent n
GLenum param, TYPE *value); GL_AMBIENT_AND_DIFFUSE // Ka = Kd
face: GL_FRONT,
GL_BACK, GL_EMISSION // No light calculations
GL_FRONT_AND_BACK // simulates sources

Specifying a Material Specifying a Material


• Example: • Example:

typedef struct materialStruct { materialStruct brass {


{0.33, 0.22, 0.03, 1.0}, // Ka
GLfloat Ka [4]; {0.78, 0.57, 0.11, 1.0}, // Kd
GLfloat Kd[4]; {0.99, 0.91, 0.81, 1.0}, // Ks
GLfloat Ks[4]; 27.8 // n
GLfloat n; };
} materialStruct;
materialStruct red_shiny_plastic {
{0.3, 0.0, 0.0, 1.0}, // Ka
void set_material(materialStruct *mat) { {0.6, 0.0, 0.0, 1.0}, // Kd
glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, mat->Ka); {0.8, 0.6, 0.6, 1.0}, // Ks
glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, mat->Kd); 100.0 // n
glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, mat->Ks); };
glMaterialfv (GL_FRONT_AND_BACK, GL_SHININESS, mat->n);
} set_material(red_shiny_plastic); // Usage
Controlling Lighting Calculations Smooth Shading
• Light for back faces will not be computed unless we set: • Flat shading (no interpolation):
glLightModeli(GL_LIGHT_MODEL_TWO_SIDED, GL_TRUE); glShadeModel(GL_FLAT);
• If all sources are off, but we still want ambient light:
GLfloat glob_ambient[] = {0.2, 0.2, 0.2, 1.0}; • Phong shading:
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, glob_ambient); glShadeModel(GL_SMOOTH);
• By default, the viewer is at infinite distance. In this case,
calculation for specular component is done once for each NOTE: Shading may be unsatisfactory when
face. When this is not the case, set: polygons are too big. If this is the case,
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); divide into smaller polygons

You might also like