41
CS 445 / 645 Introduction to Computer Graphics Lecture 19 Lecture 19 Texture Maps Texture Maps

CS 445 / 645 Introduction to Computer Graphics Lecture 19 Texture Maps Lecture 19 Texture Maps

Embed Size (px)

Citation preview

CS 445 / 645Introduction to Computer Graphics

Lecture 19Lecture 19

Texture MapsTexture Maps

Lecture 19Lecture 19

Texture MapsTexture Maps

Texture Mapping

Limited ability to generate complex surfaces with Limited ability to generate complex surfaces with geometrygeometry

Images can convey the illusion of geometryImages can convey the illusion of geometry

Images painted onto Images painted onto polygons is called texture polygons is called texture mappingmapping

Limited ability to generate complex surfaces with Limited ability to generate complex surfaces with geometrygeometry

Images can convey the illusion of geometryImages can convey the illusion of geometry

Images painted onto Images painted onto polygons is called texture polygons is called texture mappingmapping

Texture Maps

Chapter 9 of Open GL Programming Guide (Red Chapter 9 of Open GL Programming Guide (Red Book)Book)

Images applied to polygons to enhance the visual Images applied to polygons to enhance the visual effect of a sceneeffect of a scene• Rectangular arrays of dataRectangular arrays of data

– Color, luminance, Color, luminance, alphaalpha

– Components of array called Components of array called texelstexels

Or in 3D, volumetricOr in 3D, volumetric voxels voxels

Chapter 9 of Open GL Programming Guide (Red Chapter 9 of Open GL Programming Guide (Red Book)Book)

Images applied to polygons to enhance the visual Images applied to polygons to enhance the visual effect of a sceneeffect of a scene• Rectangular arrays of dataRectangular arrays of data

– Color, luminance, Color, luminance, alphaalpha

– Components of array called Components of array called texelstexels

Or in 3D, volumetricOr in 3D, volumetric voxels voxels

Texture Mapping

Texture map is an image, two-dimensional array of color Texture map is an image, two-dimensional array of color values (values (texelstexels))

Texels are specified by texture’s (u,v) spaceTexels are specified by texture’s (u,v) space

At each screen pixel, texel can be used to substitute a At each screen pixel, texel can be used to substitute a polygon’s surface property (color)polygon’s surface property (color)

We must map (u,v) space to polygon’s (s, t) spaceWe must map (u,v) space to polygon’s (s, t) space

Texture map is an image, two-dimensional array of color Texture map is an image, two-dimensional array of color values (values (texelstexels))

Texels are specified by texture’s (u,v) spaceTexels are specified by texture’s (u,v) space

At each screen pixel, texel can be used to substitute a At each screen pixel, texel can be used to substitute a polygon’s surface property (color)polygon’s surface property (color)

We must map (u,v) space to polygon’s (s, t) spaceWe must map (u,v) space to polygon’s (s, t) space

U

V

S

T

Texture Mapping

(u,v) to (s,t) mapping can be explicitly set at vertices (u,v) to (s,t) mapping can be explicitly set at vertices by storing by storing texture coordinatestexture coordinates with each vertex with each vertex

How do we compute (u,v) to (s,t) mapping for points How do we compute (u,v) to (s,t) mapping for points in betweenin between

• Watch for aliasingWatch for aliasing

• Watch for many to one mappingsWatch for many to one mappings

• Watch for perspective foreshortening effects and linear Watch for perspective foreshortening effects and linear interpolationinterpolation

(u,v) to (s,t) mapping can be explicitly set at vertices (u,v) to (s,t) mapping can be explicitly set at vertices by storing by storing texture coordinatestexture coordinates with each vertex with each vertex

How do we compute (u,v) to (s,t) mapping for points How do we compute (u,v) to (s,t) mapping for points in betweenin between

• Watch for aliasingWatch for aliasing

• Watch for many to one mappingsWatch for many to one mappings

• Watch for perspective foreshortening effects and linear Watch for perspective foreshortening effects and linear interpolationinterpolation

Example Texture Map

Applied to tilted polygon

Example Texture Map

glVertex3d (s, s, s)glTexCoord2d(1,1);

glVertex3d (-s, -s, -s)glTexCoord2d(0, 0);

Example Texture Map

glVertex3d (s, s, s)glTexCoord2d(5, 5);

glVertex3d (s, s, s)glTexCoord2d(1, 1);

Repeating textures vs.Clamped textures

The Art of 3D Computer Animation and Effects

Isaac Kerlow

Texture Coordinates

Every polygon can have object coordinates and Every polygon can have object coordinates and texture coordinatestexture coordinates• Object coordinates describe where polygon vertices are on Object coordinates describe where polygon vertices are on

the screenthe screen

• Texture coordinates describe texel coordinates of each Texture coordinates describe texel coordinates of each vertex (usually 0 -> 1)vertex (usually 0 -> 1)

• Texture coordinates are interpolated along vertex-vertex Texture coordinates are interpolated along vertex-vertex edgesedges

glTexCoord{1234}{sifd}(TYPE coords)glTexCoord{1234}{sifd}(TYPE coords)

Every polygon can have object coordinates and Every polygon can have object coordinates and texture coordinatestexture coordinates• Object coordinates describe where polygon vertices are on Object coordinates describe where polygon vertices are on

the screenthe screen

• Texture coordinates describe texel coordinates of each Texture coordinates describe texel coordinates of each vertex (usually 0 -> 1)vertex (usually 0 -> 1)

• Texture coordinates are interpolated along vertex-vertex Texture coordinates are interpolated along vertex-vertex edgesedges

glTexCoord{1234}{sifd}(TYPE coords)glTexCoord{1234}{sifd}(TYPE coords)

Why 14 coords? s, t, r, and q (for homogeneous coordinates, an advanced topic)

Textures

Texture ObjectTexture Object

• An OpenGL data type that keeps textures resident in memory and An OpenGL data type that keeps textures resident in memory and provides identifiers to easily access themprovides identifiers to easily access them

• Provides efficiency gains over having to repeatedly load and reload a Provides efficiency gains over having to repeatedly load and reload a texturetexture

• You can prioritize textures to keep in memoryYou can prioritize textures to keep in memory

• OpenGL uses least recently used (LRU) if no priority is assignedOpenGL uses least recently used (LRU) if no priority is assigned

Texture ObjectTexture Object

• An OpenGL data type that keeps textures resident in memory and An OpenGL data type that keeps textures resident in memory and provides identifiers to easily access themprovides identifiers to easily access them

• Provides efficiency gains over having to repeatedly load and reload a Provides efficiency gains over having to repeatedly load and reload a texturetexture

• You can prioritize textures to keep in memoryYou can prioritize textures to keep in memory

• OpenGL uses least recently used (LRU) if no priority is assignedOpenGL uses least recently used (LRU) if no priority is assigned

Example use of Texture

Read .bmp from fileRead .bmp from file• Use Image data typeUse Image data type

– getc()getc() and and fseek()fseek() to read image x & y size to read image x & y size

– fread()fread() fills the Image fills the Imagedata memory with actual data memory with actual red/green/blue values from .bmpred/green/blue values from .bmp

• NoteNote

– malloc()malloc() Image->data to appropriate size Image->data to appropriate size

– .bmp stores color in bgr order and we convert to rgb order.bmp stores color in bgr order and we convert to rgb order

Read .bmp from fileRead .bmp from file• Use Image data typeUse Image data type

– getc()getc() and and fseek()fseek() to read image x & y size to read image x & y size

– fread()fread() fills the Image fills the Imagedata memory with actual data memory with actual red/green/blue values from .bmpred/green/blue values from .bmp

• NoteNote

– malloc()malloc() Image->data to appropriate size Image->data to appropriate size

– .bmp stores color in bgr order and we convert to rgb order.bmp stores color in bgr order and we convert to rgb order

Step 2 – create Texture Objects

glGenTextures(1, &texture[texture_num]);glGenTextures(1, &texture[texture_num]);

• First argument tells GL how many Texture Objects to First argument tells GL how many Texture Objects to createcreate

• Second argument is a pointer to the place where Second argument is a pointer to the place where OpenGL will store the names (unsigned integers) of the OpenGL will store the names (unsigned integers) of the Texture Objects it createsTexture Objects it creates

– texture[ ] is of type GLuinttexture[ ] is of type GLuint

glGenTextures(1, &texture[texture_num]);glGenTextures(1, &texture[texture_num]);

• First argument tells GL how many Texture Objects to First argument tells GL how many Texture Objects to createcreate

• Second argument is a pointer to the place where Second argument is a pointer to the place where OpenGL will store the names (unsigned integers) of the OpenGL will store the names (unsigned integers) of the Texture Objects it createsTexture Objects it creates

– texture[ ] is of type GLuinttexture[ ] is of type GLuint

Step 3 – Specify which texture object is about to be defined

Tell OpenGL that you are going to define the Tell OpenGL that you are going to define the specifics of the Texture Object it createdspecifics of the Texture Object it created• glBindTexture(GL_TEXTURE_2D, texture[texture_num]);glBindTexture(GL_TEXTURE_2D, texture[texture_num]);

– Textures can be 1D and 3D as wellTextures can be 1D and 3D as well

Tell OpenGL that you are going to define the Tell OpenGL that you are going to define the specifics of the Texture Object it createdspecifics of the Texture Object it created• glBindTexture(GL_TEXTURE_2D, texture[texture_num]);glBindTexture(GL_TEXTURE_2D, texture[texture_num]);

– Textures can be 1D and 3D as wellTextures can be 1D and 3D as well

Step 4 – Begin defining texture

glTexParameter()glTexParameter()

• Sets various parameters that control how a texture is treated as it’s Sets various parameters that control how a texture is treated as it’s applied to a fragment or stored in a texture objectapplied to a fragment or stored in a texture object

• // scale linearly when image bigger than texture // scale linearly when image bigger than texture glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTERglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);,GL_LINEAR);

• // scale linearly when image smaller than texture // scale linearly when image smaller than texture glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTERglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); ,GL_LINEAR);

glTexParameter()glTexParameter()

• Sets various parameters that control how a texture is treated as it’s Sets various parameters that control how a texture is treated as it’s applied to a fragment or stored in a texture objectapplied to a fragment or stored in a texture object

• // scale linearly when image bigger than texture // scale linearly when image bigger than texture glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTERglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);,GL_LINEAR);

• // scale linearly when image smaller than texture // scale linearly when image smaller than texture glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTERglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); ,GL_LINEAR);

Step 5 – Assign image data

• glTexImage2D();glTexImage2D();• glTexImage2D();glTexImage2D();

GL_TEXTURE_2DGL_TEXTURE_2D (2D Texture)(2D Texture)

00 (level of detail 0)(level of detail 0)

33 (3 components, RGB)(3 components, RGB)

image1->sizeXimage1->sizeX (size)(size)

image1->sizeYimage1->sizeY (size)(size)

00 (no border pixel)(no border pixel)

GL_RGBGL_RGB (RGB color order)(RGB color order)

GL_UNSIGNED_BYTEGL_UNSIGNED_BYTE (unsigned byte data)(unsigned byte data)

image1->dataimage1->data (pointer to the data))(pointer to the data))

glTexImage2D – Arg 1

GLenum targetGLenum target• GL_TEXTURE_{1|2|3}DGL_TEXTURE_{1|2|3}D

• GL_PROXY_TEXTURE_2DGL_PROXY_TEXTURE_2D

– Provides queries for texture resourcesProvides queries for texture resources

– Proceed with hypothetical texture use (GL won’t apply Proceed with hypothetical texture use (GL won’t apply the texture)the texture)

– After query, call GLGetTexLevelParamter to verify After query, call GLGetTexLevelParamter to verify presence of required system componentspresence of required system components

– Doesn’t check possibility of multiple texture interferenceDoesn’t check possibility of multiple texture interference

GLenum targetGLenum target• GL_TEXTURE_{1|2|3}DGL_TEXTURE_{1|2|3}D

• GL_PROXY_TEXTURE_2DGL_PROXY_TEXTURE_2D

– Provides queries for texture resourcesProvides queries for texture resources

– Proceed with hypothetical texture use (GL won’t apply Proceed with hypothetical texture use (GL won’t apply the texture)the texture)

– After query, call GLGetTexLevelParamter to verify After query, call GLGetTexLevelParamter to verify presence of required system componentspresence of required system components

– Doesn’t check possibility of multiple texture interferenceDoesn’t check possibility of multiple texture interference

glTexImage2D – Arg 2

GLint levelGLint level• Used for Level of Detail (LOD)Used for Level of Detail (LOD)

• LOD stores multiple versions of texture that can be used at LOD stores multiple versions of texture that can be used at runtime (set of sizes)runtime (set of sizes)

• Runtime algorithms select appropriate version of textureRuntime algorithms select appropriate version of texture

– Pixel size of polygon used to select best texturePixel size of polygon used to select best texture

– Eliminates need for error-prone filtering algorithmsEliminates need for error-prone filtering algorithms

GLint levelGLint level• Used for Level of Detail (LOD)Used for Level of Detail (LOD)

• LOD stores multiple versions of texture that can be used at LOD stores multiple versions of texture that can be used at runtime (set of sizes)runtime (set of sizes)

• Runtime algorithms select appropriate version of textureRuntime algorithms select appropriate version of texture

– Pixel size of polygon used to select best texturePixel size of polygon used to select best texture

– Eliminates need for error-prone filtering algorithmsEliminates need for error-prone filtering algorithms

glTexImage2D – Arg 3

GLint internalFormatGLint internalFormat• GL defines 38 symbolic constants that describe which of R, GL defines 38 symbolic constants that describe which of R,

G, B, and A are used in internal representation of texelsG, B, and A are used in internal representation of texels

• Provides control over things texture can doProvides control over things texture can do

– High bit depth alpha blendingHigh bit depth alpha blending

– High bit depth intensity mappingHigh bit depth intensity mapping

– General purpose RGBGeneral purpose RGB

• GL doesn’t guarantee all options are available on given GL doesn’t guarantee all options are available on given hardwarehardware

GLint internalFormatGLint internalFormat• GL defines 38 symbolic constants that describe which of R, GL defines 38 symbolic constants that describe which of R,

G, B, and A are used in internal representation of texelsG, B, and A are used in internal representation of texels

• Provides control over things texture can doProvides control over things texture can do

– High bit depth alpha blendingHigh bit depth alpha blending

– High bit depth intensity mappingHigh bit depth intensity mapping

– General purpose RGBGeneral purpose RGB

• GL doesn’t guarantee all options are available on given GL doesn’t guarantee all options are available on given hardwarehardware

glTexImage2D – Args 4-6

GLsizei widthGLsizei width

GLsizei heightGLsizei height• Dimensions of texture imageDimensions of texture image

– Must be 2Must be 2mm + 2b (b=0 or 1 depending on border) + 2b (b=0 or 1 depending on border)

– min, 64 x 64min, 64 x 64

GLint borderGLint border• Width of border (1 or 0)Width of border (1 or 0)

– Border allows linear blending between overlapping texturesBorder allows linear blending between overlapping textures

– Useful when manually tiling texturesUseful when manually tiling textures

GLsizei widthGLsizei width

GLsizei heightGLsizei height• Dimensions of texture imageDimensions of texture image

– Must be 2Must be 2mm + 2b (b=0 or 1 depending on border) + 2b (b=0 or 1 depending on border)

– min, 64 x 64min, 64 x 64

GLint borderGLint border• Width of border (1 or 0)Width of border (1 or 0)

– Border allows linear blending between overlapping texturesBorder allows linear blending between overlapping textures

– Useful when manually tiling texturesUseful when manually tiling textures

glTexImage2D – Args 7 & 8

GLenum formatGLenum format

• Describe how texture data is stored in input arrayDescribe how texture data is stored in input array

– GL_RGB, GL_RGBA, GL_BLUE…GL_RGB, GL_RGBA, GL_BLUE…

GLenum type GLenum type

• Data size of array componentsData size of array components

– GL_SHORT, GL_BYTE, GL_INT…GL_SHORT, GL_BYTE, GL_INT…

GLenum formatGLenum format

• Describe how texture data is stored in input arrayDescribe how texture data is stored in input array

– GL_RGB, GL_RGBA, GL_BLUE…GL_RGB, GL_RGBA, GL_BLUE…

GLenum type GLenum type

• Data size of array componentsData size of array components

– GL_SHORT, GL_BYTE, GL_INT…GL_SHORT, GL_BYTE, GL_INT…

glTexImage2D – Arg 9

Const GLvoid *texelsConst GLvoid *texels

• Pointer to data describing texture mapPointer to data describing texture map

Const GLvoid *texelsConst GLvoid *texels

• Pointer to data describing texture mapPointer to data describing texture map

Step 6 – Apply texture

Before defining geometryBefore defining geometry

• glEnable(GL_TEXTURE_2D);glEnable(GL_TEXTURE_2D);

• glBindTexture(GL_TEXTURE_2D, texture[0]);glBindTexture(GL_TEXTURE_2D, texture[0]);

• glTexEnvf(GL_TEXTURE_ENV, glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);GL_TEXTURE_ENV_MODE, GL_REPLACE);

Before defining geometryBefore defining geometry

• glEnable(GL_TEXTURE_2D);glEnable(GL_TEXTURE_2D);

• glBindTexture(GL_TEXTURE_2D, texture[0]);glBindTexture(GL_TEXTURE_2D, texture[0]);

• glTexEnvf(GL_TEXTURE_ENV, glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);GL_TEXTURE_ENV_MODE, GL_REPLACE);

glTexEnv()

GL_TEXTURE_ENV_MODEGL_TEXTURE_ENV_MODE GL_DECAL GL_DECAL (alpha blends texture with (alpha blends texture with poly color)poly color)

GL_REPLACE GL_REPLACE (straight up (straight up replacement)replacement)

GL_MODULATE GL_MODULATE (texture application is (texture application is a function of poly lighting)a function of poly lighting)

GL_BLEND GL_BLEND (texture controls blending (texture controls blending with another color)with another color)

If GL_BLEND selected, second call to If GL_BLEND selected, second call to glTexEnv() must specify glTexEnv() must specify GL_TEXTURE_ENV_COLORGL_TEXTURE_ENV_COLOR

4-float array for R,G,B,A blend4-float array for R,G,B,A blend

First argument to function is always GL_TEXTURE_ENV

gluScaleImage()

Alters the size of an image to meet the 2Alters the size of an image to meet the 2mm size size requirement of OpenGLrequirement of OpenGL

• Scaling performed by linear and box filteringScaling performed by linear and box filtering

Alters the size of an image to meet the 2Alters the size of an image to meet the 2mm size size requirement of OpenGLrequirement of OpenGL

• Scaling performed by linear and box filteringScaling performed by linear and box filtering

glCopyTexImage2D()

Use current frame buffer contents as textureUse current frame buffer contents as texture

Copy frame buffer to named texture locationCopy frame buffer to named texture location

Use current frame buffer contents as textureUse current frame buffer contents as texture

Copy frame buffer to named texture locationCopy frame buffer to named texture location

glTexSubImage2D()

Replace a region of current working texture with a Replace a region of current working texture with a smaller texturesmaller texture

SubImage need not adhere to 2SubImage need not adhere to 2mm size limitation size limitation

This is how you add data from your system’s This is how you add data from your system’s camera to GL environmentcamera to GL environment

glCopyTexSubImage2DglCopyTexSubImage2D• Frame buffer cut and paste possible tooFrame buffer cut and paste possible too

Replace a region of current working texture with a Replace a region of current working texture with a smaller texturesmaller texture

SubImage need not adhere to 2SubImage need not adhere to 2mm size limitation size limitation

This is how you add data from your system’s This is how you add data from your system’s camera to GL environmentcamera to GL environment

glCopyTexSubImage2DglCopyTexSubImage2D• Frame buffer cut and paste possible tooFrame buffer cut and paste possible too

Bump Mapping

Use textures to modify surface geometryUse textures to modify surface geometry

Use texel values to modify surface normals of Use texel values to modify surface normals of polygonpolygon

Texel values correspond to Texel values correspond to height fieldheight field

• Height field models a rough surfaceHeight field models a rough surface

Partial derivative of bump map specifies change Partial derivative of bump map specifies change to surface normalto surface normal

Use textures to modify surface geometryUse textures to modify surface geometry

Use texel values to modify surface normals of Use texel values to modify surface normals of polygonpolygon

Texel values correspond to Texel values correspond to height fieldheight field

• Height field models a rough surfaceHeight field models a rough surface

Partial derivative of bump map specifies change Partial derivative of bump map specifies change to surface normalto surface normal

Bump Mapping

Displacement Mapping

Bump mapped normals are inconsistent with actual Bump mapped normals are inconsistent with actual geometry. Problems arise (shadows).geometry. Problems arise (shadows).

Displacement mapping actually affects the surface Displacement mapping actually affects the surface geometrygeometry

Bump mapped normals are inconsistent with actual Bump mapped normals are inconsistent with actual geometry. Problems arise (shadows).geometry. Problems arise (shadows).

Displacement mapping actually affects the surface Displacement mapping actually affects the surface geometrygeometry

Mipmaps

multum in parvomultum in parvo -- many things in a small place -- many things in a small place

A texture LOD techniqueA texture LOD technique

Prespecify a series of prefiltered texture maps of Prespecify a series of prefiltered texture maps of decreasing resolutionsdecreasing resolutions

Requires more texture storageRequires more texture storage

Eliminates shimmering and flashing as objects Eliminates shimmering and flashing as objects move move (why?)(why?)

multum in parvomultum in parvo -- many things in a small place -- many things in a small place

A texture LOD techniqueA texture LOD technique

Prespecify a series of prefiltered texture maps of Prespecify a series of prefiltered texture maps of decreasing resolutionsdecreasing resolutions

Requires more texture storageRequires more texture storage

Eliminates shimmering and flashing as objects Eliminates shimmering and flashing as objects move move (why?)(why?)

Shimmering in mipmaps

How do I reduce the size of this image by half?How do I reduce the size of this image by half?How do I reduce the size of this image by half?How do I reduce the size of this image by half?

near

far

MIPMAPS

With versus without MIPMAPWith versus without MIPMAPWith versus without MIPMAPWith versus without MIPMAP

MIPMAPS

Arrange different versions into one block of Arrange different versions into one block of memorymemory

Arrange different versions into one block of Arrange different versions into one block of memorymemory

gluBuild2DMipmaps

Automatically constructs a family of textures from Automatically constructs a family of textures from original texture size down to 1x1original texture size down to 1x1

Automatically constructs a family of textures from Automatically constructs a family of textures from original texture size down to 1x1original texture size down to 1x1

Advanced Mipmaps

You can specify additional mipmap levels on You can specify additional mipmap levels on the flythe fly

• MIN_LOD may reduce poppingMIN_LOD may reduce popping

• MAX_LOD may reduce over compressionMAX_LOD may reduce over compression

You can specify min mipmap levelYou can specify min mipmap level

• Useful for mosaicing (Alphabet on a texture)Useful for mosaicing (Alphabet on a texture)

You can specify additional mipmap levels on You can specify additional mipmap levels on the flythe fly

• MIN_LOD may reduce poppingMIN_LOD may reduce popping

• MAX_LOD may reduce over compressionMAX_LOD may reduce over compression

You can specify min mipmap levelYou can specify min mipmap level

• Useful for mosaicing (Alphabet on a texture)Useful for mosaicing (Alphabet on a texture)

FilteringOpenGL tries to pick best mipmap levelOpenGL tries to pick best mipmap level

Question: Question: Which texel corresponds to a particular pixel?Which texel corresponds to a particular pixel?

GL_NEAREST (Point Sampling)GL_NEAREST (Point Sampling)• Pick the texel with center nearest pixelPick the texel with center nearest pixel

GL_LINEAR (Bilinear Sampling)GL_LINEAR (Bilinear Sampling)• Weighted average of 2x2 closest texelsWeighted average of 2x2 closest texels

GL_NEAREST_MIPMAP_LINEARGL_NEAREST_MIPMAP_LINEAR• Average nearest texels from two mipmap levelsAverage nearest texels from two mipmap levels

GL_LINEAR_MIPMAP_LINEAR (Trilinear)GL_LINEAR_MIPMAP_LINEAR (Trilinear)• Average two averaged texels from two mipmapsAverage two averaged texels from two mipmaps

OpenGL tries to pick best mipmap levelOpenGL tries to pick best mipmap level

Question: Question: Which texel corresponds to a particular pixel?Which texel corresponds to a particular pixel?

GL_NEAREST (Point Sampling)GL_NEAREST (Point Sampling)• Pick the texel with center nearest pixelPick the texel with center nearest pixel

GL_LINEAR (Bilinear Sampling)GL_LINEAR (Bilinear Sampling)• Weighted average of 2x2 closest texelsWeighted average of 2x2 closest texels

GL_NEAREST_MIPMAP_LINEARGL_NEAREST_MIPMAP_LINEAR• Average nearest texels from two mipmap levelsAverage nearest texels from two mipmap levels

GL_LINEAR_MIPMAP_LINEAR (Trilinear)GL_LINEAR_MIPMAP_LINEAR (Trilinear)• Average two averaged texels from two mipmapsAverage two averaged texels from two mipmaps