300 likes | 317 Views
CS380 LAB IV OpenGL. 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. Notice. Use Noah board for your questions ( http://noah.kaist.ac.kr/course/CS380 ).
E N D
CS380 LAB IV OpenGL 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
Notice Use Noah board for your questions (http://noah.kaist.ac.kr/course/CS380)
Outline Lighting and Materials Texture Mapping
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
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
OpenGL Lighting • Lighting is computed per-vertex • The lighting model is called Phong shading • Lighting properties • Diffuse • Specular • Ambient
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 )
Light Properties • The command for setting lighting properties • glLightfv(light, property, value); • light specifies which light • Multiple lights, starting with GL_LIGHT0 glGetIntegerv( 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
Types of Lights • OpenGL supports two types of lights • Local (Point) light sources • Infinite (Directional) light sources • Type of light controlled by w coordinate • Usually w=1 for a point light
Turning on the Lights • First you must tell OpenGL that lighting should be used glEnable( GL_LIGHTING ); • Then each light can be individually turned on/off glEnable( GL_LIGHTn );
Tutorials void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glutSolidTeapot(0.5); glFlush(); } Load a solid teapot
Tutorials 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); … } Add a light on previous scene
GL_DIFFUSE Base color GL_SPECULAR Highlight Color GL_AMBIENT Low-light Color GL_EMISSION Glow Color GL_SHININESS Surface Smoothness Material Properties • Define the surface properties of a primitive • glMaterialfv( face, property, value ); • Separate materials for front and back
Tutorials 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); } Add a materials on front
Tutorials Compare three teapots
Texture Mapping • Applying a 1-D, 2-D, or 3-D image to geometric primitives • Texture coordinates are called (s,t,r,q) • Uses of texturing • Simulating materials • Reducing geometric complexity • Reflections • Advanced surface properties
y z x t s Texture Mapping screen geometry image
Applying Textures • The short version • Specify a texture image • Read or generate image • Assign to texture • Enable texturing • Specify texture parameters • Wrapping • How texture edges are handled • Filtering • How texture sampling is handled • Assign texture coordinates to vertices
Generating a Texture Identifier • Generate texture names glGenTextures(n,*texIds ); • A texture name is just an integer • The texture name is assigned to some texture data later on • Example unsigned int texName; glGenTextures(1, &texname)
Binding Textures • Bind textures before using glBindTexture( 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 • Example glBindTexture( GL_TEXTURE_2D, texName);
Texture Application Methods • 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 Polygon Texture Polygon Magnification Minification Filter Modes Example: glTexParameteri( target, type, mode );
t s GL_REPEAT wrapping GL_CLAMP wrapping texture Wrapping Mode • Example: glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ) glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT )
Mapping Texture • 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 t s
Texture Space Object Space 1, 1 (s, t) = (0.2, 0.8) 0, 1 A a c (0.4, 0.2) b B C (0.8, 0.4) 0, 0 1, 0 Texture Mapping
Tutorials 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; } } Make checkerboard texture
Tutorials 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); Assign texture
Tutorials 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); Texture mapping onto rectangle
Q&A Any questions?