84
1 Texture Maps Jeff Parker Oct 2011

1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

  • View
    222

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

1

Texture Maps

Jeff Parker

Oct 2011

Page 2: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

2

Objectives

Introduce Mapping Methods

Texture Mapping

Environment Mapping

Bump Mapping

Billboards

Consider basic strategies

Forward vs backward mapping

Point sampling vs area averaging

Page 3: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

3

Limits of Geometric Modeling

We can create well lit spheres and cones, but geometry lacks visual interest

Needed to spice things up

Page 4: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Bricks

4

Page 5: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

5

Basic Stragegy

Three steps to applying a texture

Specify the texture

read or generate image

assign to texture

enable texturing

Assign texture coordinates to vertices

Proper mapping function is left to application

Specify texture parameters

wrapping, filtering

Page 6: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

6

Texture Mapping and the OpenGL Pipeline

geometry pipelinevertices

pixel pipelineimage

rasterizer

Images and geometry flow through separate pipelines

Join at the rasterizer

“complex” textures do not affect geometric complexity

Page 7: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

7

Define a texture image from an array of texels (texture elements) in CPU memory

Glubyte my_texels[512][512][3];

Define as any other pixel map

Scanned image

Generate by application code

Enable texture mapping

glEnable(GL_TEXTURE_2D)

OpenGL supports 1-4 dimensional texture maps

Specifying a Texture Image

Page 8: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

8

Define Image as a Texture

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, TextureSize, TextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image );

glTexImage2D( target, level, components, w, h, border, format, type, texels );target: type of texture, e.g. GL_TEXTURE_2Dlevel: used for mipmapping (discussed later)components: elements per texelw, h: width and height of texels in pixelsborder: used for smoothing (discussed later)format, type: describe texelstexels: pointer to texel array

Page 9: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

9

Converting A Texture Image

OpenGL requires texture dimensions to be powers of 2

If dimensions of image are not powers of 2

gluScaleImage( format, w_in, h_in, type_in, *data_in, w_out, h_out, type_out, *data_out );

data_in is source image

data_out is for destination image

Image interpolated and filtered during scaling

See test.c – my system says…

GL_ARB_texture_non_power_of_two

Page 10: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

10

Based on parametric texture coordinates

glTexCoord*() specified at each vertex

s

t1, 1

0, 1

0, 0 1, 0

(s, t) = (0.2, 0.8)

(0.4, 0.2)

(0.8, 0.4)

A

B C

a

bc

Texture Space Object Space

Mapping a Texture

Page 11: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

11

Applying Textures II

1. specify textures in texture objects2. set texture filter (minification/magnification)3. set texture function 4. set texture wrap mode5. set optional perspective correction hint6. bind texture object 7. enable texturing8. supply texture coordinates for vertex

coordinates can also be generated

Page 12: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

12

In practice

Let's walk through a simple example

We create two textures

As we image the object (a cube) we tie a texture coordinate to each vertex

We enable texture mapping

Page 13: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

In practice

Page 14: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

14

Texture Objects// Initialize texture objects

glGenTextures( 2, textures );

glBindTexture( GL_TEXTURE_2D, textures[0] );

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, TextureSize, TextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );

Page 15: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Configure Second Texture

glBindTexture( GL_TEXTURE_2D, textures[1] );

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, TextureSize, TextureSize, 0,

GL_RGB, GL_UNSIGNED_BYTE, image2 );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );

glActiveTexture( GL_TEXTURE0 );

glBindTexture( GL_TEXTURE_2D, textures[0] );

Page 16: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

In practice

// Create a vertex array object

GLuint vao;

glGenVertexArraysAPPLE( 1, &vao );

glBindVertexArrayAPPLE( vao );

// Create and initialize a buffer object

GLuint buffer;

glGenBuffers( 1, &buffer );

glBindBuffer( GL_ARRAY_BUFFER, buffer );

glBufferData( GL_ARRAY_BUFFER, sizeof(points) + sizeof(quad_colors) + sizeof(tex_coords), NULL, GL_STATIC_DRAW );

Page 17: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

In practice// Specify an offset to keep track of where we're placing data in

our vertex array buffer. We'll use the same technique when we associate the offsets with vertex attribute pointers.

GLintptr offset = 0;

glBufferSubData( GL_ARRAY_BUFFER, offset, sizeof(points), points );

offset += sizeof(points);

glBufferSubData( GL_ARRAY_BUFFER, offset,

sizeof(quad_colors), quad_colors );

offset += sizeof(quad_colors);

glBufferSubData( GL_ARRAY_BUFFER, offset, sizeof(tex_coords), tex_coords );

Page 18: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

In practice// Load shaders and use resulting shader program

GLuint program = InitShader( "vshader71.glsl", "fshader71.glsl" );

glUseProgram( program );

// set up vertex arrays

offset = 0;

GLuint vPosition = glGetAttribLocation( program, "vPosition" );

glEnableVertexAttribArray( vPosition );

glVertexAttribPointer( vPosition, 4, GL_FLOAT, GL_FALSE, 0,

BUFFER_OFFSET(offset) );

offset += sizeof(points);

Page 19: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

In practiceGLuint vColor = glGetAttribLocation( program,

"vColor" );

glEnableVertexAttribArray( vColor );

glVertexAttribPointer( vColor, 4, GL_FLOAT, GL_FALSE, 0,

BUFFER_OFFSET(offset) );

offset += sizeof(quad_colors);

GLuint vTexCoord = glGetAttribLocation( program, "vTexCoord" );

glEnableVertexAttribArray( vTexCoord );

glVertexAttribPointer( vTexCoord, 2, GL_FLOAT, GL_FALSE, 0,

BUFFER_OFFSET(offset) );

Page 20: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

In practice

// Set the value of the fragment shader texture sampler variable ("texture") to the the appropriate texture unit. In this case, zero, for GL_TEXTURE0 which was previously set by calling glActiveTexture().

glUniform1i( glGetUniformLocation(program, "texture"), 0 );

theta = glGetUniformLocation( program, "theta");

glEnable( GL_DEPTH_TEST );

glClearColor( 1.0, 1.0, 1.0, 1.0 );

}

Page 21: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Mapping Texture

void quad( int a, int b, int c, int d )

{

point4 vertices[8] = {

point4( -0.5, -0.5, 0.5, 1.0 ),

point4( -0.5, 0.5, 0.5, 1.0 ),

point4( 0.5, 0.5, 0.5, 1.0 ),

point4( 0.5, -0.5, 0.5, 1.0 ),

point4( -0.5, -0.5, -0.5, 1.0 ),

point4( -0.5, 0.5, -0.5, 1.0 ),

point4( 0.5, 0.5, -0.5, 1.0 ),

point4( 0.5, -0.5, -0.5, 1.0 )

};

Page 22: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Mapping Texture

void quad( int a, int b, int c, int d )

{...

color4 colors[8] = {

color4( 0.0, 0.0, 0.0, 1.0 ), // black

color4( 1.0, 0.0, 0.0, 1.0 ), // red

color4( 1.0, 1.0, 0.0, 1.0 ), // yellow

color4( 0.0, 1.0, 0.0, 1.0 ), // green

color4( 0.0, 0.0, 1.0, 1.0 ), // blue

color4( 1.0, 0.0, 1.0, 1.0 ), // magenta

color4( 0.0, 1.0, 1.0, 1.0 ), // white

color4( 1.0, 1.0, 1.0, 1.0 ) // cyan

};

Page 23: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Mapping Texturequad_colors[Index] = colors[a];

points[Index] = vertices[a];

tex_coords[Index] = vec2( 0.0, 0.0 );

Index++;

quad_colors[Index] = colors[a];

points[Index] = vertices[b];

tex_coords[Index] = vec2( 0.0, 1.0 );

Index++;

quad_colors[Index] = colors[a];

points[Index] = vertices[c];

tex_coords[Index] = vec2( 1.0, 1.0 );

Index++; ...

Page 24: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Keyboard()void keyboard( unsigned char key, int mousex, int mousey )

{ switch( key ) {

case 033: // Escape Key

case 'q': case 'Q':

exit( EXIT_SUCCESS );

break;

case '1':

glBindTexture( GL_TEXTURE_2D, textures[0] );

break;

case '2':

glBindTexture( GL_TEXTURE_2D, textures[1] );

break;

}

glutPostRedisplay();

}

Page 25: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Parameters: Wrapping ModeClamping: if s, t > 1 use 1, if s, t < 0 use 0Wrapping: use s,t modulo 1glTexParameteri( target, type, mode ) glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP )

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT )

texture

s

t

GL_CLAMPwrapping

GL_REPEATwrapping

Page 26: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Reading in a Texture

// I've added a version of this to Example1.cpp

int main(int argc, char **argv)

{

GLubyte image[MAX][MAX][3];

if ((argc > 1) && (argv[1][0] != '-'))

readPPMFile(image, argv[1]);

else

buildTexture(image);

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

26

Page 27: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

PPM FilesPortable Pixel Map (PPM) files are a simple, uncompressed format

Can be read by xv and gimp (GNU Image Manipulation Program).

I use GraphicConverter from Lemksoft

Header holds

Version String

# One or more comments

width height maxval

Example

P6

# Created by Paint Shop Pro 5

128 128

# Could have more comments between values

255

&@#$5%%...

OpenGL does not support reading or writing graphical images (JPG, PNG, etc)

The .ppm format is simple enough for us to create utility to read a file

Page 28: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

ReadPPMFile Header

/* Read a P6 PPM File */

int readPPMFile(GLubyte image[MAX][MAX][3], char *filename) {

FILE* fp;

int i, w, h, m;

char head[70]; /* max line <= 70 in PPM (per spec). */

fp = fopen(filename, "rb");

if (!fp) {

perror(filename);

exit(1);

}

/* Check for the PPM Magic number, P6 */

fgets(head, 70, fp);

if (strncmp(head, "P6", 2)) {

fprintf(stderr, "%s: Not a raw PPM file\n", filename);

exit(1);

}

Page 29: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

ReadPPMFile Header

/* grab the three elements in the header (width, height, maxval). */

i = 0;

while (i < 3) {

fgets(head, 70, fp);

if (head[0] == '#') /* skip comments. */

continue;

if (i == 0)

i += sscanf(head, "%d %d %d", &w, &h, &m);

else if (i == 1)

i += sscanf(head, "%d %d", &h, &m);

else if (i == 2)

i += sscanf(head, "%d", &m);

}

if ((w != MAX) || (h != MAX) || (m > 255))

29

Page 30: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

The work in ReadPPMFile/* Read a P6 PPM File */

int readPPMFile(GLubyte img[MAX][MAX][3], char *fname) {

...

fread(image, sizeof(unsigned char), w*h*3, fp);

fclose(fp);

return 1;

}

int main(int argc, char **argv) {

...

if ((argc > 1) && (argv[1][0] != '-'))

readPPMFile(image, argv[1]);

...

30

Page 31: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Where can I get Textures?Paul Bourke has a large collection of images at http://paulbourke.net/

31

Page 32: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

32

Paul Bourke

Page 33: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

33

Where does mapping take place?

Mapping is implemented at the end of the rendering pipeline

Texture is loaded into Pixel Memory

Merged during Rasterization

Efficient as few polygons make it past the clipper

Page 34: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

34

Texture Mapping

s

t

x

y

z

image

geometry display

Look at Nate Robins' Tutor

Page 35: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

35

Texture Parameters

OpenGL has a variety of parameters that determine how texture is applied

We have seen wrapping parameters which determine what happens if s and t are outside the (0,1) range

Filter modes allow us to use area averaging instead of point samples

Mipmapping allows us to use textures at multiple resolutions

Environment parameters determine how texture mapping interacts with shading

Page 36: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Texture Functions

Controls how texture is applied

glTexEnv{fi}[v]( GL_TEXTURE_ENV, prop, param )

GL_TEXTURE_ENV_MODE modesGL_MODULATE: modulates with computed shade

GL_BLEND: blends with an environmental color

GL_REPLACE: use only texture colorGL(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

Set blend color with GL_TEXTURE_ENV_COLOR

Page 37: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

37

InterpolationOpenGL uses interpolation to find proper texels from specified texture

coordinates

Can be distortions

good selectionof tex coordinates

poor selectionof tex coordinates

texture stretchedover trapezoid showing effects of bilinear interpolation

Page 38: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

38

Aliasing

Point sampling of the texture can lead to aliasing errors

point samples in u,v (or x,y,z) space

point samples in texture space

miss blue stripes

Page 39: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Aliasing

39

Page 40: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Undersampling - holes

40

Page 41: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

41

Area Averaging

Note that preimage of pixel is curved

pixelpreimage

A better but slower option is to use area averaging

Acts as a low pass filter

Page 42: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

42

Magnification and Minification

Texture Polygon

Magnification Minification

PolygonTexture

More than one texel can cover a pixel (minification) ormore than one pixel can cover a texel (magnification)

Can use point sampling (nearest texel) or linear filtering( 2 x 2 filter) to obtain texture values

Page 43: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

43

Filter ModesModes determined byglTexParameteri( target, type, mode )

glTexParameteri(GL_TEXTURE_2D, GL_TEXURE_MAG_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXURE_MIN_FILTER, GL_LINEAR);

Linear filtering requires a border of an extra texel for filtering at edges (border = 1)

Page 44: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Prefiltering

44

Page 45: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Compare

45

Page 46: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Supersampling

46

Page 47: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

With change in Z

47

Page 48: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

48

Mipmapped Textures

Mipmapping allows for prefiltered texture maps of decreasing resolutions

Lessens interpolation errors for smaller objects

Declare mipmap level during texture definitionglTexImage2D( GL_TEXTURE_*D, level, … )

GLU mipmap builder routines will build all the textures from a given imagegluBuild2DMipmaps( … )

Page 49: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

MipMapping

49

Page 50: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Perlin Noise

50

A special random number generator

http://mrl.nyu.edu/~perlin/doc/oscar.html#noise

www.noisemachine.com/talk1/

Widely used to make realistic messes

Marble

Dirty surfaces

Perlin won an Oscar for his work on Tron

http://www.youtube.com/watch?v=-3ODe9mqoDE&feature=player_embedded

Page 51: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic
Page 52: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

52

Coordinate Systems

Although the idea is simple---map an image to a surface---there are 3 or 4 coordinate systems involved

Parametric coordinates

May be used to model curves and surfaces

Texture coordinates

Used to identify points in the image to be mapped

Object or World Coordinates

Conceptually, where the mapping takes place

Window Coordinates

Where the final image is really produced

Page 53: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

53

Texture Mapping

parametric coordinates

texture coordinates

world coordinateswindow coordinates

Page 54: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

54

Mapping Functions

We often have a natural map from texture coordinates to a point on a surface For example, the torus from Sam Buss's LightTorus program

But we really want to go the other wayFrom (x, y, z) to (s, t)

s

t

(x,y,z)

(x, y, z) ((rb ra sin)cos, ra cos, (rb ra sin)sin)

Page 55: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Where is my color?

55

Page 56: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

56

Backward Mapping

Given a pixel in screen space, we want to know to which point on an object it corresponds

Given a point on an object, we want to know to which point in the texture it corresponds

Need a map of the form

s = s(x,y,z)

t = t(x,y,z)

Such functions are difficult to find in general

In our cube example, we can interpolate over the corners

Issues with Perspective, Aliasing

Page 57: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

57

Two-part mapping

One solution to the mapping problem is to first map the texture to a simple intermediate surface

Example: map to cylinder

Page 58: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Cylinder

58

Page 59: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Spherical Map

59

Page 60: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Cube Map

60

Page 61: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Applications: Environment Map

61

Page 62: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Result

62

Page 63: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Environment Map

63 Geri's Game – Pixar

http://www.youtube.com/watch?v=1m7dcbIKvlw

Page 64: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Environment Map

64 Geri's Game – Pixar

http://www.youtube.com/watch?v=1m7dcbIKvlw

Page 65: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Second Mapping

65

Page 66: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

66

Page 67: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

67

Setting Mode

void updateTexgen(void) {

assert(mode == GL_NORMAL_MAP_EXT || mode == GL_REFLECTION_MAP_EXT);

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, mode);

glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, mode);

glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, mode);

}

void keyboard(unsigned char c, int x, int y) {

switch (c) {

case ' ':

if (mode == GL_REFLECTION_MAP_EXT) {

mode = GL_NORMAL_MAP_EXT;

} else {

mode = GL_REFLECTION_MAP_EXT;

}

updateTexgen(); // See above

Page 68: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

68

Environment Map Example

An example from NVIDIA

Now difficult to find

Uses cube environment map, mipmaps

Options – ' ', c, s, m, a, z

Also Menu choices

Page 69: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

69

Main (start)

Page 70: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

70

Main (start)

int main(int argc, char **argv) {

int i;

glutInitWindowSize(500, 500);

glutInit(&argc, argv);

for (i=1; i<argc; i++) {

if (!strcmp(argv[i], "-nomipmap")) {

mipmaps = 0;

}

if (!strcmp(argv[i], "-v")) {

gliVerbose(1);

}

}

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glutCreateWindow("EXT_texture_cube_map demo");

if (!glutExtensionSupported("GL_EXT_texture_cube_map")) { ...

Page 71: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

71

Filenames for faces

/* Pre-generated cube map images. */

char *faceFile[6] = {

"cm_left.tga",

"cm_right.tga",

"cm_top.tga",

"cm_bottom.tga",

"cm_back.tga",

"cm_front.tga",

};

/* Menu items. */

enum {

M_TEAPOT, M_TORUS, M_SPHERE,

M_SHINY, M_DULL,

M_REFLECTION_MAP, M_NORMAL_MAP,

};

Page 72: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

72

Load a face

void loadFace(GLenum target, char *filename) {

FILE *file;

gliGenericImage *image;

file = fopen(filename, "rb");

...

image = gliReadTGA(file, filename);

fclose(file);

if (mipmaps) {

gluBuild2DMipmaps(target, image->components, image->width, image->height, image->format, GL_UNSIGNED_BYTE, image->pixels);

} else {

glTexImage2D(target, 0, image->components, image->width, image->height, 0, image->format, GL_UNSIGNED_BYTE, image->pixels);

}

}

Page 73: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

73

Make the cube mapvoid makeCubeMap(void) {

int i;

for (i=0; i<6; i++) { loadFace(faceTarget[i], faceFile[i]); }

if (mipmaps) {

glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

} else {

glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

}

glEnable(GL_TEXTURE_CUBE_MAP_EXT);

updateTexgen();

updateWrap();

glEnable(GL_TEXTURE_GEN_S);

glEnable(GL_TEXTURE_GEN_T);

glEnable(GL_TEXTURE_GEN_R);

}

Page 74: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

74

main (cont)glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutKeyboardFunc(keyboard);

glutMouseFunc(mouse);

glutMotionFunc(motion);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective( /* fov */ 40.0, /* aspect ratio */ 1.0, /* Z near */ 1.0, /* Z far */ 10.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.);

glEnable(GL_DEPTH_TEST);

makeCubeMap();

Page 75: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

75

main (cont)

trackball(curquat, 0.0, 0.0, 0.0, 0.0);

glutCreateMenu(menu);

glutAddMenuEntry("Teapot", M_TEAPOT);

glutAddMenuEntry("Torus", M_TORUS);

glutAddMenuEntry("Sphere", M_SPHERE);

glutAddMenuEntry("Reflection map", M_REFLECTION_MAP);

glutAddMenuEntry("Normal map", M_NORMAL_MAP);

if (hasTextureLodBias) {

glutAddMenuEntry("Shiny reflection", M_SHINY);

glutAddMenuEntry("Dull reflection", M_DULL);

} else {

printf("cm_demo: Your OpenGL does not support EXT_texture_lod_bias.\n");

printf("cm_demo: Therefore dull reflections are not supported.\n");

}

glutAttachMenu(GLUT_RIGHT_BUTTON);

glutMainLoop();

Page 76: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

76

Trackball – use quaternions

/*

* Ok, simulate a track-ball. Project the points onto the virtual

* trackball, then figure out the axis of rotation, which is the cross

* product of P1 P2 and O P1 (O is the center of the ball, 0,0,0)

* Note: This is a deformed trackball-- is a trackball in the center,

* but is deformed into a hyperbolic sheet of rotation away from the

* center. This particular function was chosen after trying out

* several variations.

*

* It is assumed that the arguments to this routine are in the range

* (-1.0 ... 1.0)

*/

void

trackball(float q[4], float p1x, float p1y, float p2x, float p2y)

{

Page 77: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

77

Perspective Correction Hint

Texture coordinate and color interpolation

either linearly in screen space

or using depth/perspective values (slower)

Noticeable for polygons “on edge”

glHint(GL_PERSPECTIVE_CORRECTION_HINT, hint)

where hint is one of

GL_DONT_CARE

GL_NICEST

GL_FASTEST

Page 78: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Ray Tracing vs Env Map

78

Page 79: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Bump Mapping

79

Page 80: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

80

Page 81: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

81

Page 82: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

Displacement Maps

82

Bump maps are an illusion

Do not affect the silhouette

To change the surface itself, we have to work harder

We can perform "Displacement Mapping", but this is more work

We could move each vertex of a finely triangulated mesh

Page 83: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

83

Billboard

Used to create complex images

Draw the image perpendicular to ray from viewer

As you move, the billboard rotates to face you

Background of billboard is transparent

Page 84: 1 Texture Maps Jeff Parker Oct 2011. 2 Objectives Introduce Mapping Methods Texture Mapping Environment Mapping Bump Mapping Billboards Consider basic

84

Summary

Texture mapping is an efficient way to add visual interest

The texture can be procedural, or defined by an image

It is not easy to paste an image onto a curved surface in perspective

OpenGL provides many options to work around these issues.

Resources: NVIDIA tutorial (links page) – cubemap example

Nate Robins "Iron Maiden" demo – under his website, in SGI section

I have modified Angel's texture map to import an image – see Sample Programs