300 likes | 318 Vues
This reference provides an overview of OpenGL programming, specifically focusing on lighting, materials, and texture mapping. It aims to help students with their CS380 homework assignments and recommends using the Noah board for any questions.
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?