   How do I use multi-texture?
  I tried multi-texturing(not multi-pass)this day.But I were failed. What's wrong in my code?===================================================================#include "../../shared/gltools.h"// OpenGL toolkit// Rotation amountsstatic GLfloat xRot = 0.0f;static GLfloat yRot = 0.0f;GLfloat g_Vertices[4][3] ={{ -1.0f, 1.0f, 0.0f, },{  1.0f, 1.0f, 0.0f, },{ -1.0f, -1.0f, 0.0f, },{ 1.0f, -1.0f, 0.0f, },};GLfloat g_Colors[4][4] ={    { 1.0f , 1.0f , 1.0f , 1.0f },    { 1.0f , 1.0f , 1.0f , 1.0f },{ 1.0f , 1.0f , 1.0f , 1.0f },{ 1.0f , 1.0f , 1.0f , 1.0f },};GLfloat g_UVs[4][2] ={    { 0.0f , 1.0f },    { 1.0f , 1.0f },{ 0.0f , 0.0f },{ 1.0f , 0.0f },};GLuint vertexBuffer;GLuint colorBuffer;GLuint texBuffer;GLuint texs[2];///////////////////////////////////////////////////////////// Called to draw scenevoid RenderScene(void){// Clear the window with current clearing colorglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);    glLoadIdentity();gluLookAt( 0.0f , 3.0f , 5.0f,0.0f , 0.0f , 0.0f,0.0f , 1.0f , 0.0f );    //glTranslatef(0.0f, 0.0f, -5.0f);glRotatef(xRot, 1.0f, 0.0f, 0.0f);glRotatef(yRot, 0.0f, 1.0f, 0.0f);glColor3ub(255, 255, 0);glEnableClientState(GL_VERTEX_ARRAY);glEnableClientState(GL_COLOR_ARRAY);glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);    glVertexPointer(3, GL_FLOAT,0,  0);glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);glColorPointer(4, GL_FLOAT, 0, 0); glClientActiveTextureARB(GL_TEXTURE0_ARB);glBindBuffer(GL_ARRAY_BUFFER, texBuffer);glTexCoordPointer(2, GL_FLOAT, 0, 0); glEnableClientState(GL_TEXTURE_COORD_ARRAY);glEnable(GL_TEXTURE_2D);glClientActiveTextureARB(GL_TEXTURE1_ARB);glBindBuffer(GL_ARRAY_BUFFER, texBuffer);glTexCoordPointer(2, GL_FLOAT, 0, 0); glEnableClientState(GL_TEXTURE_COORD_ARRAY);glEnable(GL_TEXTURE_2D);glDrawArrays( GL_TRIANGLE_STRIP , 0 , 4 );glutSwapBuffers();glDisableClientState(GL_VERTEX_ARRAY);glDisableClientState(GL_COLOR_ARRAY);glDisableClientState(GL_TEXTURE_COORD_ARRAY);}///////////////////////////////////////////////////////////// Called by GLUT library when idle (window not being// resized or moved)void TimerFunction(int value){// Redraw the scene with new coordinatesglutPostRedisplay();glutTimerFunc(33,TimerFunction, 1);}///////////////////////////////////////////////////////////// Setup the rendering statevoid SetupRC(void){// Set clear color to blueglClearColor(0.0f, 0.0f, 1.0f, 1.0f);glGenBuffers(1, &vertexBuffer);glBindBuffer( GL_ARRAY_BUFFER , vertexBuffer );glBufferData( GL_ARRAY_BUFFER , sizeof(GLfloat) * 3 * 4 , g_Vertices , GL_STATIC_DRAW );glGenBuffers(1, &colorBuffer);glBindBuffer( GL_ARRAY_BUFFER , colorBuffer );glBufferData( GL_ARRAY_BUFFER , sizeof(GLfloat) * 4 * 4 , g_Colors , GL_STATIC_DRAW );glGenBuffers(1, &texBuffer);glBindBuffer( GL_ARRAY_BUFFER , texBuffer );glBufferData( GL_ARRAY_BUFFER , sizeof(GLfloat) * 2 * 4 , g_UVs , GL_STATIC_DRAW );glGenTextures( 2 , texs);GLbyte *pBytes;GLint iWidth , iHeight , iComponents;GLenum eFormat;glPixelStorei(GL_UNPACK_ALIGNMENT , 1 );glBindTexture( GL_TEXTURE_2D , texs[0]);pBytes = gltLoadTGA("wall.tga" , &iWidth , &iHeight , &iComponents , &eFormat);gluBuild2DMipmaps(GL_TEXTURE_2D , iComponents , iWidth , iHeight , eFormat , GL_UNSIGNED_BYTE , pBytes);glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR);glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR);glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_CLAMP_TO_EDGE);glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_CLAMP_TO_EDGE);free(pBytes);glBindTexture( GL_TEXTURE_2D , texs[1]);pBytes = gltLoadTGA("spotlite.tga" , &iWidth , &iHeight , &iComponents , &eFormat);gluBuild2DMipmaps(GL_TEXTURE_2D , iComponents , iWidth , iHeight , eFormat , GL_UNSIGNED_BYTE , pBytes);glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR);glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR);glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_CLAMP_TO_EDGE);glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_CLAMP_TO_EDGE);free(pBytes);glActiveTexture(GL_TEXTURE0);    glEnable(GL_TEXTURE_2D);    glBindTexture(GL_TEXTURE_2D, texs[0]);    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);   // Decal tarnish   glActiveTexture(GL_TEXTURE1);    glBindTexture(GL_TEXTURE_CUBE_MAP, texs[1]);   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);}///////////////////////////////////////////////////////////// Called by GLUT library when the window has chanaged sizevoid ChangeSize(int w, int h){    GLfloat fAspect;   // Prevent a divide by zero    if(h == 0)   h = 1;    // Set Viewport to window dimensions    glViewport(0, 0, w, h);// Reset coordinate system    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    fAspect = (GLfloat) w / (GLfloat) h;    gluPerspective(180 / 4.0f, 1.0f, 0.0f, 100.0f);   glMatrixMode(GL_MODELVIEW);    glLoadIdentity();}// Respond to arrow keysvoid SpecialKeys(int key, int x, int y){if(key == GLUT_KEY_UP)xRot-= 5.0f;if(key == GLUT_KEY_DOWN)xRot += 5.0f;if(key == GLUT_KEY_LEFT)yRot -= 5.0f;if(key == GLUT_KEY_RIGHT)yRot += 5.0f;    xRot = (GLfloat)((const int)xRot % 360);   yRot = (GLfloat)((const int)yRot % 360);// Refresh the WindowglutPostRedisplay();}///////////////////////////////////////////////////////////// Main program entry pointint main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(320,320);glutCreateWindow("Bounce");glutDisplayFunc(RenderScene);glutSpecialFunc(SpecialKeys);glutReshapeFunc(ChangeSize);glutTimerFunc(33, TimerFunction, 1);SetupRC();glutMainLoop();    return 0;}   
  Try A Try?  glActiveTexture(GL_TEXTURE0);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texs[0]);  glActiveTexture(GL_TEXTURE1);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texs[1]); glBindBuffer(GL_ARRAY_BUFFER, texBuffer);glClientActiveTexture(GL_TEXTURE0);glEnableClientState(GL_TEXTURE_COORD_ARRAY);glTexCoordPointer(2, GL_FLOAT, 0, 0); glClientActiveTexture(GL_TEXTURE1);glEnableClientState(GL_TEXTURE_COORD_ARRAY);glTexCoordPointer(2, GL_FLOAT, 0, 0); ........glDrawArrays( GL_TRIANGLE_STRIP , 0 , 4 ); .......glClientActiveTexture(GL_TEXTURE0);glDisableClientState(GL_TEXTURE_COORD_ARRAY);glClientActiveTexture(GL_TEXTURE1);glDisableClientState(GL_TEXTURE_COORD_ARRAY); glActiveTexture(GL_TEXTURE1);glDisable(GL_TEXTURE_2D);glActiveTexture(GL_TEXTURE0);glDisable(GL_TEXTURE_2D);;  A "Doesn't Work" doesn't say very much about what's wrong in the code.But a quick inspection tells me that you uploaded a GL_TEXTURE_2D into texs[1], but later you bind texs[1] to the GL_TEXTURE_CUBE_MAP target, which should be again GL_TEXTURE_2D.   