cs380 lab iv opengl jonghyeob lee reference1. [opengl course slides by rasmus stenholt] reference2....
TRANSCRIPT
CS380 LAB IVOpenGL
Jonghyeob Lee
Reference1. [OpenGL course slides by Rasmus Stenholt]
Reference2. [http://nehe.gamedev.net/]
Goal
Introduce OpenGL programming Help you do CS380 homework by yourself
2
Notice
Use Noah board for your questions (http://noah.kaist.ac.kr/course/CS380)
3
Outline
Lighting and Materials Texture Mapping
4
5
Lighting and Materials
Why is this important? Geometry is only one third of rendering Lights and materials make up the other two Unlit objects tend to look dull and artificial
In OpenGL, lights and materials are connected Light interacts with materials Materials must be assigned to geometry to benefit
from lighting
6
Lighting Principles
The result of lighting depends on various factors Material composition of object Light colour and position Global lighting parameters
ambient light two sided lighting
Lighting can be done in both RGBA and indexed color mode
7
OpenGL Lighting
Lighting is computed per-vertex The lighting model is called Phong
shading Lighting properties
DiffuseSpecularAmbient
8
Lighting
Normals define how a surface reflects light glNormal3f( x, y, z )
Normals can be defined per-vertex Just like colours
The current normal is used to compute lighting contributions The angles between the normal and light directions are used Use unit normals for proper lighting
Some transformations affect a normal’s length glEnable( GL_NORMALIZE )
or glEnable( GL_RESCALE_NORMAL )
9
Light Properties
The command for setting lighting properties glLightfv(light, property, value); light specifies which light
Multiple lights, starting with GL_LIGHT0glGetIntegerv( GL_MAX_LIGHTS, &n );
The maximum number of lights is usually 8 Properties
colors position and type attenuation
Light color properties GL_AMBIENT GL_DIFFUSE GL_SPECULAR
10
Types of Lights
OpenGL supports two types of lightsLocal (Point) light sources Infinite (Directional) light sources
Type of light controlled by w coordinate
Usually w=1 for a point light
wzw
ywxw
zyxw
at positioned Light Local
along directed LightInfinite
0
0
11
Turning on the Lights
First you must tell OpenGL that lighting should be usedglEnable( GL_LIGHTING );
Then each light can be individually turned on/offglEnable( GL_LIGHTn );
Load a solid teapot
Tutorials
12
void display() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glutSolidTeapot(0.5);glFlush();
}
Tutorials
Add a light on previous scene
13
void display() {glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);float light_pos[] = {-2, 2, 2, 1};float light_Ka[] = {0, 0, 0, 1};float light_Kd[] = {1, 1, 1, 1};float light_Ks[] = {1, 1, 1, 1};glLightfv(GL_LIGHT0, GL_POSITION, light_pos);glLightfv(GL_LIGHT0, GL_AMBIENT, light_Ka);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_Kd);glLightfv(GL_LIGHT0, GL_SPECULAR, light_Ks);…
}
14
Material Properties
Define the surface properties of a primitive glMaterialfv( face, property, value );
Separate materials for front and back
GL_DIFFUSE Base color
GL_SPECULAR Highlight Color
GL_AMBIENT Low-light Color
GL_EMISSION Glow Color
GL_SHININESS Surface Smoothness
Tutorials Add a materials on front
15
void display() {float material_Ka[] = {0.11, 0.06, 0.11, 1.00};float material_Kd[] = {0.43, 0.47, 0.54, 1.00};float material_Ks[] = {0.33, 0.33, 0.52, 1.00};float material_Ke[] = {0.00, 0.00, 0.00, 0.00};float material_Se[] = {10};glMaterialfv(GL_FRONT, GL_AMBIENT, material_Ka);glMaterialfv(GL_FRONT, GL_DIFFUSE, material_Kd);glMaterialfv(GL_FRONT, GL_SPECULAR, material_Ks);glMaterialfv(GL_FRONT, GL_EMISSION, material_Ke);glMaterialfv(GL_FRONT, GL_SHININESS, material_Se);
}
Tutorials
Compare three teapots
16
17
Texture Mapping
Applying a 1-D, 2-D, or 3-D image to geometric primitivesTexture coordinates are called (s,t,r,q)
Uses of texturingSimulating materialsReducing geometric complexityReflectionsAdvanced surface properties
18
Texture Mapping
s
t
x
y
z
image
geometry screen
19
Applying Textures
The short version1. Specify a texture image
1. Read or generate image2. Assign to texture3. Enable texturing
2. Specify texture parameters1. Wrapping
1. How texture edges are handled2. Filtering
1. How texture sampling is handled
3. Assign texture coordinates to vertices
20
Generating a Texture Identifier
Generate texture namesglGenTextures( n, *texIds );
A texture name is just an integerThe texture name is assigned to some texture
data later on Example
unsigned int texName;glGenTextures(1, &texname)
21
Binding Textures
Bind textures before usingglBindTexture( target, id ); Binding a texture means assigning a certain texture id to a certain
kind of texture The valid kinds of textures are
GL_TEXTURE_1D GL_TEXTURE_2D GL_TEXTURE_3D
ExampleglBindTexture( GL_TEXTURE_2D, texName);
22
Filter Modes Handles the sampling mode of the texture Minification or magnification
Handles when the texture to screen mapping is not 1:1 Special mipmap minification filters
Wrap Modes Handles texture lookups outside the texture’s edges Clamping
Copies data from the edge of the texture Repeating
Tiles the texture Texture Functions
How to mix primitive’s color with texture’s color Blend Modulate Replace
Texture Application Methods
23
Filter Modes
Texture Polygon
Magnification Minification
PolygonTexture
Example:
glTexParameteri( glTexParameteri( target, type, modetarget, type, mode ); );
24
Wrapping Mode
Example:
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP )
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT )
texture
s
t
GL_CLAMPwrapping
GL_REPEATwrapping
25
Based on parametric texture coordinates Texture coordinates are assigned to vertices
Just like colours and normals The n-D to 3-D mapping is the responsibility of
the programmer/modeller glTexCoord*() specified at each vertex
s
t
Mapping Texture
26
Texture Mapping
0, 0 1, 0
(0.4, 0.2)
(0.8, 0.4)
A
B C
a
bc
1, 10, 1
(s, t) = (0.2, 0.8)
Texture Space Object Space
Tutorials
Make checkerboard texture
27
int i, j, c; for (i = 0; i < 64; i++) { for (j = 0; j < 64; j++) { c = ((((i&0x8)==0)^((j&0x8))==0))*255; checkImage[i][j][0] = (GLubyte) c; checkImage[i][j][1] = (GLubyte) c; checkImage[i][j][2] = (GLubyte) c; checkImage[i][j][3] = (GLubyte) 255; } }
Tutorials
Assign texture
28
glGenTextures(1, &texName); glBindTexture(GL_TEXTURE_2D, texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
Tutorials
Texture mapping onto rectangle
29
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, -0.5, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(0.5, -0.5, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(0.5, 0.5, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f(-0.5, 0.5, 0.0); glEnd(); glFlush(); glDisable(GL_TEXTURE_2D);
Q&A
Any questions?
30