UniS CS293 Graphics with Java and OpenGL Textures.

29
UniS CS293 Graphics with Java and OpenGL Textures

Transcript of UniS CS293 Graphics with Java and OpenGL Textures.

UniS

CS293 Graphics with Java and OpenGL

Textures

2

UniS

• Material from the Redbook is extensively used throughout these slides.

• Code has been translated from C++ to JOGL based on examples from the book

3

UniS

Overview

• Understand what texture mapping can add to your scene

• Specify a texture image• Control how a texture image is filtered as it's applied

to a fragment• Create and manage texture images in texture objects

• Supply texture coordinates to indicate how the

texture image should be aligned to the objects in your scene

• Use automatic texture coordinate generation

4

UniS

Texture mapping

• To draw a large brick wall without texture mapping, each brick must be drawn as a separate polygon.

• Without texturing, a large flat wall might need thousands of individual bricks

• Texture mapping allows you to glue an image of a brick wall (obtained, perhaps, by scanning in a photograph of a real wall) to a polygon draw the wall as a single polygon.

• Texture mapping ensures that all the right things happen as the polygon is transformed and rendered.

• E.g. when viewed in perspective, the bricks appear smaller as the wall gets farther from the viewpoint.

• Textures can also be used in flight simulation textures to create the illusion of natural.

5

UniS

Texture mapping

• Textures can be mapped to surfaces made of a set of polygons or to curved surfaces, and you can repeat a texture in one or both directions to cover the surface.

• A texture can be one-dimensional. • You can automatically map a texture onto an object

in such a way that the texture indicates contours or other properties of the item being viewed.

• Shiny objects can be textured so that they appear to be in the centre of a room or other environment, reflecting the surroundings off their surfaces.

• A texture can be applied to a surface in different ways. It can be painted on directly, used to modulate the colour the surface would have been painted otherwise, or used to blend a texture colour with the surface colour.

6

UniS

Texture mapping

• Textures are simply rectangular arrays of data - for example, colour data, luminance data, or colour and alpha data.

• The individual values in a texture array are often called texels.

• What makes texture mapping tricky is that a rectangular texture can be mapped to nonrectangular regions, and this must be done in a reasonable way.

7

UniS

Texture mapping

• A quadrilateral displayed on the screen might be distorted by applying various transformations - rotations, translations, scaling, and projections.

• The figure shows how the texture-mapped quadrilateral might appear on your screen after these transformations.

• The quadrilaterals are only distorted by perpesctive transformations and rotations in 3D.

• Three of the quads are squares the front one is arbitrary.

• Note how the texture image of rectangular text is distorted to fit into a non-rectangular region.

• Note we have also used blending to show all the quads at the same time.

8

UniS

Steps in Texture Mapping

• To use texture mapping, you perform these steps.1. Create a texture object and specify a texture for

that object.2. Indicate how the texture is to be applied to each

pixel.3. Enable texture mapping.4. Draw the scene, supplying both texture and

geometric coordinates.

9

UniS

Create a Texture Object and Specify a Texture for That Object

• A texture is usually thought of as being two-dimensional, like most images, but it can also be one-dimensional.

• The data describing a texture may consist of one, two, three, or four elements per texel, representing anything from a modulation constant to an (R, G, B, A) quadruple.

10

UniS

Indicate How the Texture Is to Be Applied to Each Pixel

• Four possible functions for computing the final RGBA value from the fragment color and the texture-image data. 1. Use the texture color as the final color;

the decal mode, the texture is painted on top of the fragment

2. The replace mode, a variant of the decal mode.3. Use the texture to modulate, or scale, the

fragment's color; this technique is useful for combining the effects of lighting with texturing.

4. Finally, a constant color can be blended with that of the fragment, based on the texture value.

11

UniS

Enable Texture Mapping

gl.glEnable(GL.GL_TEXTURE_2D);

gl.glDisable(GL.GL_TEXTURE_2D);

12

UniS

Texture and Geometric Coordinates

• Define how the texture is aligned relative to the fragments its applied to before it's "glued on.“

• For a two-dimensional texture map the texture coordinates range from 0.0 to 1.0 in both directions, but the coordinates of the items being textured can be anything.

• Define how texture coordinates outside the range [0.0,1.0] should be treated. Do textures repeat, or are they clamped to a boundary value?

13

UniS

Jpeg images for textures

• It is not part of this course to cover the conversion of Jpg, or other image format, into texture maps.

• In order to have interesting examples we use the library NeHe Java ports from: http://pepijn.fab4.be/?page_id=34

• The NeHe tutorials are written for OpenGL, not JOGL. The web site ishttp://nehe.gamedev.net/

• Lab material contains details of how to use these ports for coding purposes.

14

UniS

Coding conventions

String[ ] textureNames = new String[ ] { "demos/data/images/mona-lisa.png", "demos/data/images/monkey.jpg", "demos/data/images/newton2.jpg", "demos/data/images/marilyn.jpg", "demos/data/images/SEPS_Computing.png"

};

The coding convention for all the lab material is to store image names in the textureNames array, and manipulate this field directly to generate texture maps.

15

UniS

Coding conventions

• Textures in JOGL are given identifiers that are integer values.

• Thus our list of images is converted into textures who’s identifiers can be stored in an integer array.

• Our convention is to define this as a field:

private int textures[] = new int[textureNames.length];

16

UniS

NeHe library methods

• TextureReader• This is a NeHe class that permits us to load a

Jpg image directly into a Texture object.• Texture is and internal class to

TextureReader that is used as a temporary place holder for textures.

• Following code shows how these classes are used in a NeHe routine to attach textures to an integer array of texture identifiers.

17

UniS

loadGLTextures method, version 1 public void loadGLTextures(GL gl) throws IOException { gl.glGenTextures(textureNames.length, textures, 0); gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_DECAL); for (int textureIndex = 0; textureIndex < textureNames.length; textureIndex++) { String textureName = textureNames[textureIndex]; TextureReader.Texture texture = TextureReader.readTexture(textureName); imageW[textureIndex] = texture.getWidth(); imageH[textureIndex] = texture.getHeight(); gl.glBindTexture(GL.GL_TEXTURE_2D, textures[textureIndex]); gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB8, texture.getWidth(), texture.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, texture.getPixels()); }

18

UniS

glTexEnvf

• gl.glTexEnvf( GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_DECAL);

• Defines the mode for combining texture map with geometric model

• In this case GL_DECAL specifies that the texture will be attached to the surface of the polygon and replace the material characteristics of the polygon.

19

UniS

Loading Texture

String textureName = textureNames[textureIndex];

TextureReader.Texture texture = TextureReader.readTexture( textureName);

imageW[textureIndex]=texture.getWidth();

imageH[textureIndex]=texture.getHeight();

These lines of code use the TextureReader.readTexture method to load in a particular Jpeg and convert it to a texture. This is stored in the internal variable texture.

20

UniS

Binding the texture

gl.glBindTexture(GL.GL_TEXTURE_2D, textures[textureIndex]);

gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);gl.glTexImage2D( GL.GL_TEXTURE_2D, 0, GL.GL_RGB8, texture.getWidth(), texture.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, texture.getPixels());

21

UniS

Binding the texture

• glGenTextures() and glBindTexture() name and create a texture object for a texture image.

• The single, full-resolution texture map is specified by glTexImage2D(), whose parameters indicate – size of the image, – type of the image, – location of the image, – and other properties of it.

22

UniS

Filtering

• Texture maps are square or rectangular• After being mapped to a polygon or surface and transformed into

screen coordinates, the individual texels rarely correspond to individual pixels.

• Depending on the transformations used and the texture mapping applied, a single pixel on the screen can correspond to anything from a tiny portion of a texel (magnification) to a large collection of texels (minification)

TexturePolygon Texture

Polygon

texel portiontexel grouppixel

pixel

Magnification Minification

23

UniS

Filtering

gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);

These lines define how to compute texel magnification and minification.

24

UniS

Texture coordinates (in display method)

gl.glPushMatrix(); gl.glBindTexture(GL.GL_TEXTURE_2D, textures[filter1]); float text_crd = 8f; gl.glTranslatef(0.0f, 0.0f, -2.0f * square_x); gl.glScalef(((float)imageW[filter1])/((float)imageH[filter1]), 1.0f, 1.0f); gl.glBegin(GL.GL_QUADS); gl.glNormal3f(0.0f, 0.0f, 1.0f);

gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-15.0f, -15.0f, 15.0f); gl.glTexCoord2f(text_crd, 0.0f); gl.glVertex3f(15.0f, -15.0f, 15.0f); gl.glTexCoord2f(text_crd,text_crd); gl.glVertex3f(15.0f, 15.0f, 15.0f); gl.glTexCoord2f(0.0f, text_crd); gl.glVertex3f(-15.0f, 15.0f, 15.0f);

gl.glEnd();gl.glPopMatrix();

Define a mapping that describes howthe texture is pasted on top of anypolygon

25

UniS

Repeating textures

gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-15.0f, -15.0f, 15.0f); gl.glTexCoord2f(text_crd, 0.0f); gl.glVertex3f(15.0f, -15.0f, 15.0f); gl.glTexCoord2f(text_crd,text_crd); gl.glVertex3f(15.0f, 15.0f, 15.0f); gl.glTexCoord2f(0.0f, text_crd); gl.glVertex3f(-15.0f, 15.0f, 15.0f);

When texture coordinates are larger than 1.0f, then thetexture can either be cropped, or repeated.

26

UniS

Repeating textures

• If we use the following lines within the loadGLTextures method, then the texture will be repeated when its texture coordinates exceed 1.0f

• gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);

• gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);

27

UniS

Repeating textures

In this case taking text_crd = 8.0f results in the polygon containingan 8x8 grid of the texture.

28

UniS

Modulating textures

• Use the commandgl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);

• Instead of gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_DECAL);

• Then the colour properties of the material we are texture mapping will modulate how the final image appear.

29

UniS

Modulating textures

Here the material has purered diffuse material set.

Note since we have blending enabled we also have transparency