Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

OpenGL und FreeBASIC - eine kleine Einführung - Teil 5 - Texturen

von MitgliedEastler_dartSeite 1 von 6

OPEN-GL Tutorial TEIL V - Texture

Einleitung

Sie haben doch bestimmt die vorigen vier Tutorialteile gelesen?
Wir bauen hier auf das dort Geschriebene auf.

Texturieren

Ja, so heißt das. Würde das irgendwie "Bilder aufkleben"
oder in der Art heißen, könnte man ja ahnen, was gemeint ist.

Nein, es wird Texturieren genannt. Auch wenn man fast
jedes x-beliebige Bild aufkleben kann.
Gedacht ist dabei daran, daß man ein Bild z.B. von einer
Holzoberfläche, also ein Bild der Maserung im Holz hat,
und dieses auf einen Quader klebt, sodaß dieser Quader dann
wie ein Balken aussieht.
Und solche Muster, die ein Material immitieren, die heißen
eigentlich "Textures".

Aber egal, heutzutage ist es ja so, daß wenn man kein
Englisch kann, man das Deutsch nicht mehr versteht.
Also reden auch wir übers Texturieren.

Es geht also darum, irgendwelche Objekte aus Dreiecken Vierecken
oder ähnlichem zu erstellen, und auf deren Oberfläche ein Bild
auflegen, sodaß diese Oberfläche ein etwas naturgetreueres Aussehen
erhält.

wie läuft das?

Am Anfang hat man eine Datei, in der das Bild drin steht.
Die liegt auf der Festplatte.
Am Ende muß dieses Bild auf der Grafikkarte stehen und
OpenGL muß dieses dann auf ein Objekt "kleben".

Wenn man jetzt OpenGL sagen könnte "ließ das Bild aus der
Datei ein", dann bräuchten wir hier kein FreeBasic, dann
würden wir alles unter OpenGL machen können.
OpenGL sitzt aber auf der Grafikkarte, und hat keinen blassen
Schimmer von Festplatten, USB-Sticks und anderer Peripherie.
An der Tastaturabfrage in unserem Beispiel können wir ja
erkennen, auch die Tastatur ist OpenGL unbekannt,
Eingaben des Anwenders muß FreeBasic überwachen.

Das Einzigste, was OpenGL außer der Grafikkarte noch kennt,
ist der Arbeitsspeicher des Computers, also der RAM.

Und damit ist klar, wie es laufen muß. FreeBasic kopiert
die Bilddatei in den Arbeitsspeicher, sagt OpenGL,
wo und in welcher Form das Bild im RAM steht, OpenGL
kopiert das dann auf die Grafikkarte und kann es damit
zum Texturieren verwenden.

Und wenn das jetzt jeweils einheitlich wäre, dann würde
ich Euch hier die zwei Befehle zeigen und wir hätten
Texturen auf der Grafikkarte.

Aber nein, frei nach Murphy, der Teufel steckt dann
im Detail.
Auf der Festplatte, im RAM und auf dem Grafikspeicher
gibt es jeweils verschiedene Arten, wie Bilder dort
abgespeichert sein können, und das ist das verwirrende
dabei:
Auf der Festplatte gibt es z.B. BMP-Dateien, TIFF-Dateien,
TGA-Dateien, diese Liste könnte ellenlang fortgeführt
werden.

Da FreeBasic unser Bild von der Festplatte in den RAM
kopiert, haben wir hier aus den vielen Möglichkeiten
nur diejenigen, die FreeBasic verwendet. Und das sind
im Grunde Bload-DIM-RAM-Bilder und BLOAD-ImageCreate-Bilder.

Auf der Grafikarte ist es recht einheitlich, Bilder,
welche OpenGL auf den Grafikspeicher holt, unterscheiden
sich nur durch die Farbtiefen und den Alphakanal,
einen grundsätzlichen Unterschied, wie das im Grafik-RAM
steht hab ich nicht gefunden.

So, und wenn ich nun auf jede Möglichkeit eingehen wollte,
wäre das Tutorial ellenlang und keiner würde durchblicken.

Also fange ich an, einzukreisen:

Bilder auf der Festplatte

Festplatte - wie ist das mit den vielen verschiedenen
Bildformaten? Wäre ja schön, wenn wir alle beherrschen würden.
Aber im Grunde üben wir hier ja nur. Somit würde uns zum
Ausprobieren ja ein einziges Format reichen.
Also nehm ich als Quelle von der Festplatte das einfachste
Format, die Bitmap-Datei (*.bmp). Dafür hat FreeBasic schon
ein paar Hilfsmittel drin, somit ist das nicht zuuu kompliziert.
Das Einzigste, was (noch?) nicht geht, sind komprimierte
Bitmap-Bilder. In unserem Beispiel werden wir nur unkomprimierte
Bitmap-Dateien verwenden können, die aber in allen verfügbaren
Farbtiefen.
Da Bitmap-Dateien recht groß sind, gibt es noch einen
Zusatztyp dazu, mit sogenannter RLE-Kompression.
Viele Bildbearbeitungsprogramme beherrschen dies, damit
erzeugt man wesentlich kleinere Dateien, als mit den
unkomprimierten Versionen.
Aber genau diese RLE-komprimierten Dateien können wir mit
FreeBasic's interer BLOAD-Routine NICHT einfach so
einlesen, deshalb gehe ich hier auch nicht näher darauf ein.
Merken Sie sich bitte, wenn Sie die Texturebilder selber
erstellen/Malen/Zeichnen, dann bitte als Bitmap OHNE
Komprimierung speichern.


Das Bild dann im Arbeitsspeicher

Arbeitsspeicher - wie sieht es damit aus?

Im Arbeitsspeicher kann man die Bilder auf beliebige
Arten abspeichern, die Möglichkeiten sind unbegrenzt.
Jedoch nützen uns nur die etwas, die wir Erstens
bearbeiten und Zweitens an OpenGL übergeben können.

Durch ettliche Versuche und Rumprobieren hab ich einen
Weg gefunden, der "sehr nah" an Freebasic liegt.
Da FreeBasic mittlerweile Ramspeicherreservierungen
am liebsten per ImageCreate durchführt, im (alten)
Beispiel, für OpenGL-Texturen jedoch noch per
DIM der Speicher reserviert wird, hatte ich nicht
sofort eine Lösung parat.
Aber soweit ich das bei mir testen konnte, gibts
einen Weg über ImageCreate.
Jedoch, wie auch im Beispiel in der "alten" Version
bleibt es nicht aus, manuell noch Farben zu vertauschen.

Also werden wir im Arbeitsspeicher per ImageCreate
den Bereich reservieren und per BLOAD das Bild
dort rein schaufeln.
Eine einzige Art für alles, das vereinfacht ungemein.

Bilder auf der Grafikkarte

Hier liegt der Unterschied im Grunde nur in der Farbtiefe,
also wieviel verschiedene Farben die Grafikkarte verwenden soll.
Klar, je mehr Farben, desto detailgenauer die Anzeige.

Bis vor einiger Zeit galt noch die Faustregel,
"geringere Farbtiefe = schneller Programmablauf".
Jedoch hat die moderne Technik diesen Umstand umgedreht.
Moderne Grafikkartenchips sind mittlerweile mit 32-Bit Farbtiefe
(=höchste Stufe) schneller, als mit geringeren Farbtiefen.
Und damit stehen wir wieder mal grübelnd da.

--Wenn unser Programm auf einer älteren Karte laufen wird,
dann sollte die Farbtiefe reduziert werden, dann wird das Ganze
schneller und auch, der bei älteren Karten kleine Speicher der
Karte ist nicht so schnell voll.
--Wenn mein Programm aber auf einer neueren Karte laufen wird,
dann sollte ich die Logik umdrehen, 32-Bit-Auflösung für schnelleren
Ablauf, Grafikspeicher ist in dem Fall ja bestimmt ausreichend
vorhanden.

Dabei gilt es auch zu bedenken, ein Programm, welches intensiv
OpenGL einsetzt, hat auf älteren Karten von vornherein verloren.
Auch wenn mit Farbtiefenreduzierung etwas an Leistung gewonnen
werden kann, bei großen texturierten Flächen, unter Drehung der
texturierten Objekte, stottert der Ablauf trotzdem.
Also sollten Sie auch die Belastung der von Ihnen programmierten
OpenGL-Funktionen einschätzen, sodaß Sie ggf. bereits damit erkennen,
"für alte Karten ist das nix -
-ich geb das Programm ab OpenGL-Version 1.3 frei"

(Versionsnummer beispielhaft ohne tieferen Sinn)

Aufgrund dieser Gedanken wird unsere Routine für die Übergabe
an OpenGL sich nach der Bittiefe des geöffneten OpenGL-Fensters
richten, und das sind genau zwei Möglichkeiten. 16-bit Farbtiefe
oder 32-bit Farbtiefe auf der Grafikkarte.

Summa Sumarum

Es erwarten Sie hier drei verschiedene Kapitel:


Im ersten Kapitel erst mal so einfach, wie es nur geht:
Hier werden wir erst mal nur mit unkomprimierten Bitmapdateien
als Quelle arbeiten.
Im Arbeitsspeicher legen wir diese in ImageCreate-Bereiche
mit 32-bit Farbtiefe ab.
Auf der Grafikkarte wird je nach der Farbtiefe des OpenGL-Fensters
mit 16 oder 32-Bit Tiefe das Bild gespeichert.
ab ins erste Kapitel (Seite 2)

Im zweiten Kapitel bauen wir das Listing aus dem ersten
so aus, daß es für unkomprimierte Bitmapdateien voll
verwendbar ist. Viele der eventuell auftretenden Fehler werden
abgefangen, der darin entstehenden Function brauchen wir
nur einen Dateinamen zu übergeben, den Rest macht die Function.
ab ins zweite Kapitel (Seite3)

Im dritten und letzten Kapitel holen wir uns Hife von der
Library FreeImage, um die Dateien von der Festplatte in
den Arbeitsspeicher zu kopieren.
Und damit sprengen wir die Einschränkung der beiden Kapitel
zuvor, nur mit Bitmap-Dateien arbeiten zu können.
Durch die FreeImage-Library können z.B. Png oder Jpg Dateien
ebenfalls verwendet werden.
ab ins dritte Kapitel (Seite 5)

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  6  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 28.09.2008 von MitgliedEastler_dart angelegt.
  • Die aktuellste Version wurde am 30.09.2008 von MitgliedEastler_dart gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen