Dot3 Bumpmapping

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Vertex

Betreff: Dot3 Bumpmapping

BeitragMo, Nov 22, 2004 0:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich mich heute mal intensiv mit Bumpmapping auseinander gesetzt habe, schreibe ich mal ein kleines Tutorial für Blitz...

Ersteinmal wie Dot3 Bumpmapping funktioniert, steht hier:
http://www.3dconcept.ch/artikel/bump/4.htm
Man hat also eine Normalmap die für jeden Texel einen eigenen Vektor bereitstellt. Aus diesem Vektor und dem Vektor zwischen Licht und Texel wird das Punktprodukt gebildet. Dieser Vektor gibt dann an, wie stark der Schatten entfernt ist.

Eine Normalmap kann man auf 2 Wege bekommen.
Man erstellt eine Hightmap mit einem Graphikprogramm und wandelt diese dann in eine Normalmap um. Oder man hat ein High und Lowpolymesh. Es werden dann die Details des Highpolymeshs in die Normalmap übertragen.
Dafür bietet ATI Tools an:
http://www.ati.com/developer/tools.html

Hier mal am Beispiel von der CryTek Polybump Dingsbums:
user posted image
Links 115448 Polygone und rechts nur 848. Sie unterscheiden sich nur ganz wenig in ihren Details(das Specularmapping mal weglassen)

Ja man erhält also soetwas hier dann als Normalmap:
user posted image
(nicht von mir)

Da Blitz für die Berechnung die Vertexfarbe nimmt, muss das Entity per EntityFX im Modus 2 sein. Bei Normalmaps wird jedoch dann die Textur angezeigt, und nicht wie zu erwarten die Vertexfarbe.

Die Normalmap muss als Layer 1, und die eigentliche Textur als Layer 2 agieren. Die Normalmap muss den Blendmodus 4 für Dot3 Bumpmapping und die Textur den Blendmodus 5 für Lightmapping haben(für Fakespecularmapping kann man hier 3 für addiertes Blending angeben).

In der Schleife müssen dann die Farben aller Vertices berechnet werden. Sie ergibt sich daraus, das man das Punktprodukt zwischen den normailiserten Vektor Vertex-Licht und dem Vertexnormal berechnet. Die Koordinaten X, Y und Z des enstehenden Vektors stehen dann für Rot, Grün und Blau der Vertexfarbe. Das geht so:

Vertexkoordinaten heraus finden mit VertexX, VertexY und VertexZ. Diese sind jedoch lokal, wir brauchen aber um den exakten Vektor zu erhalten, die Weltkoordinaten. Dafür gibt es den Befehl TFormPoint. Dieser multipliziert die lokalen Koordinaten des Vertex mit der Modelviewmatrix des Meshs. Das bedeutet einfach, drehe ich das Mesh, drehe ich den Vertex mit, das selbe gilt für Rotation und Skalierung.
Code: [AUSKLAPPEN]
TFormPoint VX#, VY#, VZ#, Mesh, 0
VX# = TFormedX#()
VY# = TFormedY#()
VZ# = TFormedZ#()


Vertexnormalkoordinaten herausfinden mit VertexNX, VertexNY und VertexNZ. Das sind wieder nur die lokalen Normalkoordinaten, ergo wir müssen TFormNormal einsetzen. Berücksichtigt jedoch nur die Rotation des Meshs(Verschiebung und Skalierung wären ja auch schwachsinnig).
Code: [AUSKLAPPEN]
TFormNormal VNX#, VNY#, VNZ#, Mesh, 0
VNX# = TFormedX#()
VNY# = TFormedY#()
VNZ# = TFormedZ#()


Vektor zwischen Vertex und Licht berechnen: (LX, LY und LZ stehen für die Lichtposition)
Code: [AUSKLAPPEN]
LNX# = LX#-VX#
LNY# = LX#-VY#
LNZ# = LX#-VZ#

So der Spaß muss normailisert werden, schließlich sind die Vertexnormalen ja auch normailisert. Normailisieren heißt, die Länge des Vektors muss 1.0 sein. Dazu berechnen wir zuerst die Länge des Vektor über Pythagoras 3D:
Code: [AUSKLAPPEN]
Length# = Sqr#(LNX#^2.0+LNY#^2.0+LNZ#^2.0)

Statts ^2.0 kann man besser auch z. B. LNX#*LNX# schreiben, dürfte die FPU nicht so überlasten.
Ja nun haben wir die Länge und müssen alle Elemente des vektors durch die Teilen:
Code: [AUSKLAPPEN]
LNX# = LNX#/Length#
LNY# = LNY#/Length#
LNZ# = LNZ#/Length#

Und schon hat man den vektor LNX, LNY, LNZ normailisert.

Jetzt muss das Punktprodukt berechnet werden zwischen dem Vertexnormal und unserem Vektor LNX, LNY, LNZ. Hierzu bildet man die Summe aus den Elementprodukten der beiden Vektoren:
Code: [AUSKLAPPEN]
DotProduct# = VNX#*LNX#+VNY#*LNY#+VNZ#*LNZ#


Ist das Licht hinter dem Mesh, so das man es also nicht sehen kann, wäre das Punktprodukt negativ. Das fangen wir ab, und setzen es auf 0.0:
Code: [AUSKLAPPEN]
If DotProduct# < 0.0 Then DotProduct# = 0.0


Multipliziert man das Punktprodukt mit Vektor LNX, LNY, LNZ erhält man den Pubnktproduktvektor der unsere Vertexfarbe ist. Das Punktprodukt sieht so aus:
user posted image
(Bild nicht von mir)
Vector A ist unser LNX, LNY, LNZ Vektor und VectorB unser Vertexnormal. Das rote Ding da ist der Punktproduktvektor. Er steht senkrecht auf dem Vertexnormal. Je größer der Winkel zwischen Licht und Vertexnormal ist, desto größer ist dieser Vektor, und desto stärker wird auch dann der Dot3 Schatten.

Der Punktproduktvektor ist auch schon normalisiert, deswegen kann man jedes Element mit 127.0 multiplizieren um die Vertexfarbe zu erhalten. Damit wir nicht mit negativen Elementen multiplizieren, muss noch 1.0 zu jedem Element hinzu addiert werden, bevor es mit 127.0 multipliziert wird. Element X repräsentiert den Rot-, Element Y den Grün- und Element Z den Blauanteil. Element Z ist immer umgedreht, deswegen muss es mit *(-1)negiert werden.Code: [AUSKLAPPEN]
VRed   = ( LNX#*DotProduct#+1.0)*127.0
VGreen = ( LNY#*DotProduct#+1.0)*127.0
VBlue  = (-LNZ#*DotProduct#+1.0)*127.0


Das Mesh(hier halt ein Sphere) sieht dann mit den Vertexfarben so aus:
user posted image

Blitz berechnet daraus folgende Bumpmap:
user posted image

Das ganze mit einer Textur als Lightmap:
user posted image

Ohne Bumpmap sieht es so aus:
user posted image

Zu sagen bleibt, das mehrere Lights sich in der Farbe addieren.

Hier der komplette Code:
Code: [AUSKLAPPEN]
Graphics3D 640, 480, 32, 2
SetBuffer BackBuffer()
AppTitle "Dot3 Bumpmapping"

Camera = CreateCamera()
PositionEntity Camera, 0, 0, -3

Light = CreateLight(1)

Sphere = CreateSphere(30)                   ; mesh
Normalmap = LoadTexture("Normalmap.png", 1) ; normalmap
Texture = LoadTexture("Texture.png", 1)     ; tetxure
EntityFX Sphere, 2                          ; vertexcolor
EntityTexture Sphere, Normalmap, 0, 0       ; layer 1
EntityTexture Sphere, Texture, 0, 1         ; layer 2
TextureBlend Normalmap, 4                   ; dot3 bumpmapping
TextureBlend Texture, 5                     ; lightmapping

ScaleTexture Texture, 0.2, 0.2              ; dont must be this values
ScaleTexture Normalmap, 0.2, 0.2

While Not KeyDown(1)
   PositionEntity Light,(MouseX()-320)/100.0, (MouseY()-240)/-100.0,-1.5
   TurnEntity Sphere, 0, 0.5, 0
   
   UpdateDot3Normals(Sphere, Light)
   
   RenderWorld
   Flip
Wend

Function UpdateDot3Normals(Mesh, Light)
   Local LX#, LY#, LZ#, LNX#, LNY#, LNZ#
   Local S, Surface, V, VX#, VY#, VZ#, VNX#, VNY#, VNZ#
   Local Length#, DotProduct#, VRed, VGreen, VBlue
   
   ; get the lightcoords
   LX# = EntityX#(Light, 1)
   LY# = EntityY#(Light, 1)
   LZ# = EntityZ#(Light, 1)
   
   For S = 1 To CountSurfaces(Mesh)
      Surface = GetSurface(Mesh, S)
      For V = 0 To CountVertices(Surface)-1
         ; get vertexcoords
         VX# = VertexX#(Surface, V)
         VY# = VertexY#(Surface, V)
         VZ# = VertexZ#(Surface, V)
         
         ; get vertexnormalcoords
         VNX# = VertexNX#(Surface, V)
         VNY# = VertexNY#(Surface, V)
         VNZ# = VertexNZ#(Surface, V)
         
         ; transform vertexcoords into worldcoords
         TFormPoint VX#, VY#, VZ#, Mesh, 0
         VX# = TFormedX#()
         VY# = TFormedY#()
         VZ# = TFormedZ#()
      
         ; transform vertexnormalcoords into worldnormalcoords
         TFormNormal VNX#, VNY#, VNZ#, Mesh, 0
         VNX# = TFormedX#()
         VNY# = TFormedY#()
         VNZ# = TFormedZ#()
         
         ; calculate a vector between vertex and light
         LNX# = LX#-VX#
         LNY# = LY#-VY#
         LNZ# = LZ#-VZ#
         
         ; normalize this vector
         Length# = Sqr#(LNX#^2.0+LNY#^2.0+LNZ#^2.0)
         LNX# = LNX#/Length#
         LNY# = LNY#/Length#
         LNZ# = LNZ#/Length#
         
         ; calculate the dotproduct between vertexnormal and the vector between light and vertex
         DotProduct# = VNX#*LNX#+VNY#*LNY#+VNZ#*LNZ#
         
         
         ; if the light behind the mesh
         If DotProduct# < 0.0 Then DotProduct# = 0.0
         
         ; calculate the new vertexcolor
         VRed   = ( LNX#*DotProduct#+1.0)*127.0
         VGreen = ( LNY#*DotProduct#+1.0)*127.0
         VBlue  = (-LNZ#*DotProduct#+1.0)*127.0
         
         ; update vertexcolor
         VertexColor Surface, V, VRed, VGreen, VBlue
      Next
   Next
End Function


Hier die Textur und die Normalmap:
user posted image
user posted image
(bei google gefunden, also nicht von mir)

Das wars dann auch schon...
mfg olli

Edit:
Übrigens, wer die Entfernung des Lichts mit einbeziehen will, der muss die Entfernung zwischen Licht und Vertex berechnen und dann diese durch LightRange teilen. Der Quotient wird dann zusätzlich mit VRed, VGreen und VBlue multipliziert.
vertex.dreamfall.at | GitHub
 

getlose

BeitragDo, Nov 25, 2004 7:56
Antworten mit Zitat
Benutzer-Profile anzeigen
yea, bin gerade am lesen, aber bis hier hin schon top Exclamation
 

Dreamora

BeitragDo, Nov 25, 2004 9:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr schön sehr schön Smile

Endlich ma eine Erklärung zu einem der grössten ( und wenigst verstandensten ) Mysterien von Blitz3D.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

azureuz

BeitragDi, Nov 30, 2004 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
echt nicht schlecht...hammer! ich habs eben mal probiert...einfach geil! danke! Smile

Wild-Storm

BeitragDi, Nov 30, 2004 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
sehr sehr geil vertex.
hatte zwar schon mal nen code gefunden, aber nie nen peil wie das funzt Wink
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875

Wild-Storm

BeitragMi, Dez 01, 2004 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
sry für doppelpost.
hab grad nochwasrausgefunden und zwar:
wenn man das licht umstellt also z.b. typ 2 oder 3 nimmt, dann funzt das ganze nicht so richtig.
aber man kann beim entityfxmodus 2+1 (also vertexcolor plus leuchtend) benutzen und dann geht das, egal welches licht. ausserdem sieht der effekt fast noch etwas nicer aus (finde ich)


edit:
für leute (wie mich), die kein 3dsmax besitzen (was ja wichtig für das ati tool ist, können sich auch ein nvidia standalone normalmapper holen. hier zu finden: http://developer.nvidia.com/ob..._home.html

edit2:
ne interressante linklist zum thema normalmapping: http://sv3.3dbuzz.com/vbforum/...adid=77037
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875

FreakForFreedom

BeitragDo, Dez 02, 2004 0:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Echt schigg... Respekt auf jeden Fall! *nimmHutab*

Aber ich habe mal eine Frage.. ich habe mir ein Programm namens "Advanced Batch Converter" gesaugt um texturen in .tga umzuwandeln... aber wenn ich eine DOT3.tga textur daraus machen will (mit dem Ati Programm "NormalMapGenerator") werden die Dot3 texturen so verzerrt wie ein kaputter Fernseher oder ich kann sie teil gar nicht einlesen...
Kann das am Ati tool liegen oder an dem Converter Prog? Oder habe ich was übersehen?
Kann mir da bitte jmd helfen?
Thx im vorraus.
Mfg
F.F.F.
"Try and ERROR!"

Wild-Storm

BeitragDo, Dez 02, 2004 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
bei mir funzt des ati teil garnet.
aber der nvidia normalmapper macht texturen, aber generiert beim mesh selber kein u/v koordinaten
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875

Wild-Storm

BeitragMo, Dez 13, 2004 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch ein seeeeehr geiles Tool gefunden!
(Heightmap to Notmalmap converter)
http://www.rosscrooks.pwp.blue...mal_bb.zip (code)
http://www.rosscrooks.pwp.blue...al_exe.zip (exe)
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875
 

Sebe

BeitragDi, Jan 04, 2005 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr schön! Endlich mal ein Tutorial, das BumpMapping im zusammenhang mit Blitz3D richtig erklärt. Very Happy
 

Davok`xarden

BeitragMo, Jul 10, 2006 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider sind die Bilder nicht mehr da könnte die jemand noch mal posten ???

mfg xarden
Gott hat euch alle liebt, aber der Rest denk ihr seid [ZENSIERT

Wild-Storm

BeitragDi, Jul 11, 2006 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
welche bilder?
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875
 

Skulk

BeitragDi, Jul 11, 2006 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
z.b. dieses:
user posted image
War doesn't determine who's right,
war determines who's left...

Wild-Storm

BeitragDi, Jul 11, 2006 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
einfach auf "zitat klicken", dann bekommt ihr folgende links:
http://vertex.art-fx.org/texture.png
http://vertex.art-fx.org/normalmap.png

edit. oh geht nich xD

kA, hab die bilder leider nimmer Sad
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875

skey-z

BeitragDi, Jul 11, 2006 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
habe sie auf meiner Festplatte gefunden, hoffe Vertex hat nichts dagegen, das ich sie hier poste

Textur:
user posted image

Normalmap:
user posted image
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

Davok`xarden

BeitragMi, Jul 12, 2006 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
skey-z hat Folgendes geschrieben:
habe sie auf meiner Festplatte gefunden, hoffe Vertex hat nichts dagegen, das ich sie hier poste


OK, danke
Gott hat euch alle liebt, aber der Rest denk ihr seid [ZENSIERT

Vertex

BeitragMi, Jul 12, 2006 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Texture und Normalmap sind eh nicht von mir...

user posted image
user posted image

Sind auch ganz gute Beispiele wo man etwas sieht.

mfg olli

Arrangemonk

BeitragMi, Jan 03, 2007 6:11
Antworten mit Zitat
Benutzer-Profile anzeigen
eute dot3 sachen haben alle den nachteil, dass sie zwar auf der einen seite funzen, aber sobald man das licht auf die andere seite des meshes bannt, ist der gesamt mesch nurnoch schwarz, da is irgendein fehler bei

klärt mich mal auf (war jez bei diesem code, und bei dotmybot gleich)

mann müsste die achsen abhängig von der kamera definieren, dann wärs auch ingametauglich
ingeneur
 

Dreamora

BeitragMi, Jan 03, 2007 8:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Fehler?

Nein. Aber kein Licht entgegen normalen Richtung -> kein Normalmapping
Und da Hinter der Fläche = Licht in Normalenrichtung, geht das Normalmapping dann natürlich unter.

Das macht so auch Sinn, denn du kannst kein Relief erkennen auf etwas was keine Schatten werfen kann auf die Oberfläche und das ist genau das was passiert, wenn das Licht hinter der Fläche ist.

Normalmapping hat zwar einige sehr relevante Einschränkungen, der Fall hier ist jedoch keiner, denn wenn das passiert, hast du einfach nur Fehler im Leveldesign (für etwas anderes kann man es sowieso nicht wirklich nutzen ausser die "Spieler" haben statische Modelle)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Mr.Keks

BeitragMi, Jan 03, 2007 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
... wenn die beleuchtung halbwegs statisch ist, kann man b3d-normalmapping auch auf animierten meshes anwenden. man muss nämlich nicht zwangsläufig über die vertices einfärben, sondern kann auch eine cubemap nutzen.
MrKeks.net

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group