Цитата:
//-----------------------------------------------------------------------------
// Name: ogl_color_key.cpp
// Author: Kevin Harris
// Last Modified: 02/01/05
// Description: This sample demonstrates how to use a color key to create a
// RGBA texture image that supports alpha transparency from a
// simpler RGB image like a .bmp bitmap.
//
// Control Keys: Left Mouse Button - Spin the view
// F1 - Toggle color key transparency
//-----------------------------------------------------------------------------
void loadTexture( void )
{
AUX_RGBImageRec *pImage_RGB = auxDIBImageLoad( ".\\door.bmp" );
unsigned char *pImage_RGBA = NULL;
if( pImage_RGB != NULL )
{
int imageSize_RGB = pImage_RGB->sizeX * pImage_RGB->sizeY * 3;
int imageSize_RGBA = pImage_RGB->sizeX * pImage_RGB->sizeY * 4;
// allocate buffer for a RGBA image
pImage_RGBA = new unsigned char[imageSize_RGBA];
//
// Loop through the original RGB image buffer and copy it over to the
// new RGBA image buffer setting each pixel that matches the key color
// transparent.
//
int i, j;
for( i = 0, j = 0; i < imageSize_RGB; i += 3, j += 4 )
{
// Does the current pixel match the selected color key?
if( pImage_RGB->data[i] == g_keyColor[0] &&
pImage_RGB->data[i+1] == g_keyColor[1] &&
pImage_RGB->data[i+2] == g_keyColor[2] )
{
pImage_RGBA[j+3] = 0; // If so, set alpha to fully transparent.
}
else
{
pImage_RGBA[j+3] = 255; // If not, set alpha to fully opaque.
}
pImage_RGBA[j] = pImage_RGB->data[i];
pImage_RGBA[j+1] = pImage_RGB->data[i+1];
pImage_RGBA[j+2] = pImage_RGB->data[i+2];
}
glGenTextures( 1, &g_textureID );
glBindTexture( GL_TEXTURE_2D, g_textureID );
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// Don't forget to use GL_RGBA for our new image data... we support Alpha transparency now!
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, pImage_RGB->sizeX, pImage_RGB->sizeY, 0,
GL_RGBA, GL_UNSIGNED_BYTE, pImage_RGBA );
}
if( pImage_RGB )
{
if( pImage_RGB->data )
free( pImage_RGB->data );
free( pImage_RGB );
}
if( pImage_RGBA )
delete [] pImage_RGBA;
}
http://www.codesampler.com