Download presentation
Presentation is loading. Please wait.
Published byDamian Paul Modified over 9 years ago
1
Texturing A picture is worth a thousand words
2
Texturing Texturing is the art of doing this with any picture to any model. (This is Opus the Penguin wrapped around a sphere.)
3
Texturing First, a few words about what a picture is: A picture is a 2D array of color values (RGB or RGBA). Each element in the array is one pixel. The size of an image in pixels is its width times its height. A picture stored in memory is called a bitmap. Next, a few words about images in Windows: Windows BMPs store DIBs, or Device Independent Bitmaps. Loading a DIB is a really huge hassle. Next, a few words about images in OpenGL: The height and width of any bitmaps in OpenGL must be powers of two (32x32, 512x512, but not 31x31 or 42x27). The GLAUX library simplifies loading DIBs for you.
4
Texturing A bitmap in memory: ...a two-dimensional array of color values
5
Texture Co-ordinates We use texture co-ordinates to identify locations in the texture itself. (0,0) is the lower left-hand corner of the texture. (0.5, 0.5) is the middle of the texture. (1,1) is the upper right-hand corner. Caveat: OpenGL draws bottom-to-top, not top-to-bottom, so in your own rendering you may have to invert Y. (1,1) (0,0)
6
Texture Mapping Texture-mapping is the mapping from 3D vertices in your model to 2D texture co-ordinates. This associates a particular point on your polygon with a particular point on your picture. As the polygon is rendered, the inside of the polygon is filled in with the space of the picture that runs between the texture co-ordinates of the polygon’s vertices. (0,1) (1,0) (0,0)
7
Texture Mapping Shifting texture co-ordinates If the values you map to your texture co-ordinates shift, the image will appear to shift on the surface. The image at right is drawn with texture co-ordinates shifted by (0.25, 0.25). (0.25,1.25) (1.25,0.25) (0.25,0.25)
8
Texture Mapping in OpenGL OpenGL works on the idea that you bind the current texture before you glBegin(), and then you specify texture co-ordinates for each glVertex() you draw. Fortunately, the GLAUX library makes file loading easy. Remember, your image dimensions MUST be multiples of 2. To compile an app which uses glaux functions, you’ll need to link glaux.lib. To link a.lib library, go to Project / Settings... / Link tab, and add ‘glaux.lib’ to the list of Library Modules.
9
Texture Mapping in OpenGL Loading BMPs with GLAUX: Gluint arrTextures[NUM_TEXTURES]; char *arrNames[NUM_TEXTURES] = { “filename1.bmp”, “filename2.bmp”,... }; glEnable(GL_TEXTURE_2D); glGenTextures(NUM_TEXTURES, arrTextures); for (i = 0; i<NUM_TEXTURES; i++) { AUX_RGBImageRec *pAuxImgLoader = auxDIBImageLoad(arrNames[i]); if (pAuxImgLoader && pAuxImgLoader->data) { glBindTexture(GL_TEXTURE_2D, arrTextures[i]); glTexImage2D(GL_TEXTURE_2D, 0, 3, pAuxImgLoader->sizeX, pAuxImgLoader->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, pAuxImgLoader->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); free(pAuxImgLoader->data); }
10
Texture Mapping in OpenGL Displaying a texture-mapped square glBindTexture(GL_TEXTURE_2D, arrTextures[whichTexture]); glColor3f(1,1,1); glNormal3f(0,0,1); glBegin(GL_QUADS); glTexCoord2f(0,1); glVertex3f(-5,5,0); glTexCoord2f(0,0); glVertex3f(-5,-5,0); glTexCoord2f(1,0); glVertex3f(5,-5,0); glTexCoord2f(1,1); glVertex3f(5,5,0); glEnd(); glBindTexture(GL_TEXTURE_2D, 0);
11
Texture Mapping in OpenGL Texturing a parametric surface Texture-mapping a parametric surface is very easy. If u and v range from 0 to 1, then they also cover the range of the texture co-ordinates. You can set the current texture co-ordinate as (u,v) to map your image to any parametric surface.
12
Texture Mapping in OpenGL Texturing a parametric surface This should look familiar............................. A = evaluateFunction(which, u, v); B = evaluateFunction(which, u, v+step); C = evaluateFunction(which, u+step, v+step); D = evaluateFunction(which, u+step, v); N = (((C-A).normalized()) ^ ((B-A).normalized())).normalized(); glColor3f(1,1,1); glNormal3f(N.x(),N.y(),N.z()); glBegin(GL_QUADS); { glTexCoord2f(u, v); glVertex3f(A.x(),A.y(),A.z()); glTexCoord2f(u, v+step); glVertex3f(B.x(),B.y(),B.z()); glTexCoord2f(u+step, v+step); glVertex3f(C.x(),C.y(),C.z()); glTexCoord2f(u+step, v); glVertex3f(D.x(),D.y(),D.z()); } glEnd();..........................
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.