Dot3 Bumpmapping
Übersicht

![]() |
VertexBetreff: Dot3 Bumpmapping |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: ![]() 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: ![]() (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: ![]() (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: ![]() Blitz berechnet daraus folgende Bumpmap: ![]() Das ganze mit einer Textur als Lightmap: ![]() Ohne Bumpmap sieht es so aus: ![]() 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: ![]() ![]() (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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
yea, bin gerade am lesen, aber bis hier hin schon top ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sehr schön sehr schön ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
echt nicht schlecht...hammer! ich habs eben mal probiert...einfach geil! danke! ![]() |
||
![]() |
Wild-Storm |
![]() Antworten mit Zitat ![]() |
---|---|---|
sehr sehr geil vertex.
hatte zwar schon mal nen code gefunden, aber nie nen peil wie das funzt ![]() |
||
Visit http://www.next-dimension.org
------------------------------------------------- Freeware Modelle, Texturen & Sounds: http://www.blitzforum.de/forum...hp?t=12875 |
![]() |
Wild-Storm |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sehr schön! Endlich mal ein Tutorial, das BumpMapping im zusammenhang mit Blitz3D richtig erklärt. ![]() |
||
Davok`xarden |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
welche bilder? | ||
Visit http://www.next-dimension.org
------------------------------------------------- Freeware Modelle, Texturen & Sounds: http://www.blitzforum.de/forum...hp?t=12875 |
Skulk |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
z.b. dieses:
![]() |
||
War doesn't determine who's right,
war determines who's left... |
![]() |
Wild-Storm |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Visit http://www.next-dimension.org
------------------------------------------------- Freeware Modelle, Texturen & Sounds: http://www.blitzforum.de/forum...hp?t=12875 |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
habe sie auf meiner Festplatte gefunden, hoffe Vertex hat nichts dagegen, das ich sie hier poste
Textur: ![]() Normalmap: ![]() |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
Davok`xarden |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Texture und Normalmap sind eh nicht von mir...
![]() ![]() Sind auch ganz gute Beispiele wo man etwas sieht. mfg olli |
||
![]() |
Arrangemonk |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
... 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group