36
OpenGL Color and Lighting 2003 Spring Keng Shih-Ling <[email protected] >

OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Embed Size (px)

Citation preview

Page 1: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

OpenGL Color and Lighting2003 Spring

Keng Shih-Ling <[email protected]>

Page 2: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Color Example

GL_FLAT GL_SMOOTH

Page 3: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Color Example#include <GL/glut.h>

void GL_display(){

glBegin(GL_TRIANGLES); glColor3f(1,1, 1); // 白glVertex2f(0.0, 3.0); glColor3f(0, 0,1); // 藍glVertex2f(6.0, 1.5);

glColor3f(0,1,1); // 黃 glVertex2f(4.0, 0.0); glEnd();

}

Page 4: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting Example

Lighting enabled Lighting disabled

Page 5: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting Example#include <GL/glut.h>

void GL_display(){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glutSolidSphere(1.0, 16, 16);glFlush();

}

Page 6: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting Examplevoid init(){

GLfloat mat_diffuse[4] = {1.0, 1.0, 1.0, 1.0};GLfloat mat_specular[4] = { 1.0, 1.0, 1.0, 1.0 };GLfloat mat_shininess[] = { 50.0 };GLfloat light_position[4] = { 1.0, 1.0, 1.0, 0.0 };glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_SMOOTH);

glEnable(GL_DEPTH_TEST); // z buffer enableglEnable(GL_LIGHTING); // enable lighting

// set light propertyglEnable(GL_LIGHT0);glLightfv(GL_LIGHT0, GL_POSITION, light_position);

// set material propertyglMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

}

Page 7: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Color Two Color modes:

– RGBA– Color Index

Choosing between RGBA and Color Index– glutInitDisplayMode(); (GLUT)

– glutInitDisplayMode(GL_RGBA) (for RGBA)– glutInitDisplayMode(GL_INDEX) (for color index)

Page 8: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Color RGBA mode:

– Four components Red, Green, Blue, and Alpha.– Each component is normalize to 0.0~1.0– glColor {34}{sifd}[v](TYPE colors);

• Ex.– glColor3f(0.0, 0.0, 0.0); // black color– glColor4f(0.0, 1.0, 0.0, 1.0); // green colo

r

Page 9: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Color Color Index mode:

– Use a color map (lookup table) to prepare for a paint-by-number scene.

• OpenGL does not provide any routing to load color map (it’s load by window system).

– glIndex{sidf…}(TYPE c);

Page 10: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Color Clearing the Window

– Use glClearColor() or glClearIndex() to specify the clear color.

– Call glClear(GL_COLOR_BUFFER_BIT); if need to clear the color buffer.

Specifying shading model– glShadeModel(GLenum mode);

• The parameter is either GL_FLAT or GL_SMOOTH (default).

Page 11: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Hidden-Surface Removal How to apply HSR in OpenGL

• glutInitDisplayMode(GLUT_DEPTH);• glEnable(GL_DEPTH_TEST);

– In display function• glClear(GL_DEPTH_BUFFER_BIT);

Page 12: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Light in OpenGL Ambient

– Light that is been scattered by the environment. Diffuse

– Light that come from one direction. Specular

– Light that come from particular direction that tend to bounce off the surface in a preferred direction.

Page 13: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Material in OpenGL Material

– Describe the percentages of the incoming red, green, blue light it reflects on a surface.

– Diffuse• The most important role in determining what you

perceive the color of an object to be. • Affected by the color of the incident diffuse light

and the angle of the incident light relative to the normal direction

– Ambient• Affected by the global ambient light and ambient

light from individual light sources.

Page 14: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

OpenGL Light and Material– Specular & Shininess

• Specular reflection from an object produces highlights. • The amount of specular reflection seen by a viewer does d

epend on the location of the viewpoint.• Shininess control the size and brightness of the highlight.

– Emission• Make an object appear to be giving off light of that color. • Since most real-world objects (except lights) don't emit li

ght, you'll probably use this feature mostly to simulate lamps and other light sources in a scene.

Page 15: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

OpenGL Light and Material

Ambient: Green

Diffuse : Red

Specular: Blue

Page 16: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Put light into OpenGL How to apply lighting in OpenGL

– Use glEnable(GL_LIGHTING); to enable lighting.– Enable and set properties for light sources.– Select a lighting model.– Define material properties for objects in the sce

ne.– Assign normal vectors for each vertex of every o

bject.

Page 17: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Assign Normal Vector Assign normal vectors for each vertex of ev

ery object– glNormal{34}{isfd}[v](TYPE* normal);

• Assign normal vector for vertices (the normal vector should be assigned before you assign vertices).

• Normal vectors must be normalize. OpenGL can automatically normalize normal vector by glEnable(GL_NORMALIZE);

• In the example, the normals for the sphere are defined as part of the glutSolidSphere() routine.

Page 18: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Sample: Assign Normal Vectorvoid GL_Display(){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glBegin(GL_POLYGON);

glNormal3f(0.0, 1.0, 0.0);glVertex3f(1.0, 0.0, 0.0);glVertex3f(0.0, 0.0, -1.0);glVertex3f(-1.0, 0.0, 0.0);

glEnd();glFlush();

}

Page 19: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Light Source Enable and set properties for light sources

– Use glEnable(GL_LIGHT0); to enable light zero. You can use at most 8 light sources in OpenGL spec. (GL_LIGHT0~GL_LIGHT7)

– glLight{if}[v](GLenum light, Glenum pname, TYPE param);

• Specify the attribute of light• light can be GL_LIGHT0 ~ GL_LIGHT7• pname is the characteristic of the light• param is the value of pname.

Page 20: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Light SourcePname Def. Value Meaning

GL_AMBIENT (0.0, 0.0, 0.0, 0.0) ambient RGBA intensity of lightGL_DIFFUSE (1.0, 1.0, 1.0, 1.0) diffuse RGBA intensity of lightGL_SPECULAR (1.0, 1.0, 1.0, 1.0) specular RGBA intensity of lightGL_POSITION (0.0, 0.0, 1.0, 0.0) (x, y, z, w) position of lightGL_SPOT_DIRECTION (0.0, 0.0, -1.0) (x, y, z) direction of spotlightGL_SPOT_EXPONENT 0.0 spotlight exponentGL_SPOT_CUTOFF 180.0 spotlight cutoff angleGL_CONSTANT_ATTENUATION 1.0 constant attenuation factorGL_LINEAR_ATTENUATION 0.0 linear attenuation factorGL_QUADRATIC_ATTENUATION 0.0 quadratic attenuation factor

Page 21: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Light Source– Color

• The default values listed for GL_DIFFUSE and GL_SPECULAR apply only to GL_LIGHT0.

• For other lights, the default value is (0.0, 0.0, 0.0, 1.0 ) for both GL_DIFFUSE and GL_SPECULAR.

– Ex.» GLfloat light_ambient[4] = {0.0, 0.0, 1.0, 0.0};» glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);

– Position ( x, y, z, w )• W is ZERO, Directional light, (x,y,z) specify its direction.• W is NONZERO, Positional light, (x,y,z) specify the loca

tion of the light source.

Page 22: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Light Source– Attenuation

• d = distance between the light's position and the vertex

• kc = GL_CONSTANT_ATTENUATION • kl = GL_LINEAR_ATTENUATION • kq = GL_QUADRATIC_ATTENUATION• If light is directional light, the attenuation is 1

2

1

dkdkkFacrornAttenuatio

qlc

Page 23: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Light Source– How to create spot light

• Define your light as positional light• Define light spot direction

GLfloat spot_direction[] = { -1.0, -1.0, 0.0 };glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);

• Define light spot exponentglLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);

• Define light spot cutoff– The value for GL_SPOT_CUTOFF is restricted to being within th

e range [0.0,90.0] (unless it has the special value 180.0 (default)).

Page 24: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Light Source

Page 25: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Light Source Control a Light’s Position and Direction

– OpenGL treats the position and direction of a light source just as it treats the position of a geometric primitive.

– MODELVIEW Transformation will be applied. Three types of control

– A light position that remains fixed– A light that moves around a stationary object– A light that moves along with the viewpoint

Page 26: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Light Source Keeping the Light Stationary

glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity();if (w <= h)

glOrtho (-1.5, 1.5, -1.5*h/w, 1.5*h/w, -10.0, 10.0);else

glOrtho (-1.5*w/h, 1.5*w/h, -1.5, 1.5, -10.0, 10.0);glMatrixMode (GL_MODELVIEW);glLoadIdentity();…/* later in init() */GLfloat light_position[] = { 1.0, 1.0, 1.0, 1.0 };glLightfv(GL_LIGHT0, GL_POSITION, position);/* NO other MODELVIEW transformation is set…*/

Page 27: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Light Source Independently Moving the Light

static GLdouble spin;void display(void){

GLfloat light_position[] = { 0.0, 0.0, 1.5, 1.0 };glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);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();glutSolidTorus (0.275, 0.85, 8, 15);

glPopMatrix();glFlush();

}

Page 28: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Light Source Moving the Light Source Together with Your Viewpoint

GLfloat light_position() = { 0.0, 0.0, 0.0, 1.0 };glMatrixMode(GL_MODELVIEW);glLoadIdentity();glLightfv(GL_LIGHT0, GL_POSITION, light_position);……static GLdouble ex, ey, ez, upx, upy, upz;void display(void){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();

gluLookAt (ex, ey, ez, 0.0, 0.0, 0.0, upx, upy, upz);glutSolidTorus (0.275, 0.85, 8, 15);

glPopMatrix();glFlush();

}

Page 29: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Lighting Model Selecting a lighting model

– void glLightModel{if}[v](GLenum pname, TYPE[*] param);

• Sets properties of the lighting model. • The characteristic of the lighting model being set is de

fined by pname, which specifies a named parameter.• param indicates the values to which the pname chara

cteristic is set

Page 30: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Lighting ModelPname Def. Value MeaningGL_LIGHT_MODEL_AMBIENT (0.2, 0.2, 0.2, 1.0) ambient RGBA

intensity of the entire scene

GL_LIGHT_MODEL_LOCAL_VIEWER 0.0 or GL_FALSE how specularreflection anglesare computed

GL_LIGHT_MODEL_TWO_SIDE 0.0 or GL_FALSE choose betweenone-sided or two-sided lighting

Page 31: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Material Define material properties for objects in the scene.

– void glMaterial{if}[v](GLenum face, GLenum pname, TYPE[*] param);

• Specifies a current material property for use in lighting calculations.

• face can be GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.• The particular material property being set is identified by pn

ame and the desired values for that property are given by param.

Page 32: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: MaterialPname Def. Value Meaning

GL_AMBIENT (0.2, 0.2, 0.2, 1.0) ambient color of materialGL_DIFFUSE (0.8, 0.8, 0.8, 1.0) diffuse color of materialGL_AMBIENT_AND_DIFFUSE ambient and diffuse color of

materialGL_SPECULAR (0.0, 0.0, 0.0, 1.0) specular color of materialGL_SHININESS 0.0 specular exponentGL_EMISSION (0.0, 0.0, 0.0, 1.0) emissive color of materialGL_COLOR_INDEXES (0, 1, 1) ambient, diffuse, and specular color

indices

Page 33: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Material

No Ambien

t

Gray Ambien

t

Blue Ambien

t

Diffuse Only

Specular Higher Shininess

Emission

Page 34: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Material Performance issue

– glMaterialfv(); is called repeatedly to set different material properties for different objects.

– glMaterial*() has a performance cost associate with its use.

– Another technique for minimizing performance costs associated with changing material properties is to use glColorMaterial();

Page 35: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Lighting: Material– glColorMaterial(GLenum face, GLenum mode);

• Causes the material property of the specified material face to track the value of the current color at all times.

• face parameter can be GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK (default).

• mode parameter can be GL_AMBIENT, GL_DIFFUSE, GL_AMBIENT_AND_DIFFUSE (the default), GL_SPECULAR, or GL_EMISSION.

• A change to the current color (using glColor*()) immediately updates the specified material properties.

• Use glEnable(GL_COLOR_MATERIAL); to enable color material.

• glColorMaterial() has no effect on color-index lighting.

Page 36: OpenGL Color and Lighting 2003 Spring Keng Shih-Ling

Any Question?

?