Title: Color and Lighting
1Color and Lighting
2Color1/5
- 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
3Color2/5
- RGBA mode
- Four components Red, Green, Blue, and Alpha.
- Each component is normalize to 0.01.0
- glColor 34sifdv(TYPE colors)
- Ex.
- glColor3f(0.0, 0.0, 0.0) black color
- glColor4f(0.0, 1.0, 0.0, 1.0) green color
4Color3/5
- 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 (its load by window system). - glIndexsidf(TYPE c)
5Color4/5
- Clearing the color buffer
- 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).
6Color5/5
Consider the following code with different
shading model glBegin(GL_POLYGON) glColor3f(1.0
, 1.0, 1.0) glVertex2f(-0.5, 0.-0.5) glColor3f(0
.0, 0.0, 1.0) glVertex2f(0.5, 0.-0.5) glColor3f(
1.0, 1.0, 0.0) glVertex2f(0.0, 0.5) glEnd()
7Hidden-Surface Removal
- How to apply HSR in OpenGL
- glutInitDisplayMode(GLUT_DEPTH)
- Enable the depth buffer.
- glEnable(GL_DEPTH_TEST)
- Enable depth test.
- In display function
- glClear(GL_DEPTH_BUFFER_BIT) when you wish to
clean the depth buffer.
8Lights in OpenGL1/2
- Ambient light
- Light that is been scattered by the environment.
- Diffuse light
- Light that come from one direction.
- Specular light
- Light that come from particular direction that
tend to bounce off the surface in a preferred
direction.
9Lights in OpenGL2/2
Three different kinds of lights on a white
ball. Specular light white Diffuse light
yellow Ambient light red
10Material in OpenGL1/3
- 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.
11Material in OpenGL2/3
- Specular Shininess
- Specular reflection from an object produces
highlights. - The amount of specular reflection seen by a
viewer does depend 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 light, you'll probably use this
feature mostly to simulate lamps and other light
sources in a scene.
12Material in OpenGL3/3
A white light on the ball that has following
materials Specular blue Diffuse red Ambient
green
13Put light into OpenGL
- How to apply lighting in OpenGL
- Use glEnable(GL_LIGHTING) to enable lighting.
- Enable and set properties for light sources.
- (GL_LIGHT0 to GL_LIGHT7)
- Select a lighting model.
- Define material properties for objects in the
scene. - Assign normal vectors for each vertex of every
object.
14Lighting Sample1/4
- include ltGL/glut.hgt
- void init()
-
- GLfloat mat_diffuse 1.0, 0.0, 0.0, 1.0
- GLfloat mat_specular 0.0, 0.0, 1.0, 1.0
- GLfloat mat_ambient 0.0, 1.0, 0.0, 1.0
- GLfloat mat_shininess 50.0
- GLfloat light_specular 1.0, 1.0, 1.0, 1.0
- GLfloat light_diffuse 1.0, 1.0, 1.0, 1.0
- GLfloat light_ambient 0.0, 0.0, 0.0, 1.0
- GLfloat light_position 5.0, 5.0, 10.0,
0.0 - glClearColor(0.0, 0.0, 0.0, 0.0)
- glShadeModel(GL_SMOOTH)
- // z buffer enable
- glEnable(GL_DEPTH_TEST)
15Lighting Sample2/4
- // set light property
- glEnable(GL_LIGHT0)
- glLightfv(GL_LIGHT0, GL_POSITION,
light_position) - glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse)
- glLightfv(GL_LIGHT0, GL_SPECULAR,
light_specular) - glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient)
- // set material property
- glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse)
- glMaterialfv(GL_FRONT, GL_SPECULAR,
mat_specular) - glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient)
- glMaterialfv(GL_FRONT, GL_SHININESS,
mat_shininess) -
- void GL_display()
-
- glClear(GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT
) - glutSolidSphere(0.8, 128, 128)
16Lighting Sample3/4
- void reshape (int w, int h)
-
- glViewport (0, 0, (GLsizei) w, (GLsizei) h)
- glMatrixMode (GL_PROJECTION)
- glLoadIdentity()
- glOrtho (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0)
- glMatrixMode(GL_MODELVIEW)
- glLoadIdentity()
-
- int main(int argc, char argv)
-
- glutInit(argc, argv)
- glutInitWindowSize(400, 400)
- glutInitWindowPosition(0, 0)
- glutInitDisplayMode(GLUT_SINGLE GLUT_RGBA
GLUT_DEPTH) - glutCreateWindow("Planet")
- init()
- glutDisplayFunc(GL_display)
17Lighting Sample4/4
Lighting enabled
Lighting disabled
18Lighting Normal Vector1/2
- Assign normal vectors for each vertex of every
object - glNormal34isfdv(TYPE normal)
- Assign normal vector for vertices (the normal
vector should be assigned before you assign
vertex). - Normal vectors must be normalize. OpenGL can
automatically normalize normal vector by
glEnable(GL_NORMALIZE) - In the previous sample, the normals for the
sphere are defined as part of the
glutSolidSphere() routine.
19Lighting Normal Vector2/2
- Example
- void 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()
-
20Lighting Light Source1/7
- 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_LIGHT0GL_LIGHT7) - GL_LIGHTi can be rewritten as GL_LIGHT0 i.
- glLightifv(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.
21Lighting Light Source2/7
22Lighting Light Source3/7
- 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_ambient4 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 location of the light source.
23Lighting Light Source4/7
- 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
always 1
24Lighting Light Source5/7
- 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 exponent
- glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0)
- Define light spot cutoff
- The value for GL_SPOT_CUTOFF is restricted to
being within the range 0.0,90.0 (unless it has
the special value 180.0 (default)).
25Lighting Light Source6/7
26Lighting Light Source7/7
- Control a Lights Position and Direction
- OpenGL treats the position and direction of a
light source just as it treats the position of a
geometric primitive. - The MODELVIEW transformation will also be applied
to light sources. - Any matrix operations can also apply to light
sources.
27Lighting Lighting Model1/2
- Selecting a lighting model
- void glLightModelifv(GLenum pname, TYPE
param) - Sets properties of the lighting model.
- The lighting model is used to control the global
behaviors of all the lights.
28Lighting Lighting Model2/2
29Lighting Material1/6
- Define material properties for objects in the
scene. - void glMaterialifv(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 pname and the desired values for
that property are given by param.
30Lighting Material2/6
31Lighting Material3/6
32Lighting Material4/6
- 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()
33Lighting Material5/6
- 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.
34Lighting Material6/6
- Following is a example that using color material
to change the ambient and diffuse - glEnable(GL_COLOR_MATERIAL)
- glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE)
- glBegin(GL_POLYGON)
- glNormal3f(0.0, 1.0, 0.0)
- glColor3f(1.0, 0.0, 0.0)
- glVertex3f(-0.5, -0.5, -0.5)
- glColor3f(0.0, 0.0, 1.0)
- glVertex3f(0.5, -0.5, -0.5)
- glColor3f(0.0, 1.0, 0.0)
- glVertex3f(0.0, 0.5, 0.5)
- glEnd()
35Any Question