0 Daumen
350 Aufrufe

Wir programmieren derzeit ein Spiel in C++ und nutzen OpenGL für die GUI. Wie kann man eine Bitmap-Textur von der Festplatte einlesen und als was wird das intern gespeichert?

Avatar von

1 Antwort

+1 Daumen
 
Beste Antwort

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.

Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community