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\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;
}
}
}