590 likes | 782 Views
CH6 Texture. Course Map. Vertex pipeline. Transformation & Lighting. Viewport culling & clipping. Primitive assembly. Rasterizer setup. We are here!. Pixel pipeline. Texture blending. Per Fragment operations. Buffer operations. Framebuffer. Before coding … 1/3.
E N D
Course Map Vertex pipeline Transformation & Lighting Viewport culling & clipping Primitive assembly Rasterizer setup We are here! Pixel pipeline Texture blending Per Fragment operations Buffer operations Framebuffer
Before coding…1/3 • Prepare all texture images you need. • BMP file is a good choice • If you want to load other format, you can try the FreeImage library. • Or…just convert image files to BMP files
Before coding…2/3 • Add GlAux.Lib into your project.
Before coding…3/3 • Prepare a mesh with texture coordinate • For simple shapes, you can assign texture coordinate by manually coding. • For complex objects • Use automatic texture-coordinate generation • Or use modeling tools • Maya, 3DS Max, Blender…
How to use texture? 1/2 • Initial Texture • Generate Texture • glGenTextures(number of textures , texture id array) • Bind • glBindTexture(GL_TEXTURE_2D, textId); • Move Date into Texture • glTexImage2D (…) • or gluBuild2DMipmaps(…) • Set the Options • glTexEnv (…) • glTexParameteri (…)
How to use texture? 2/2 • Draw Object with Texture • Enable • glEnable(GL_TEXTURE_2D); • Bind • glBindTexture(GL_TEXTURE_2D, textId); • Assign texture coordinate for each vertex • glTexCoord2f(u, v); • glVertex3f(x, y, z); • Disable and unbind them when you don’t want to use them on next object.
Example Program 1/4 #include<gl/glaux.h> #include<gl/glut.h> #define TEX_NUM 1 //the number of textures you use. #define MIPMAP AUX_RGBImageRec * img; //to save image file GLuint texObject[TEX_NUM]; //texture object
Example Program 2/4 void LoadTexture(char* filename){ img = auxDIBImageLoadA(filename); glGenTextures(TEX_NUM, texObject); glBindTexture(GL_TEXTURE_2D, texObject[0]); #ifdef MIPMAP gluBuild2DMipmaps(GL_TEXTURE_2D, 4, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, img->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); #else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img->sizeX, img->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, img->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); }
Example Program 3/4 void GL_display(){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texObject[0]); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-50.0, 0.0, 0.0); glTexCoord2f(0.0, 100.0); glVertex3f(-50.0, 0.0, 100.0); glTexCoord2f(100.0, 100.0); glVertex3f(50.0, 0.0, 100.0); glTexCoord2f(100.0, 0.0); glVertex3f(50.0, 0.0, 0.0); glEnd(); glFlush(); }
Example Program 4/4 void GL_reshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 0.5, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.5, 0.0, 50.0, 0.0, 50.0, 0.0, 1.0, 0.0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitWindowSize(400, 400); glutInitWindowPosition(0, 0); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); glutCreateWindow("Texture"); LoadTexture("check.bmp"); glutDisplayFunc(GL_display); glutReshapeFunc(GL_reshape); glutMainLoop(); }
Result Check_old.bmp Width/Height: 256/256
Load BMP file • AUX_RGBImageRec* auxDIBImageLoadA(char *); • Load a BMP file. • typedef struct _AUX_RGBImageRec { GLint sizeX, sizeY; unsigned char *data; }; • sizeX, sizeY : image width / height. • data : A pointer to the image data in memory.
Generate Texture Object • void glGenTextures( GLsizein,GLuint *textures); • To generate texture names. • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc02_3p6b.asp • n: the number of texture names to be generated. • textures: pointer to the first element of an array in which the texture are stored. • GLboolean glIsTexture( GLuinttexture); • To determine if a name corresponds to a texture. • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_7cv9.asp
Bind texture • void glBindTexture( GLenumtarget,GLuinttexture); • To bind the texture to the target. • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_3bad.asp • target: GL_TEXTURE_1D, GL_TEXTURE_2D • void glDeleteTextures( GLsizein,const GLuint *textures); • Delete named textures. • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_6vqr.asp
Send texture data: glTexImage2D1/4 • void glTexImage2D( GLenumtarget, GLintlevel, GLintinternalformat, GLsizeiwidth, GLsizeiheight, GLintborder, GLenumformat, GLenumtype, const GLvoid *pixels );
Send texture data: glTexImage2D2/4 • Specifies a 2D texture image • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_16jo.asp • target: Must be GL_TEXTURE_2D • level: level-of-detail level. It must be 0 if you don’t want to use mip-map. • internalformat: GL_RGBA and many others… • Width / height : image witdh / height
Send texture data: glTexImage2D3/4 • border: 0 or 1 • 0 : no border, image width & height must be power of 2. • 1 : use border, image width & height must be power of 2 plus 2.
Send texture data: glTexImage2D4/4 • format: format of the image data • GL_RGB, GL_RGBA, and many others… • type: data type of the image data • pixel: A pointer to the image data in memory. (Hint: the BMP file you have loaded…)
Texture Setting: glTexEnv 1/3 • void glTexEnv{fi}(GLenumtarget,GLenumpname,GLfloatparam ); • to indicate how the texels are combined with the original pixels • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_6xyu.asp • target: must be GL_TEXTURE_ENV • pname: must be GL_TEXTURE_ENV_MODE • param: 5 choices, see next page
Base Internal Format GL_REPLACE GL_MODULATE GL_ADD GL_ALPHA C = Cf, A = At C = Cf, A = AfAt C=Cf, A=AfAt GL_LUMINANCE C = Lt, A = Af C = CfLt, A = Af C=Cf+CT, A=Af GL_LUMINANCE_ALPHA C = Lt, A = At C = CfLt, A = AfAt C=Cf+Ct, A=AfAt GL_INTENSITY C = It, A = It C = CfIt, A = AfIt C=Cf+Ct, A=Af+At GL_RGB C = Ct, A = Af C = CfCt, A = Af C=Cf+Ct, A=Af GL_RGBA C = Ct, A = At C = CfCt, A = AfAt C=Cf+Ct, A=AfAt Base Internal Format GL_DECAL GL_BLEND GL_ALPHA Undefined C = Cf, A = AfAt GL_LUMINANCE Undefined C = Cf(1-Lt)+CcLt, A = Af GL_LUMINANCE_ALPHA Undefined C = Cf(1-Lt)+CcLt, A = AfAt GL_INTENSITY Undefined C = Cf(1-It)+CcIt, A = Af(1-It)+AcIt GL_RGB C = Ct, A = Af C = Cf(1-Ct)+CcCt, A = Af GL_RGBA C = Cf(1-At)+CtAt, A = At C = Cf(1-Ct)+CcCt, A = AfAt Texture Setting: glTexEnv 2/3 Ct = color of texture , At = alpha of texture Cf = color of frame buffer , Af = alpha of frame buffer
Texture Setting: glTexEnv 3/3 • glTexEnv{fi}v(GLenumtarget,GLenumpname,const GLfloat *params ) • target: must be GL_TEXTURE_ENV • pname: GL_TEXTURE_ENV_COLOR or GL_TEXTURE_ENV_MODE • params: • if pname is GL_TEXTURE_ENV_MODE : A pointer to an array of parameters.(GL_MODULATE, GL_DECAL, and GL_BLEND) • if pname is GL_TEXTURE_ENV_COLOR: a pointer to an array of R, G, B, A
Texture parameter 1/5 • glTexParameter{if}(GLenumtarget,GLenumpname,GLfloatparam ) • Set texture parameters. • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_9upe.asp • target: GL_TEXTURE_1D, GL_TEXTURE_2D • pname / param: see next page
Texture parameter 2/5 pname param GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_REPEAT, GL_CLAMP GL_TEXTURE_MAG_FILTER GL_TEXTURE_MIN_FILTER GL_NEAREST, GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST GL_TEXTURE_BORDER_COLOR color value
Texture parameter 3/5 Clamp both S, T • WRAP Repeat both S, T Repeat T but Clamp S
Texture parameter 4/5 • MAG filter • When the pixel being textured maps to an area less than or equal to one texture element • MIN filter • When the pixel being textured maps to an area greater then one texture element
Texture parameter 5/5 • GL_LINEAR • GL_NEARST pixel Get average color... texel • GL_NEAREST_MIPMAP_XXXXXX • Find the most closely match mipmap • GL_LINEAR_MIPMAP_XXXXXXX • Find the most 2 closely match mipmap and get average.
Build mip-maps 1/3 • int gluBuild2DMipmaps( GLenumtarget, GLintcomponents, GLintwidth, GLintheight, GLenumformat, GLenumtype, const void *data); • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glufnc01_406r.asp
Build mip-maps 2/3 • target : Must be GL_TEXTURE_2D. • components :The number of color components in the texture. Must be 1, 2, 3, or 4. • width, height :width / height of image. • format : GL_RGB, GL_RGBA and many others… • type :The data type for data • data :A pointer to the image data in memory.
Build mip-maps 3/3 without mip-map with mip-map
Automatic TextureCoordinate Generation • No need to use glTexCoord • Four types • Sphere • Object plane • Eye plane • Cube
Sphere environment.bmp Width/Height: 128/128
S = 1.0 x + 0.0 y + 0.0 z + 0.0 w T = 0.0 x + 1.0 y + 0.0 z + 0.0 w xyz in world space Object plane -1
S = 1.0 x + 0.0 y + 0.0 z + 0.0 w T = 0.0 x + 2.0 y + 0.0 z + 0.0 w xyz in world space Object plane -2
S = 1.0 x + 0.0 y + 0.0 z + 0.0 w T = 0.0 x + 1.0 y + 0.0 z + 0.0 w xyz in eye space Eye plane
Sphere Example 1/3 #include<gl/glaux.h> #include<gl/glut.h> AUX_RGBImageRec * img; GLuint texObject; void LoadTexture(char* filename){ img = auxDIBImageLoad(filename); glGenTextures(1, &texObject); glBindTexture(GL_TEXTURE_2D, texObject); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, img->data); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); }
Sphere Example 2/3 void GL_display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glColor3f(1.0, 1.0, 1.0); glutSolidTeapot(18); glFlush(); } void GL_reshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 0.5, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 50.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); }
Sphere Example 3/3 int main(int argc, char** argv) { glutInit(&argc, argv); glutInitWindowSize(400, 400); glutInitWindowPosition(0, 0); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); glutCreateWindow("Texture"); LoadTexture("environment.bmp"); glutDisplayFunc(GL_display); glutReshapeFunc(GL_reshape); glutMainLoop(); }
Object Plane Example void LoadTexture(char* filename) { float params1[] = {1.0 , 0.0 , 0.0 ,0.0}; float params2[] = {0.0 , 1.0 , 0.0 ,0.0}; img = auxDIBImageLoad(filename); glGenTextures(1, &texObject); glBindTexture(GL_TEXTURE_2D, texObject); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB,GL_UNSIGNED_BYTE, img->data); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGenfv(GL_S , GL_OBJECT_PLANE , params1); glTexGenfv(GL_T , GL_OBJECT_PLANE , params2); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); }
Eye Plane Example void LoadTexture(char* filename) { float params1[] = {1.0 , 0.0 , 0.0 ,0.0}; float params2[] = {0.0 , 1.0 , 0.0 ,0.0}; img = auxDIBImageLoad(filename); glGenTextures(1, &texObject); glBindTexture(GL_TEXTURE_2D, texObject); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB,GL_UNSIGNED_BYTE, img->data); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGenfv(GL_S , GL_EYE_PLANE , params1); glTexGenfv(GL_T , GL_EYE_PLANE , params2); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); }
Result Normal Reflection
Cube Example • Bind Once, send six images. glBindTexture(GL_TEXTURE_CUBE_MAP, id); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image1); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image2); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image3); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image4); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image5); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image6); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Texture Coordinate glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_R); glEnable(GL_TEXTURE_CUBE_MAP); //draw your objects
Automatic Texture-Coordinate Generation • glTexGen{dfi}(GLenumcoord,GLenumpname,GLdoubleparam); • control the generation of texture coordinates • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_73u6.asp • coord: GL_S, GL_T, GL_R, or GL_Q. • pname: must be GL_TEXTURE_GEN_MODE. • param: GL_OBJECT_LINEAR, GL_EYE_LINEAR, or GL_SPHERE_MAP
Automatic Texture-Coordinate Generation • glTexGen{dfi}v(GLenumcoord,GLenumpname, const GLdouble *params ); • coord: GL_S, GL_T, GL_R, or GL_Q. • pname: GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE, or GL_EYE_PLANE … • params: the array of texture generation parameters, if pname is GL_OBJECT_PLANE, or GL_EYE_PLANE. • *Generated plane = p1X + p2Y + p3Z + p4W
Multi-texture Pixel Color Op 0 glActiveTexture( GL_TEXTURE0 ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); Op 1 glActiveTexture( GL_TEXTURE1 ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); Op 2 glActiveTexture( GL_TEXTURE2 ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); Op n final color glActiveTexture( GL_TEXTUREn ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …);
Texture Channel • void glActiveTexture(GLenum texture) • Parameter: • GL_TEXTURE0 ~ GL_MAX_TEXTURE_UNITS – 1 • Choose channel before binding texture • Bind 0 => Disable the chosen channel