it-swarm.com.de

Wie lade ich ein bmp auf GLUT, um es als Textur zu verwenden?

Ich habe überall nach einer einfachen Lösung gesucht, um meinem OpenGl GLUT-Spiel Moon Lander in c ++ Sprites hinzuzufügen, und es scheint, dass ich BMPs verwenden muss, da sie am einfachsten zu laden und als Texturen in einem Rechteck zu verwenden sind.

Wie genau kann ich die bmp's als Texturen laden?

14
Patricio Jerí

Schauen Sie sich meine einfache c-Implementierungsfunktion an, um die Textur zu laden.

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

Die obige Funktion gibt die Texturdaten zurück. Speichern Sie die Texturdaten in Variablen

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

Jetzt können Sie das Texture mit glBindTexture binden

glBindTexture (GL_TEXTURE_2D, texture);
32
Dinesh Subedi

Checke den TextureLoader (TextureLoader.h + TextureLoader.cpp) von OpenGL_3_2_Utils:

https://github.com/mortennobel/OpenGL_3_2_Utils

Die beiden Dateien hängen nicht von anderen Dateien ab und sollten auch auf jeder Version von OpenGL (und jeder Plattform) nahtlos funktionieren. Eine Beispielanwendung finden Sie im Dateikommentar.

4
Mortennobel

Sie können die Bibliotheken GLAUX und SOIL (Simple OpenGL Image Library) . Verwenden. Es gibt auch andere Bildbibliotheken für OpenGL .

4
XiaJun

Wie lädt man ein bmp auf GLUT, um es als Textur zu verwenden?

Eine andere sehr einfache Lösung wäre die Verwendung der STB-Bibliothek , die sich unter GitHub - nothings/stb befindet.

Alles was benötigt wird, ist eine Quelldatei, die Header-Datei "stb_image.h".

Fügen Sie die Header-Datei ein und aktivieren Sie das Lesen von Bildern, indem Sie die Präprozessor-Definition STB_IMAGE IMPLEMENTATION einstellen: 

#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>

Die Bilddatei kann mit der Funktion stbi_load gelesen werden:

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 ); 

Wenn das Bild in ein Texturobjekt geladen wird, muss GL_UNPACK_ALIGNMENT auf 1, Gesetzt werden, da die Länge einer Zeile einer BMP-Datei auf 4 ausgerichtet ist.
Nach dem Laden des Bildes kann der Speicher von stbi_image_free freigegeben werden: 

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
Rabbid76