1 / 59

CH6 Texture

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.

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

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

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

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

  6. 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 (…)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  41. Cube

  42. Result Normal Reflection

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

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

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

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

  47. 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, …);

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

More Related