From LTexture.cpp

 

#include "LTexture.h"
  #include <IL/il.h>
  #include <IL/ilu.h>
  GLenum DEFAULT_TEXTURE_WRAP = GL_REPEAT;
bool LTexture::loadTextureFromPixels32( GLuint* pixels, GLuint imgWidth, GLuint imgHeight, GLuint texWidth, GLuint texHeight )
{
  freeTexture();
  mImageWidth = imgWidth;
  mImageHeight = imgHeight;
  mTextureWidth = texWidth;
  mTextureHeight = texHeight;
  glGenTextures( 1, &mTextureID );
  glBindTexture( GL_TEXTURE_2D, mTextureID );
  glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, mTextureWidth, mTextureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );//线性放大
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );//线性缩小
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, DEFAULT_TEXTURE_WRAP );//s坐标包裹模式
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, DEFAULT_TEXTURE_WRAP );//t坐标包裹模式
  glBindTexture( GL_TEXTURE_2D, NULL );
  GLenum error = glGetError();
  if( error != GL_NO_ERROR )
  {
    printf( "Error loading texture from %p pixels! %s\n", pixels, gluErrorString( error ) );
    return false;
  }
  return true;
}

LUtil.cp
LTexture gRepeatingTexture;
GLfloat gTexX = 0.f, gTexY = 0.f;
int gTextureWrapType = 0;
bool loadMedia()
{
  if( !gRepeatingTexture.loadTextureFromFile( "14_repeating_textures/texture.png" ) )
  {
    printf( "Unable to load repeating texture!\n" );
    return false;
  }
  return true;
}
void update()
{
  gTexX++;
  gTexY++;
  if( gTexX >= gRepeatingTexture.textureWidth() )
  {
    gTexX = 0.f;
  }
  if( gTexY >= gRepeatingTexture.textureHeight() )
  {
    gTexY = 0.f;
  }
}
void render()
{
  glClear( GL_COLOR_BUFFER_BIT );
  GLfloat textureRight = (GLfloat)SCREEN_WIDTH / (GLfloat)gRepeatingTexture.textureWidth();
  GLfloat textureBottom = (GLfloat)SCREEN_HEIGHT / (GLfloat)gRepeatingTexture.textureHeight();
  glBindTexture( GL_TEXTURE_2D, gRepeatingTexture.getTextureID() );
  glMatrixMode( GL_TEXTURE );
  glLoadIdentity();
  glTranslatef( gTexX / gRepeatingTexture.textureWidth(), gTexY / gRepeatingTexture.textureHeight(), 0.f );
  glBegin( GL_QUADS );
    glTexCoord2f( 0.f, 0.f ); glVertex2f( 0.f, 0.f );
    glTexCoord2f( textureRight, 0.f ); glVertex2f( SCREEN_WIDTH, 0.f );
    glTexCoord2f( textureRight, textureBottom ); glVertex2f( SCREEN_WIDTH, SCREEN_HEIGHT );
    glTexCoord2f( 0.f, textureBottom ); glVertex2f( 0.f, SCREEN_HEIGHT );
  glEnd();
  glutSwapBuffers();
}
void handleKeys( unsigned char key, int x, int y )
{
if( key == 'q' )
{
gTextureWrapType++;
if( gTextureWrapType >= 2 )
{
gTextureWrapType = 0;
}
glBindTexture( GL_TEXTURE_2D, gRepeatingTexture.getTextureID() );
switch( gTextureWrapType )
{
case 0:
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
printf( "%d: GL_REPEAT\n", gTextureWrapType );
break;
case 1:
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
printf( "%d: GL_CLAMP\n", gTextureWrapType );
break;
}
}
}