Unter https://de.wikipedia.org/wiki/Windows_Bitmap findest Du die Beschreibung des Bitmap-Headers. So ist es z. B. möglich durch einen Zugriff auf die Adressen 0x12 und 0x16 die Informationen über Breite und Höhe des Bildes herauszulesen und diese Informationen in den Mapping-Algorithmus einfließen zu lassen. Zum Experimentieren empfehle ich, sich verschiedene Bitmaps in einem Hex-Editor anzeigen zu lassen. Eine Texture-Loader Funktion könnte folgendermaßen aussehen:
GLuint create_texture(char * path){
// Variable für die Anzahl an Farbanteilen (hier 3, da RGB).
int colors = 3;
// Adressen zum Auslesen der Header.
int a_img_width = 0x12,
a_img_height = 0x16;
// Größe des Bilds (= width * height * colors bytes)
int img_size;
// Buffer für 54-Byte Header von Bitmaps
char headers[54];
// Länge und Breite des eingelesenen Bildes.
int width,
height;
// Buffer für das Bildarray.
char* img_data;
// File öffnen ...
FILE* file = fopen(path, "rb");
// ... und prüfen, ob es funktioniert hat.
if (!file) {
printf("Die Datei %s konnte nicht gefunden werden!\n", path);
return EXIT_FAILURE;
}
// Header auslesen.
fread(headers, 1, 54, file);
// Größe aus width, height und Anzahl der Farbkomponenten berechnen (width * height * colors).
img_size = *(int*)&(headers[a_img_height]) * *(int*)&(headers[a_img_width]) * colors;
// Buffer für das Bildarray allokieren.
img_data = new char[img_size];
// Daten aus dem File lesen und im Bildspeicher img_data speichern.
fread(img_data, 1, img_size, file);
// File schließen.
fclose(file);
// OpenGL-Texturvariable
GLuint texture;
// Textur abspeichern ...
glGenTextures(1, &texture);
// ... und um Return-Willen an OpenGL binden.
glBindTexture(GL_TEXTURE_2D, texture);
// Bild an OpenGL übergeben.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, *(int*)&(headers[a_img_width]), *(int*)&(headers[a_img_height]), 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, img_data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
return texture;
}
Beachte, dass diese Funktion den Import
#include <GL/freeglut.h>
benötigt.
und als was wird das intern gespeichert?
Als GLuint.