LiFeng_Texture.cpp
上传用户:dfjhuyju
上传日期:2013-03-13
资源大小:11035k
文件大小:6k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "LiFeng_Texture.h"
  3. #include "LiFeng.h"
  4. LiFeng_Texture::LiFeng_Texture()
  5. {
  6. }
  7. LiFeng_Texture::~LiFeng_Texture()
  8. {
  9. }
  10. GLuint LiFeng_Texture::TextureLoad(char      *filename, 
  11.             GLboolean alpha,     
  12.             GLenum    minfilter,
  13.  GLenum    magfilter, 
  14. GLenum    wrap)    
  15.     {
  16.     int         i;               /* Looping var */
  17.     BITMAPINFO *info;           /* Bitmap information */
  18.     GLubyte *bits;           /* Bitmap RGB pixels */
  19.     GLubyte     *ptr;            /* Pointer into bit buffer */
  20.     GLubyte *rgba;           /* RGBA pixel buffer */
  21.     GLubyte *rgbaptr;        /* Pointer into RGBA buffer */
  22.     GLubyte     temp;            /* Swapping variable */
  23.     GLenum      type;            /* Texture type */
  24.     GLuint      texture;         /* Texture object */
  25.     /* Try loading the bitmap file... */
  26.     bits = LoadDIBitmap(filename, &info);
  27.     if (bits == (GLubyte *)0)
  28.         return (0);
  29.     for (i = info->bmiHeader.biWidth * info->bmiHeader.biHeight, ptr = bits;
  30.          i > 0;
  31.  i --, ptr += 3)
  32.         {
  33. /* Swap red and blue */
  34. temp   = ptr[0];
  35. ptr[0] = ptr[2];
  36. ptr[2] = temp;
  37. }
  38.     if (info->bmiHeader.biHeight == 1)
  39.         type = GL_TEXTURE_1D;
  40.     else
  41.         type = GL_TEXTURE_2D;
  42.     /* Create and bind a texture object */
  43.     glGenTextures(1, &texture);
  44.     glBindTexture(type, texture);
  45.     /* Set texture parameters */
  46.     glTexParameteri(type, GL_TEXTURE_MAG_FILTER, magfilter);
  47.     glTexParameteri(type, GL_TEXTURE_MIN_FILTER, minfilter);
  48.     glTexParameteri(type, GL_TEXTURE_WRAP_S, wrap);
  49.     glTexParameteri(type, GL_TEXTURE_WRAP_T, wrap);
  50.     glTexEnvi(type, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  51.     if (alpha)
  52.         {
  53. /* Create and use an RGBA image... */
  54.         rgba =new GLubyte [info->bmiHeader.biWidth * info->bmiHeader.biHeight * 4];
  55.         for (i = info->bmiHeader.biWidth * info->bmiHeader.biHeight,
  56.          rgbaptr = rgba, ptr = bits;
  57.              i > 0;
  58.      i --, rgbaptr += 4, ptr += 3)
  59.     {
  60.             rgbaptr[0] = ptr[0];
  61.             rgbaptr[1] = ptr[1];
  62.             rgbaptr[2] = ptr[2];
  63.             rgbaptr[3] = (ptr[0] + ptr[1] + ptr[2]) / 3;
  64.     }
  65.         /*
  66.          * Set texture image; if the minification filter uses mip-mapping
  67.          * then use gluBuild2D/1DMipmaps() to load the texture...
  68.          */
  69.         if (minfilter == GL_LINEAR || minfilter == GL_NEAREST)
  70.             glTexImage2D(type, 0, 4, info->bmiHeader.biWidth,
  71.                          info->bmiHeader.biHeight, 0, GL_RGBA,
  72.                          GL_UNSIGNED_BYTE, rgba);
  73.         else if (type == GL_TEXTURE_1D)
  74.             gluBuild1DMipmaps(type, 4, info->bmiHeader.biWidth,
  75.                               GL_RGBA, GL_UNSIGNED_BYTE, rgba);
  76.         else  
  77.             gluBuild2DMipmaps(type, 3, info->bmiHeader.biWidth,
  78.                               info->bmiHeader.biHeight, GL_RGBA,
  79.                               GL_UNSIGNED_BYTE, rgba);
  80.         /* Free the RGBA buffer */
  81. free(rgba);
  82. }
  83.     else
  84.         {
  85.         /*
  86.          * Set texture image; if the minification filter uses mip-mapping
  87.          * then use gluBuild2D/1DMipmaps() to load the texture...
  88.          */
  89.         if (minfilter == GL_LINEAR || minfilter == GL_NEAREST)
  90.             glTexImage2D(type, 0, 3, info->bmiHeader.biWidth,
  91.                          info->bmiHeader.biHeight, 0, GL_RGB,
  92.                          GL_UNSIGNED_BYTE, bits);
  93.         else if (type == GL_TEXTURE_1D)
  94.             gluBuild1DMipmaps(type, 3, info->bmiHeader.biWidth,
  95.                               GL_RGB, GL_UNSIGNED_BYTE, bits);
  96.         else  
  97.             gluBuild2DMipmaps(type, 3, info->bmiHeader.biWidth,
  98.                               info->bmiHeader.biHeight, GL_RGB,
  99.                               GL_UNSIGNED_BYTE, bits);
  100.         }
  101.     /* Free the bitmap and return... */
  102.     free(info);
  103.     free(bits);
  104.     return (texture);
  105.     }
  106. GLubyte *LiFeng_Texture::LoadDIBitmap(const char *filename,BITMAPINFO **info)
  107. {
  108. FILE             *fp;          /* Open file pointer */
  109.     GLubyte          *bits;        /* Bitmap pixel bits */
  110.     int              bitsize;      /* Size of bitmap */
  111.     int              infosize;     /* Size of header information */
  112.     BITMAPFILEHEADER header;       /* File header */
  113.     /* Try opening the file; use "rb" mode to read this *binary* file. */
  114.     if ((fp = fopen(filename, "rb")) == NULL)
  115.         return (NULL);
  116.     /* Read the file header and any following bitmap information... */
  117.     if (fread(&header, sizeof(BITMAPFILEHEADER), 1, fp) < 1)
  118.         {
  119.         /* Couldn't read the file header - return NULL... */
  120. fclose(fp);
  121.         return (NULL);
  122.         }
  123.     if (header.bfType != 'MB') /* Check for BM reversed... */
  124.         {
  125.         /* Not a bitmap file - return NULL... */
  126.         fclose(fp);
  127.         return (NULL);
  128.         }
  129.     infosize = header.bfOffBits - sizeof(BITMAPFILEHEADER);
  130.     if ((*info = (BITMAPINFO *)malloc(infosize)) == NULL)
  131.         {
  132.         /* Couldn't allocate memory for bitmap info - return NULL... */
  133.         fclose(fp);
  134.         return (NULL);
  135.         }
  136.     if (fread(*info, 1, infosize, fp) < infosize)
  137.         {
  138.         /* Couldn't read the bitmap header - return NULL... */
  139.         free(*info);
  140.         fclose(fp);
  141.         return (NULL);
  142.         }
  143.     /* Now that we have all the header info read in, allocate memory for *
  144.      * the bitmap and read *it* in...                                    */
  145.     if ((bitsize = (*info)->bmiHeader.biSizeImage) == 0)
  146.         bitsize = ((*info)->bmiHeader.biWidth *
  147.                    (*info)->bmiHeader.biBitCount + 7) / 8 *
  148.               abs((*info)->bmiHeader.biHeight);
  149.     if ((bits = new GLubyte[bitsize]) == NULL)
  150.         {
  151.         /* Couldn't allocate memory - return NULL! */
  152.         free(*info);
  153.         fclose(fp);
  154.         return (NULL);
  155.         }
  156.     if (fread(bits, 1, bitsize, fp) < bitsize)
  157.         {
  158.         /* Couldn't read bitmap - free memory and return NULL! */
  159.         free(*info);
  160.         delete(bits);
  161.         fclose(fp);
  162.         return (NULL);
  163.         }
  164.     /* OK, everything went fine - return the allocated bitmap... */
  165.     fclose(fp);
  166.     return (bits);
  167. }
  168.