1 / 56

CH6 Texture

CH6 Texture. Before coding … 1/2. 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/2. Add GlAux.Lib into your project.

triage
Télécharger la présentation

CH6 Texture

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CH6 Texture

  2. Before coding…1/2 • 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 ˋ(′~‵")ˊ

  3. Before coding…2/2 • Add GlAux.Lib into your project.

  4. How to use texture? • Enable • glEnable(GL_TEXTURE_2D); • Generate Texture • glGenTextures(number of textures , texture id array) • Bind • glBindTexture(GL_TEXTURE_2D, textId); • Move date into texture • gluBuild2DMipmaps(…) • or glTexImage2D (…) • Setting the texture • glTexEnv (…) • glTexParameteri (…) • Assign texCoor before vertexCoor in display • glTexCoord2f(0.0, 0.0); • glVertex3f(-50.0, 0.0, 0.0);

  5. 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

  6. 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); }

  7. 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(); }

  8. 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(); }

  9. Result Check_old.bmp Width/Height: 256/256

  10. 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.

  11. 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

  12. 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

  13. Send texture data: glTexImage2D1/4 • void glTexImage2D( GLenumtarget, GLintlevel, GLintinternalformat, GLsizeiwidth, GLsizeiheight, GLintborder, GLenumformat, GLenumtype, const GLvoid *pixels );

  14. 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

  15. 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.

  16. 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…)

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. Texture parameter 3/5 Clamp both S, T • WRAP Repeat both S, T Repeat T but Clamp S

  23. 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

  24. 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.

  25. 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

  26. 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.

  27. Build mip-maps 3/3 without mip-map with mip-map

  28. Automatic TextureCoordinate Generation • No need to use glTexCoord • Three types • Sphere • Object plane • Eye plane • Cube

  29. Sphere environment.bmp Width/Height: 128/128

  30. 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

  31. 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

  32. 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

  33. 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); }

  34. 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); }

  35. 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(); }

  36. 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); }

  37. 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); }

  38. Cube

  39. Result Normal Reflection

  40. Cube Example • Bind Once, send six images. glEnable(GL_TEXTURE_CUBE_MAP); 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);

  41. 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); //draw your objects

  42. 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

  43. 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

  44. Multi-texture Pixel Color Op 0 glActiveTextureARB( GL_TEXTURE0_ARB ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); Op 1 glActiveTextureARB( GL_TEXTURE1_ARB ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); Op 2 glActiveTextureARB( GL_TEXTURE2_ARB ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); Op n final color glActiveTextureARB( GL_TEXTUREn_ARB ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …);

  45. 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

  46. Operation • glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, operation); • Operation • GL_MODULATE / GL_ADD or / ... / GL_SUBTRACT

  47. Multiple Texture Coordinate • glMultiTexCoord2fARB(GLenum target, GLshort s, GLshort t); • Target • GL_TEXTURE0 ~ GL_MAX_TEXTURE_UNITS – 1 • s, t • The texture coordinate of vertex • Set the texture coordinate before calling glVertex • You need the glew libraray. • The setting of glew is similar to the glaux

  48. Example #include "glew.h" #include "glaux.h" #include "glut.h“ #define TEX_NUM 2 void reshape(GLsizei w, GLsizei h); void display(); int main(int argc, char** argv){ glutInit(&argc, argv); glutInitWindowSize(400, 400); glutInitWindowPosition(0, 0); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); glutCreateWindow("Texture"); glewInit(); glGenTextures(TEX_NUM, texObject); LoadTexture(“FirstTexture.bmp", 0); LoadTexture("SecondTexture.bmp", 1); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }

More Related