CH6 Texture

Post on 21-Jan-2016

63 views 0 download

Tags:

description

CH6 Texture. Course Map. Vertex pipeline. Transformation & Lighting. Viewport culling & clipping. Primitive assembly. Rasterizer setup. We are here!. Pixel pipeline. Texture blending. Per Fragment operations. Buffer operations. Framebuffer. Before coding … 1/3. - PowerPoint PPT Presentation

Transcript of CH6 Texture

CH6 Texture

Pixel pipeline

Vertex pipeline

Course Map

Transformation&

Lighting

Primitiveassembly

Viewport culling&

clipping

Textureblending

Per Fragmentoperations

Bufferoperations

Rasterizersetup

Framebuffer

We are here!

Before coding… 1/3

Prepare all texture images you need. BMP file is a good choice If you want to load other format,

you can try the FreeImage library. Or…just convert image files to BMP

files

Before coding… 2/3

Add GlAux.Lib into your project.

Before coding… 3/3

Prepare a mesh with texture coordinate For simple shapes, you can assign texture

coordinate by manually coding. For complex objects

Use automatic texture-coordinate generation Or use modeling tools

Maya, 3DS Max, Blender…

How to use texture? 1/2

Initial Texture Generate Texture

glGenTextures(number of textures , texture id array) Bind

glBindTexture(GL_TEXTURE_2D, textId); Move Date into Texture

glTexImage2D (…) or gluBuild2DMipmaps(…)

Set the Options glTexEnv (…) glTexParameteri (…)

How to use texture? 2/2

Draw Object with Texture Enable

glEnable(GL_TEXTURE_2D); Bind

glBindTexture(GL_TEXTURE_2D, textId); Assign texture coordinate for each vertex

glTexCoord2f(u, v); glVertex3f(x, y, z);

Disable and unbind them when you don’t want to use them on next object.

Example Program 1/4

#include<gl/glaux.h>#include<gl/glut.h>#define TEX_NUM 1 //the number of textures you use.

#define MIPMAP

AUX_RGBImageRec * img;//to save image file

GLuint texObject[TEX_NUM]; //texture object

Example Program 2/4

void LoadTexture(char* filename){img = auxDIBImageLoadA(filename);glGenTextures(TEX_NUM, texObject);glBindTexture(GL_TEXTURE_2D, texObject[0]);

#ifdef MIPMAPgluBuild2DMipmaps(GL_TEXTURE_2D, 4, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, img->data);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

#elseglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img->sizeX, img->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, img->data);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

#endifglHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

}

Example Program 3/4

void GL_display(){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 1.0, 1.0);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texObject[0]);glBegin(GL_QUADS);glTexCoord2f(0.0, 0.0);glVertex3f(-50.0, 0.0, 0.0);glTexCoord2f(0.0, 100.0);glVertex3f(-50.0, 0.0, 100.0);glTexCoord2f(100.0, 100.0);glVertex3f(50.0, 0.0, 100.0);glTexCoord2f(100.0, 0.0);glVertex3f(50.0, 0.0, 0.0);glEnd();glFlush();

}

Example Program 4/4

void GL_reshape(GLsizei w, GLsizei h){

glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 0.5, 100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0, 0.5, 0.0, 50.0, 0.0, 50.0, 0.0, 1.0, 0.0);

}

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

glutInit(&argc, argv);glutInitWindowSize(400, 400);glutInitWindowPosition(0, 0);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);glutCreateWindow("Texture");LoadTexture("check.bmp");glutDisplayFunc(GL_display);glutReshapeFunc(GL_reshape);glutMainLoop();

}

Result

Check_old.bmp

Width/Height: 256/256

Load BMP file AUX_RGBImageRec* auxDIBImageLoadA(char

*); Load a BMP file.

typedef struct _AUX_RGBImageRec { GLint sizeX, sizeY;

unsigned char *data;};

sizeX, sizeY : image width / height. data : A pointer to the image data in memory.

Generate Texture Object void glGenTextures( GLsizei n, GLuint

*textures ); To generate texture names. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/

glfunc02_3p6b.asp n: the number of texture names to be generated. textures: pointer to the first element of an array in

which the texture are stored. GLboolean glIsTexture( GLuint texture );

To determine if a name corresponds to a texture. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/

glfunc03_7cv9.asp

Bind texture void glBindTexture( GLenum target, GLuint

texture );

To bind the texture to the target. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_3bad.asp

target: GL_TEXTURE_1D, GL_TEXTURE_2D

void glDeleteTextures( GLsizei n, const GLuint

*textures ); Delete named textures. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_6vqr.asp

Send texture data: glTexImage2D 1/4 void glTexImage2D(

GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels

);

Send texture data: glTexImage2D 2/4

Specifies a 2D texture image http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/

glfunc03_16jo.asp

target: Must be GL_TEXTURE_2D level: level-of-detail level. It must be 0 if you

don’t want to use mip-map. internalformat: GL_RGBA and many

others… Width / height : image witdh / height

Send texture data: glTexImage2D 3/4

border: 0 or 1 0 : no border, image width & height must

be power of 2. 1 : use border, image width & height

must be power of 2 plus 2.

Send texture data: glTexImage2D 4/4

format: format of the image data GL_RGB, GL_RGBA, and many others…

type: data type of the image data pixel: A pointer to the image data in

memory. (Hint: the BMP file you have loaded…)

Texture Setting: glTexEnv 1/3

void glTexEnv{fi}(GLenum target, GLenum pname, GLfloat param ); to indicate how the texels are combined

with the original pixels http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_6xyu.asp

target: must be GL_TEXTURE_ENV pname: must be GL_TEXTURE_ENV_MODE param: 5 choices, see next page

Texture Setting: glTexEnv 2/3

Base Internal Format GL_REPLACE GL_MODULATE GL_ADD

GL_ALPHA C = Cf, A = At C = Cf, A = AfAt C=Cf, A=AfAtGL_LUMINANCE C = Lt, A = Af C = CfLt, A = Af C=Cf+CT, A=AfGL_LUMINANCE_ALPHA C = Lt, A = At C = CfLt, A = AfAt C=Cf+Ct, A=AfAtGL_INTENSITY C = It, A = It C = CfIt, A = AfItC=Cf+Ct, A=Af+AtGL_RGB C = Ct, A = Af C = CfCt, A = Af C=Cf+Ct, A=AfGL_RGBA C = Ct, A = At C = CfCt, A = AfAt C=Cf+Ct, A=AfAt

Base Internal Format GL_DECAL GL_BLEND

GL_ALPHA Undefined C = Cf, A = AfAtGL_LUMINANCE Undefined C = Cf(1-Lt)+CcLt, A = AfGL_LUMINANCE_ALPHA Undefined C = Cf(1-Lt)+CcLt, A = AfAtGL_INTENSITY Undefined C = Cf(1-It)+CcIt, A = Af(1-It)+AcItGL_RGB C = Ct, A = Af C = Cf(1-Ct)+CcCt, A = AfGL_RGBA C = Cf(1-At)+CtAt, A = At C = Cf(1-Ct)+CcCt, A = AfAt

Ct = color of texture , At = alpha of textureCf = color of frame buffer , Af = alpha of frame buffer

Texture Setting: glTexEnv 3/3

glTexEnv{fi}v(GLenum target, GLenum pname, const GLfloat *params ) target: must be GL_TEXTURE_ENV pname: GL_TEXTURE_ENV_COLOR or

GL_TEXTURE_ENV_MODE params:

if pname is GL_TEXTURE_ENV_MODE : A pointer to an array of parameters.(GL_MODULATE, GL_DECAL, and GL_BLEND)

if pname is GL_TEXTURE_ENV_COLOR: a pointer to an array of R, G, B, A

Texture parameter 1/5

glTexParameter{if}(GLenum target, GLenum pname, GLfloat param ) Set texture parameters. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/

glfunc03_9upe.asp

target: GL_TEXTURE_1D, GL_TEXTURE_2D

pname / param: see next page

Texture parameter 2/5

pname param

GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_T GL_REPEAT, GL_CLAMP

GL_TEXTURE_MAG_FILTERGL_TEXTURE_MIN_FILTER GL_NEAREST, GL_LINEAR,

GL_NEAREST_MIPMAP_NEAREST,

GL_NEAREST_MIPMAP_LINEAR,GL_LINEAR_MIPMAP_LINEAR,GL_LINEAR_MIPMAP_NEAREST

GL_TEXTURE_BORDER_COLOR color value

Texture parameter 3/5

WRAP

Repeat both S, T

Clamp both S, T

Repeat T but Clamp S

Texture parameter 4/5

MAG filter When the pixel being textured maps to an

area less than or equal to one texture element

MIN filter When the pixel being textured maps to an

area greater then one texture element

Texture parameter 5/5

GL_NEARST

pixel

texel

GL_LINEAR

Get average color...

GL_NEAREST_MIPMAP_XXXXXX Find the most closely match mipmap

GL_LINEAR_MIPMAP_XXXXXXX Find the most 2 closely match mipmap and get average.

Build mip-maps 1/3

int gluBuild2DMipmaps( GLenum target, GLint components, GLint width, GLint height, GLenum format, GLenum type, const void *data );

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glufnc01_406r.asp

Build mip-maps 2/3

target : Must be GL_TEXTURE_2D. components :The number of color

components in the texture. Must be 1, 2, 3, or 4.

width, height :width / height of image. format : GL_RGB, GL_RGBA and many

others… type :The data type for data data :A pointer to the image data in

memory.

Build mip-maps 3/3

without mip-map with mip-map

Automatic TextureCoordinate Generation No need to use glTexCoord Four types

Sphere Object plane Eye plane Cube

Sphere

environment.bmp

Width/Height: 128/128

Object plane -1

S = 1.0 x + 0.0 y + 0.0 z + 0.0 w

T = 0.0 x + 1.0 y + 0.0 z + 0.0 w

xyz in world space

Object plane -2

S = 1.0 x + 0.0 y + 0.0 z + 0.0 w

T = 0.0 x + 2.0 y + 0.0 z + 0.0 w

xyz in world space

Eye planeS = 1.0 x + 0.0 y + 0.0 z + 0.0

wT = 0.0 x + 1.0 y + 0.0 z + 0.0

wxyz in eye space

Sphere Example 1/3

#include<gl/glaux.h>#include<gl/glut.h>

AUX_RGBImageRec * img;GLuint texObject;

void LoadTexture(char* filename){img = auxDIBImageLoad(filename);glGenTextures(1, &texObject);glBindTexture(GL_TEXTURE_2D, texObject);gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, img->data);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);glEnable(GL_TEXTURE_2D);

}

Sphere Example 2/3

void GL_display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnable(GL_DEPTH_TEST);glColor3f(1.0, 1.0, 1.0);glutSolidTeapot(18);glFlush();

}

void GL_reshape(GLsizei w, GLsizei h){

glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 0.5, 100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0, 0.0, 50.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

}

Sphere Example 3/3

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

glutInit(&argc, argv);glutInitWindowSize(400, 400);glutInitWindowPosition(0, 0);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);glutCreateWindow("Texture");LoadTexture("environment.bmp");glutDisplayFunc(GL_display);glutReshapeFunc(GL_reshape);glutMainLoop();

}

Object Plane Examplevoid LoadTexture(char* filename){

float params1[] = {1.0 , 0.0 , 0.0 ,0.0};float params2[] = {0.0 , 1.0 , 0.0 ,0.0};

img = auxDIBImageLoad(filename);glGenTextures(1, &texObject);glBindTexture(GL_TEXTURE_2D, texObject);gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB,GL_UNSIGNED_BYTE, img->data);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGenfv(GL_S , GL_OBJECT_PLANE , params1);glTexGenfv(GL_T , GL_OBJECT_PLANE , params2);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);glEnable(GL_TEXTURE_2D);

}

Eye Plane Examplevoid LoadTexture(char* filename){

float params1[] = {1.0 , 0.0 , 0.0 ,0.0};float params2[] = {0.0 , 1.0 , 0.0 ,0.0};

img = auxDIBImageLoad(filename);glGenTextures(1, &texObject);glBindTexture(GL_TEXTURE_2D, texObject);gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB,GL_UNSIGNED_BYTE, img->data);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);glTexGenfv(GL_S , GL_EYE_PLANE , params1);glTexGenfv(GL_T , GL_EYE_PLANE , params2);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);glEnable(GL_TEXTURE_2D);

}

Cube

Result

Reflection Normal

Cube Example Bind Once, send six images.glBindTexture(GL_TEXTURE_CUBE_MAP, id);glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB,

imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image1);glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB,

imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image2);glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB,

imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image3);glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB,

imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image4);glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB,

imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image5);glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB,

imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image6);glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

Texture CoordinateglTexGeni(GL_S, GL_TEXTURE_GEN_MODE,

GL_REFLECTION_MAP);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,

GL_REFLECTION_MAP);glTexGeni(GL_R, GL_TEXTURE_GEN_MODE,

GL_REFLECTION_MAP);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);glEnable(GL_TEXTURE_GEN_R);glEnable(GL_TEXTURE_CUBE_MAP);

//draw your objects

Automatic Texture-Coordinate Generation

glTexGen{dfi}(GLenum coord, GLenum pname, GLdouble param); control the generation of texture

coordinates http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_73u6.asp

coord: GL_S, GL_T, GL_R, or GL_Q. pname: must be GL_TEXTURE_GEN_MODE. param: GL_OBJECT_LINEAR,

GL_EYE_LINEAR, or GL_SPHERE_MAP

Automatic Texture-Coordinate Generation glTexGen{dfi}v(GLenum coord,

GLenum pname, const GLdouble *params ); coord: GL_S, GL_T, GL_R, or GL_Q. pname: GL_TEXTURE_GEN_MODE,

GL_OBJECT_PLANE, or GL_EYE_PLANE … params: the array of texture generation

parameters, if pname is GL_OBJECT_PLANE, or GL_EYE_PLANE.

*Generated plane = p1X + p2Y + p3Z + p4W

Multi-texture

Op 0

Op 1

Op 2

Op n

glActiveTexture( GL_TEXTURE0 );glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, …);

Pixel Color

final color

glActiveTexture( GL_TEXTURE1 );glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, …);

glActiveTexture( GL_TEXTURE2 );glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, …);

glActiveTexture( GL_TEXTUREn );glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, …);

Texture Channel void glActiveTexture(GLenum texture) Parameter:

GL_TEXTURE0 ~ GL_MAX_TEXTURE_UNITS – 1

Choose channel before binding texture Bind 0 => Disable the chosen

channel

Operation glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, operation);

Operation GL_MODULATE / GL_ADD or / ... / GL_SUBTRACT

Multiple Texture Coordinate glMultiTexCoord2fARB(GLenum target, GLshort s, GLshort

t);

Target GL_TEXTURE0 ~ GL_MAX_TEXTURE_UNITS – 1

s, t The texture coordinate of vertex

Set the texture coordinate before calling glVertex

You need the glew libraray. The setting of glew is similar to the glaux

Example#include "glew.h"#include "glaux.h"#include "glut.h“#define TEX_NUM 2void reshape(GLsizei w, GLsizei h);void display();int main(int argc, char** argv){

glutInit(&argc, argv);glutInitWindowSize(400, 400);glutInitWindowPosition(0, 0);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);glutCreateWindow("Texture");glewInit();glGenTextures(TEX_NUM, texObject);LoadTexture(“FirstTexture.bmp", 0);LoadTexture("SecondTexture.bmp", 1);glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;

}

void LoadTexture(char* filename, int index)

{

img = auxDIBImageLoadA(filename);

glBindTexture(GL_TEXTURE_2D, texObject[index]);

#ifdef MIPMAP

gluBuild2DMipmaps(GL_TEXTURE_2D, 4, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, img->data);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

#else

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img->sizeX, img->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, img->data);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

#endif

}

void display(){

glClearColor(0.0, 0.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 1.0, 1.0);

//bind texture 0glActiveTexture(GL_TEXTURE0);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texObject[0]);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);

//bind texture 1glActiveTexture(GL_TEXTURE1);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texObject[1]);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);

glBegin(GL_QUADS);glColor3f(1.0, 1.0, 1.0)glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0);glVertex3f(-1.0, -1.0, 0.0);

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);glMultiTexCoord2f(GL_TEXTURE1, 3.0, 0.0);glVertex3f(1.0, -1.0, 0.0);

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);glMultiTexCoord2f(GL_TEXTURE1, 3.0, 3.0);glVertex3f(1.0, 1.0, 0.0);

glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);glMultiTexCoord2f(GL_TEXTURE1, 0.0, 3.0);glVertex3f(-1.0, 1.0, 0.0);glEnd();

//unbind texture 1glActiveTexture(GL_TEXTURE1);glDisable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, 0);

//unbind texture 0glActiveTexture(GL_TEXTURE0);glDisable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, 0);

glFlush();}

void reshape(GLsizei w, GLsizei h){ glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity();

glMatrixMode(GL_MODELVIEW); glLoadIdentity();}

Result

1st texture 2nd texture Result