Normal-Mapping unter MiniB3D?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Midimaster

Betreff: Normal-Mapping unter MiniB3D?

BeitragFr, Jan 27, 2012 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich experimentiere gerade mit den Möglichkeiten von Texturen herum. Dabei scheint mir das NOrmal-Mapping total spannend zu sein. So wie ich es verstanden habe, reagiert dann die "ebene" Fläche auf einfallendes Licht so, als hätte sie viele kleine 3D-Strukturen.

Unter B3D soll das wegen DiectX-7 gar nicht funktionieren. Deshalb habe ich es unter BMax/MiniB3D versucht. doch der Effekt bleibt aus. Was mache ich hier falsch?

BlitzMax: [AUSKLAPPEN]
SuperStrict
Import "../minib3d/minib3dsf/minib3d.bmx"

Graphics3d 1024,768,0,2

Global Cube:Tmesh=CreateCube()
Global Textur:TTexture = LoadTexture("normal.png",1)
TextureBlend Textur,4
EntityTexture Cube,Textur

Global licht:TLight=createlight(1)
moveentity licht,-15,4,-4
Global Camera:TCamera = CreateCamera()
PositionEntity camera, 0,1,-5
TurnEntity Camera,0,0,0

Repeat
turnentity Cube,0.1,0.14,0.15
Renderworld()
Flip 1
Until KeyHit(KEY_ESCAPE)


Textur dazu:
user posted image
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

BladeRunner

Moderator

BeitragFr, Jan 27, 2012 13:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum einen funktioniert das sehr wohl unter DX7/B3d, es gibt dazu funktionierende Codes hier im Portal. Vertex hat mal ein Tut erstellt.
Zum anderen, auch wenn ich damit nicht firm bin:
Zu einer Normalmap gehört auch noch eine normale Textur dazu, denn erst durch das Zusammenspiel aus Texturdaten und Normalmap entsteht ein wirklich guter "Reliefeffekt".
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Xeres

Moderator

BeitragFr, Jan 27, 2012 13:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
Unter B3D soll das wegen DiectX-7 gar nicht funktionieren.
Aber wie das geht! [B3D] Farbiges Normalmapping / Bumpmapping
Vielleicht kannst du dir was von NightPhoenix' Code für MiniB3D abgucken, Stichword UpdateDot3Normals.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragFr, Jan 27, 2012 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau aus dem Beitrag von NightPhoenic hatte ich ja die Idee. Aber auf meinem Bildschirm "tut sich nix". Vielliecht liegt es an der Grafikkarte?

Aber grundsätzlich müßte doch eine ebene Fläche dadurch variabel aufs Licht reagieren. Wieso sollte dazu eine zweite Textur nötig sein? Ich hatte erwartet, dass die Grautöne je nach Richtung des Lichteinfalls heller und dunkler werden.

NightPhoenix Beitrag passt laufend die Normals an. Das ist doch ein Trick um eine Art Bumpmapping unter B3D zu simulieren, oder? Eigentlich soll es ja weniger Rechenaufwand sein und auf Low-Polys zum Eindruck von Highpoly-Meshes führen, oder?

Unter dem Stichwort "UpdateDot3Normals" findest sich in der suche leider gar nix....


seltsam, seltsam...
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

BladeRunner

Moderator

BeitragFr, Jan 27, 2012 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar geht es auch ohne Textur, aber der Effekt wird dann nur sehr dürftig zu sehen sein.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Midimaster

BeitragFr, Jan 27, 2012 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, aber müssten während einer Drehung des Cubes nicht wenigstens Helligkeitsveränderungen auftreten? Mit dem Code wie er jetzt ist, wird die Fläche gleichmäßig hell/dunkel....

Irgendetwas mache ich falsch...
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

BladeRunner

Moderator

BeitragFr, Jan 27, 2012 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, du wirst auch ohne den Teil der die Normalen berechnet niemals einen Effekt sehen können. DX9 bietet zwar die Möglichkeit Pixelshader zu nutzen, aber auch die müsstest Du erstmal integrieren.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Xeres

Moderator

BeitragFr, Jan 27, 2012 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal NightPhoenix' Funktion angepasst und die Textur in Grauwerte umgewandelt, damit man einen Mittelwert hat, bei dem man Licht und Schatten erkennen kann.

BlitzMax: [AUSKLAPPEN]
SuperStrict
Import "Includes/minib3d.bmx"

Graphics3d(800, 600, 0, 2)

Global Cube:Tmesh = CreateCube()
EntityFX Cube, 2
Global Tex:TTexture = LoadTexture("Tex.png", 1)
Global NormalTex:TTexture = LoadTexture("normal.png", 1)
TextureBlend NormalTex, 4
TextureBlend Tex, 2
EntityTexture Cube, NormalTex, 0, 0
EntityTexture Cube, Tex, 0, 1

Global licht:TLight=createlight(1)
moveentity licht,-15,4,-4
Global Camera:TCamera = CreateCamera()
PositionEntity Camera, 0, 1, -4
TurnEntity Camera,0,0,0

Repeat
UpdateDot3Normals(Cube, licht)
turnentity Cube,0.1,0.14,0.15
Renderworld()
Flip 1
Until KeyHit(KEY_ESCAPE)

Function UpdateDot3Normals(Mesh:Tmesh, Light:TLight)
rem
From NightPhoenix
https://www.blitzforum.de/forum/viewtopic.php?t=34666
endrem

Local S:Int, Surface:Tsurface, V:Int, VX:Float, VY:Float, VZ:Float, VNX:Float, VNY:Float, VNZ:Float
Local DotProduct2:Float, DotProduct3:Float ', DotProduct#, VRed, VGreen, VBlue

' get the lightcoords
Local lx:Float = EntityX:Float(Light, 1)
Local ly:Float = EntityY:Float(Light, 1)
Local lz:Float = EntityZ:Float(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, Null
VX# = TFormedX#()
VY# = TFormedY#()
VZ# = TFormedZ#()

' transform vertexnormalcoords into worldnormalcoords
TFormNormal VNX, VNY, VNZ, Mesh, Null
VNX# = TFormedX#()
VNY# = TFormedY#()
VNZ# = TFormedZ#()

' calculate a vector between vertex and light
Local lnx:Float = lx:Float - VX:Float
Local lny:Float = ly:Float - VY:Float
Local lnz:Float = lz:Float - VZ:Float

' normalize this vector
Local Length:Float = Sqr(lnx * lnx + lny * lny + lnz * lnz)
lnx# = lnx#/Length#
lny# = lny#/Length#
lnz# = lnz#/Length#

' calculate the dotproduct between vertexnormal and the vector between light and vertex
Local dotproduct:Float = VNX:Float * lnx:Float + VNY:Float * lny:Float + VNZ:Float * lnz:Float
'dotproduct# = lnx#^2+lny#^2+lnz#^2
DotProduct2#=dotproduct#


' if the light behind the mesh...
If dotproduct# < 0.0 Then DotProduct2# = 0.0


' calculate the new vertexcolor
Local VRed:Float = (lnx:Float * DotProduct2:Float + 1.0) * 127.0 * 1.0 '*1.0/*0.7 ist hier sozusagen "EntityColor" als faktor -> 1.0 = 255
Local VGreen:Float = (lny:Float * DotProduct2:Float + 1.0) * 127.0 * 1.0 '127.0 bei x/y = Bump-Tiefe!
Local VBlue:Float = (-lnz:Float * DotProduct:Float + 1.0) * 127.0 * 0.9 '127.0 bei z ist Ambientlight

vred=vred^1.12-127
vgreen=vgreen^1.12-127
vblue=vblue^1.12-80

' update vertexcolor
VertexColor Surface, V, vred, vgreen, vblue

rem
a=0


__COMMENT17__
LockBuffer TextureBuffer (CM)
rgb=a*$1000000 + r*$10000 + g*$100 + b
WritePixelFast 0,0,rgb,TextureBuffer (CM)


UnlockBuffer TextureBuffer (CM)
endrem



Next
Next
End Function

Der Effekt sieht nicht besonders aus (kann an der Flachen Natur eines Würfels liegen), aber er ist definitiv da.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group