How to load a bmp on GLUT to use it as a texture?

前端 未结 4 705
被撕碎了的回忆
被撕碎了的回忆 2020-11-28 12:30

I\'ve been searching all around for a simple solution to add sprites to my OpenGl GLUT simple moon lander game in c++ and it appears I must use bmp\'s since they\'re easiest

相关标签:
4条回答
  • 2020-11-28 13:11

    You can use library GLAUX and SOIL(Simple OpenGL Image Library) . There are also other image libriries for OpenGL.

    0 讨论(0)
  • 2020-11-28 13:26

    Look my simple c implementation function to load texture.

    GLuint LoadTexture( const char * filename )
    {
      GLuint texture;
      int width, height;
      unsigned char * data;
    
      FILE * file;
      file = fopen( filename, "rb" );
    
      if ( file == NULL ) return 0;
      width = 1024;
      height = 512;
      data = (unsigned char *)malloc( width * height * 3 );
      //int size = fseek(file,);
      fread( data, width * height * 3, 1, file );
      fclose( file );
    
      for(int i = 0; i < width * height ; ++i)
      {
        int index = i*3;
        unsigned char B,R;
        B = data[index];
        R = data[index+2];
    
        data[index] = R;
        data[index+2] = B;
      }
    
      glGenTextures( 1, &texture );
      glBindTexture( GL_TEXTURE_2D, texture );
      glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE );
      glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );
    
      glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR );
      glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT );
      glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT );
      gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE, data );
      free( data );
    
      return texture;
    }
    

    Above function returns the texture data. Store the texture data in variable

    GLuint texture;
    texture= LoadTexture( "your_image_name.bmp" );
    

    Now you can bind the texture using glBindTexture

    glBindTexture (GL_TEXTURE_2D, texture);
    
    0 讨论(0)
  • 2020-11-28 13:27

    How to load a bmp on GLUT to use it as a texture?

    Another very simple solution would be to use STB library, which can be found at GitHub - nothings/stb.

    All what is needed is one source file, the header file "stb_image.h". It doesn't require to link any library file or to compile any additional source file.

    Include the header file and enable image reading by the setting the preprocessor definition STB_IMAGE IMPLEMENTATION:

    #define STB_IMAGE_IMPLEMENTATION
    #include <stb_image.h>
    

    The image file can be read by the function stbi_load:

    const char *filename = .....; // path and filename
    int         req_channels = 3; // 3 color channels of BMP-file   
    
    int width = 0, height = 0, channels = 0;
    stbi_uc *image = stbi_load( filename, &width, &height, &channels, 3 ); 
    

    When the image is loaded to a texture object, then GL_UNPACK_ALIGNMENT has to be set to 1.
    By default GL_UNPACK_ALIGNMENT is 4, so each line of an image is assumed to be aligned to 4 bytes. The pixels of a BMP-file in common have a size of 3 bytes and are tightly packed, this would cause a misalignment.
    After loading the image, the memory can be freed by stbi_image_free:

    GLuint texture_obj = 0;
    if ( image != nullptr )
    {
        glGenTextures(1, &texture_obj);
        glBindTexture(GL_TEXTURE_2D, texture_obj);
    
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // default
    
        stbi_image_free( image );
    }
    
    0 讨论(0)
  • 2020-11-28 13:31

    Checkout my the TextureLoader (TextureLoader.h + TextureLoader.cpp) from OpenGL_3_2_Utils:

    https://github.com/mortennobel/OpenGL_3_2_Utils

    The two files does not depend on any other files and should also work seamless on any version of OpenGL (and any platform). Example usage can be found in the file comment.

    0 讨论(0)
提交回复
热议问题