OpenGL第十四节:绘制重复纹理

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 ", 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! " );
    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 ", 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 ", gTextureWrapType );

            break;

        }

    }

}

原文地址:https://www.cnblogs.com/yongfengnice/p/7988665.html