Tutorial

Dot3-Bumpmapping unter Blitz3D
mit Hilfe der BSM_Renderer Funktionsbibliothek

 

Hallo zusammen. Dieses Tutorial soll ein paar Tipps geben, wie man Dot3-Bumpmapping mit Blitz3D richtig anwendet. Für dieses Tutorial wird der BSM_Renderer benötigt. Download unter www.selfmadegames.de . Die BSM-Bibliothek dient dabei lediglich zur Unterstützung.

Auch auf die Gefahr hin, erfahrene Programmierer, zu einem Stirnrunzeln zu veranlassen, kommt jetzt erstmal eine kurze Einführung.

Dot3-Mapping basiert auf der Verwendung spezieller Texturen. Hier ein Beispiel einer normalen Textur und der daraus erstellten Dot3-Bumpmap.

Erstellt werden können diese Texturen mit Tools wie z.B. dem Nvidia-Plugin für Photoshop. (siehe Screenshot)
Dieses Tool gibts auch als eigenständiges Programm. Von ATI gibts ebenfalls Programme, um solche Texturen zu erstellen.



Geladen wird diese Textur wie folgt.

bumpmap = LoadTexture ( "bumptexture.jpg" )

TextureBlend bumpmap , 4


Ist die Textur in Blitz3D geladen und als Bumpmap deklariert, wird für jedes Pixel errechnet, ob dieses Pixel beleuchtet wird oder nicht. Dies geschieht anhand seiner Farbe, in Verbindung mit der Farbe des Untergrunds. Das kann die Farbe des Objekts sein auf das die Textur gelegt wurde oder eine andere Textur.

Hier liegt die Bumpmap auf einer weissen Oberfläche.
Und hier liegt die Bumpmap auf einer violetten Oberfläche.


Man erkennt sehr gut wie sich die Richtung der Beleuchtung anhand der Farbe des Untergrunds ändert. Um diesen Effekt gezielt zu steuern, dafür wird die BSM-Bibliothek verwendet.

Dot3-Bumpmapping hat ein entscheidendes Manko. Jegliche Farbgebung des Objekts, auch die Beleuchtung durch Lichtquellen wird auf die Bumpmap verechnet und dadurch unwirksam. Wie man diese Funktionalität wiederherstellt, soll dieses Tutorial erklären.


Am Anfang war Dunkelheit. Und Blitz3D sprach " Es werde Licht". In diesem Fall ein weisses direktionales Licht, in Verbindung mit einer blaugrauen, ambienten Beleuchtung.

light = CreateLight ( )

camera = CreateCamera ( )

Jetzt wo wir was sehen können erstellen wir ein beliebiges Objekt, und kopieren es gleich noch.

obj = CreateSphere( 32)

obj2= CopyEntity (obj )

 

Das Original-Objekt texturieren wird ganz normal mit einer Farbtextur.
TextureBlend 2

colormap = LoadTexture ("colortexture.jpg" )
TextureBlend colormap , 2
TextureEntity obj,colormap,0,0

 


An dieser Stelle kommt die BSM_Bibliothek zum Einsatz.
Zuerst die Initialisierung.

BSM_Init ("norm.tga" )
BSM_Set_MainCamera (camera)

norm.tga ist dabei eine spezielle Textur, die von der BSM-Blibliothek benötigt wird. Sie liegt der der Bibliothek bei.
Der Objekt-Kopie übergeben wir als erstes eine BSM-Map, als Layer 0 , stellen sicher, dass sie nicht mit dem Objekt verrechnet wird und vergeben die Lichtquelle an die BSM_Map

bsm_map=BSM_Create_Cmap (obj2,1,0 )
TextureBlend bsm_map ,1
BSM_Set_Light (cmap,light,1,1,1)

Der Objekt-Kopie übergeben wir als nächstes eine Dot3-Textur als Layer 1.

bumpmap = LoadTexture ( "bumptexture.jpg" )
TextureBlend bumpmap , 4
Entitytexture obj2,bumpmap,0,1

Jetzt übergeben wir der Objekt-Kopie noch die normale Textur, die wir schon dem Original-Objekt vergeben haben, als Layer 2


EntityTexture obj2,colormap,0,2

Bei diesem Objekt ist keine weitere Farbgebung bzw. Beleuchtung durch Blitz3D-Lichtquellen möglich. Dies erledigen wir mit dem Original-Objekt.

Das Kopie-Objekt wird nun auf additives Blending geschaltet und noch um ca. 0,5% vergrössert, um Artefakt-bildung zu vermeiden.


EntityBlend obj2,3
ScaleEntity
obj2,1.005 ,1.005 ,1.005


ScaleEntity funktioniert dafür nur bei einfachen konvexen Objekte. Bei komplizierteren Objekten wird die Funktion BlowMesh() aus dem englischen Codearchiv empfohlen, da diese die Vertices des Meshes entlang ihrer Normalen verschiebt.

Jetzt nur noch beide Objekte übereinander legen. Voila ein texturiertes, mit Bumpmapping versehenes Objekt.

Voll beleuchtbar und einfärbbar. Hier mit gelber Lichtquelle und rotem ambienten Licht.

In der Hauptschleife wird dann

BSM_Update_All ( )

noch vor Renderworld () eingesetzt. Der BSM_Renderer sorgt dann für die notwendige Aktualisierung der BSM_Map, damit die Beleuchtungsrichtung der Bumpmap korrekt ist. Das funktioniert auch mit mehreren Lichtquellen. Genauere Infos stehen in der Anleitung der BSM Bibliothek.

Ich hoffe ich hab das jetzt, leicht verständlich rüber gebracht. Ansonsten seht euch auch mal die Demos im BSM_Renderer-Archiv an.

 

 

Bis demnächst

Euer Shodan