Introduction to Texture Mapping CSE 470/598 Introduction to Computer Graphics Arizona State University Dianne Hansford Texture Mapping Concepts A method to create complexity in an image without the overhead of building large geometric models. Basic Idea • Application of an image onto a model • An image is mapped onto the 2D domain of a 3D model • Correspondence between domain of surface and texture gives method to apply image Texture Form • Textures are almost always rectangular m x n array of pixels called texels (texture elements) • Textures are frequently square and of sizes that are powers of two to support downsize filtering (mipmapping) • It is not necessary to always use the entire texture Texture Coordinates • A texture is usually addressed by …although it is really just values between zero and one an array of pixels • The “addresses” of points on the texture consist of two numbers (s, t) • A vertex can be associated with a point on the texture by giving it one [0, 1] of these texture coordinates glTexCoord*(s,t); glVertex*(x,y,z); t Texture coords part of state like colors and normals. [0,0] [1, 0] s [s,t]-space [u,v]-space of surface [x,y,z]-space of surface Pixels & Texture Coordinates [0, 1] s, t = .33, .33 t For example: a 32 x 32 pixel image Glubyte mychecker[32][32][3]; [0,0] [1, 0] s glEnable(GL_TEXTURE_2D); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, mychecker); Texture Coordinates to Polygons 1,0 1,1 0,0 1,0 Texture Coordinates s, t = .33, .33 Each vertex of each polygon in assigned a texture coordinate. OGL finds the appropriate texture coordinate for points “between” vertices during rasterization. – same idea as smooth shading! Example domains of the 3D model Parametric surfaces come with a 2D domain. Meshes: flatten parts to create a 2D domain Textured Modes of Operation • Decal: only the texture color determines the color we see in the frame buffer: GL_DECAL • Modulation: texture color multiplies the color computed for each face (default) • Blend: Similar to modulation but add alpha-blending glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) Programming with Texture Maps 1. Create texture and load with glTexImage() by either a. read a jpeg, bmp, …. file b. define texture within application c. copy image from color buffer 2. Define parameters as to how texture is applied glTexParameter*() Next slides describe the options here…. See Table 9.6 in OGL Red Book 3. Enable texture maps glEnable(GL_TEXTURE_2D) 4. Define texture coordinates for vertices glTexCoord*(s,t); glVertex*(x,y,z); Texture Memory • Texels go into texture memory; depends on implementation – special memory or frame buffer • Transfer of texels from application program to texture memory can be significant if texture large • Texture memory is limited resource –proxy commands to query availability • New graphics cards have MBs of texture memory • Texture objects help to optimize access to textures • In recent years, texturing has moved from software to high performance graphics hardware Texture Objects • When using more than one texture … • Stores texture data and makes it available • Fastest way to apply/bind/reuse textures • Set-up similar to display lists 1. Name the texture object 2. Bind (create) texture object to texture data/properties 3. Prioritize texture object (if maxing out texture memory) 4. Bind texture object making data currently available Texture Mapping Issues • What should happen when we zoom in close or zoom out far away? • How do we generate texture coordinates ? • What happens if we use texture coordinates less than zero or greater than one? • Are texture maps only for putting color on objects? Texture to Surface Mapping • Texture map to surface takes place during rendering Similar to smooth shading method: Triangle rasterized Each pixel mapped back to the texture Use known values at vertices to interpolation over the texture • Each pixel is associated with small region of surface and to a small area of texture. 3 possibilites for association: 1) one texel to one pixel (rare) 2) magnification Filtering 3) minification Magnification one texel to many pixels Minification many texels to one pixel Zoom In many pixels correspond to one texel “blockiness” / jaggies / aliasing solution: apply averaging (magnification filter) Zoom-In: Magnification Filter • • • • Pixel cooresponds to a small portion of one texel Results in many pixels getting same texel Without a filtering method, aliasing is common Magnification filter: smooths transition between pixels pixel Texture space Zoom-In: Magnification Filter Options for smoothing: Simplest: GL_NEAREST Just use the closest texel’s color (default – jaggies common) Also called point sampling Better: GL_LINEAR Weighted average of the four nearest texels Also called bilinear sampling (interpolation) glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); Bilinear interpolation b1 = (s – s0)/(s2 – s0) b2 = (t – t0)/(t2 – t0) c = (1-b2)*( (1-b1)*c0 + b1*c1) + b2*( (1-b1)*c2 + b1*c3) c3 c0 (s0, t0) c1 (s2, t0) Zoom Out: Minification Filter • One pixel corresponds to many texels • Common with perspective foreshortening (see example on next slide) Options: GL_NEAREST GL_LINEAR GL_*_MIPMAP_*_ where * = NEAREST OR LINEAR mipmapping glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); Mipmap Improvements Perspective foreshortening and poor texture mapping causes checkerboard to deform Mipmaps improve the mapping, returning more form to the checkerboard Images from the flipCode tutorial in the Resources Better Min Filter: Mipmaps • “mip” stands for multum in parvo, or “many things in a small place” • Basic idea: Create many textures of decreasing size and use one of these subtextures when appropriate Mipmap Representation I Create several copies Filter down in size Pre-filter textures = mipmaps Appropriate sized texture selected based on number of pixels occupied by geometry Mipmap Representation II Optimize storage (Schematic of method) Mipmap Generation Must provide all sizes of texture from input to 1x1 in powers of 2 gluBuild*DMipmaps() will help with that! Mipmap Filters • In order of increasing complexity: – – – – GL_NEAREST_MIPMAP_NEAREST GL_LINEAR_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_LINEAR Intramipmap Intermipmap Remember: more complexity = slower rendering Filtering in Summary • Zoom-in calls for mag filter • Zoom-out calls for min filter • More advanced filters require more time/computation but produce better results • Mipmapping is an advanced min filter • Caution: requesting mipmapping without pre-defining mipmaps will turn off texturing; (see Filtering in OGL) Wrapping Modes: Repeat or Clamp • Can assign texture coords outside of [0,1] and have them either clamp or repeat the texture map • Repeat Issue: Making the texture borders match-up 0 1 clamped 2 0 1 repeat 2 Borders and Sizing • Linear filtering needs an extra row/column of texels at the border • Solution: Add a border to your texture glTexParamter3fv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color) • Some help copying texel values from original texture: glTexSubImage2D() • Size of texture: must be 2^n in width and height gluScaleImage() can be used to convert image to acceptable dimension Assigning Texture Coordinates • Parametric surfaces make assignment easy • However, distortion of texture will occur • Can minimize distortions by preserving aspect ratio of texture and geometry Two solutions: 1) repeat texture 2) use just a portion of the texture (to match the aspect ratio) texture geometry Auto Texture Coordinate Generation • GLU Quadrics: use gluQuadricTexture() to enable auto generation of textures • OGL determines texture coordinates based on the distance of a vertex from a plane Plane can be defined in object or eye coordinates object: texture remains fixed wrt object eye: texture is dynamic, for example contour lines • OGL determines texture coordinates based on surface normal direction – environment mapping (see “More Texture Mapping” slides) glEnable(GL_TEXTURE_GEN_S) glTexGen*(…) Problem with Perspective • Shape distortions caused by perspective maps not handled by simple interpolation of textures • More advanced method glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) • Also: GL_FASTEST • (Other Hints for antialiasing of lines and polygons.) • More advanced method - slower 1D Textures • Similar to 2D texture but height = 1 • Can create pattern of colors for line segments or curves • Contouring • Can use for Cel shading from intel 3D Textures • 3D texture elements are called voxels (volume elements) • Embed an object in the voxels to determine color at vertices • Commonly used in medical or geoscience applications Medical: CT or MRI layered 3D data Geoscience: rock strata or gas measurements • Caution: Texture memory can run out fast! • Example: Uni Hamburg’s Virtual Mummy http://www.uke.uni-hamburg.de/zentren/experimentelle_medizin/informatik/forschung/mumie/index.en.html More Mapping Methods • Height maps • Normal maps / Bump maps • Shadow maps • Environment maps • …. We’ll discuss these another day! Resources I • Chapter 9 of the text – Overview, pp 360-369 – Assigning Texture Coords, pp 414-417 – As much of the rest of the chapter as you can handle Resources II • Fun Reading – From the SIGGRAPH tutorial pages: http://www.siggraph.org/education/materials/HyperGraph/mapping/r_wolfe/r_wolf e_mapping_1.htm • Texture Mapping - http://www.geocities.com/SiliconValley/2151/tmap.html • Advanced OpenGL Texture Mapping http://www.flipcode.com/tutorials/tut_atmap.shtml • Texture Mapping as a Fundamental Drawing Primative http://www.sgi.com/misc/grafica/texmap/