OpenB3D/minib3d Normalmapping

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

West

Betreff: OpenB3D/minib3d Normalmapping

BeitragFr, Apr 03, 2015 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo werte Blitzler Smile

Für mein Spiel möchte ich gerne Normalmaps nutzen. Dafür nutze ich die OpenB3D-Lib und den TextureBlend Modus 4. Wenn ich das ganze jetzt anwende, habe ich das hier als Ergebnis:
user posted image
Bei folgendem Code:
Code: [AUSKLAPPEN]
normal = LoadTexture(normalpath, 1)
TextureBlend spacestation, normal, 4
EntityTexture (spacestation,normal,0,0)

Wie man sieht, scheint die Normalmap "verkehrt herum" auf dem Mesh zu liegen. Dort wo das Licht hinscheint, sind schwarze Linien, und dort wo kein Licht ist, sind weiße. Das Ganze scheint ein Problem mit der OpenB3D-Lib zu sein.

Meine Frage: Ist es möglich, die Normalmap zu "invertieren", damit sie normal auf dem Mesh liegt? Ob jetzt codeintern oder ob das Ganze auch über die Normalmap-Textur zu lösen ist mir egal. Hauptsache sie liegt richtig auf dem Mesh. Smile

mfg, West

Farbfinsternis

BeitragFr, Apr 03, 2015 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
einfach horizontal und vertikal flippen dann geht es. Programmatisch kannst Du das über Scale(-1, -1) lösen.
Farbfinsternis.tv
 

West

BeitragFr, Apr 03, 2015 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hilft nicht weiter. Die Normalmap liegt ja an der richtigen Position. Nur highlightet sie nur an den Stellen am Mesh, an denen kein Licht ist. Ich brauche es umgekehrt. Wink

Xeres

Moderator

BeitragFr, Apr 03, 2015 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Darum wurde dir ja auch geraten, die Normalmap um zu kehren. Von Verschieben war nicht die Rede.
Skaliert man etwas mit negativen Werten (Multiplikation! keine Subtraktion!), kehrt man die entsprechenden Achsen um.
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)
 

West

BeitragFr, Apr 03, 2015 18:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir war schon klar was gemeint ist, aber es hilft nicht weiter. Die Normalmap passt ja auf die Diffusemap, mir geht es aber darum, dass die Normalmap falsch vom Licht beeinflusst wird. Normalerweise werden ja die Stellen auf der Normalmap hell beleuchtet, die vom Licht getroffen werden. Hier ist es aber anders rum: Die Stellen auf der Normalmap, die nicht vom Licht getroffen werden, werden hell erleuchtet:
user posted image

Xeres

Moderator

BeitragFr, Apr 03, 2015 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
- Ist die Reihenfolge der Texturelayer richtig?
- Wird der Texturelayer richtig verrechnet (lange nichts mehr mit 3D gemacht, aber subtraction/addition des Layers sollte eine Einstellung sein, wie TextureBlend )?
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)
 

West

BeitragFr, Apr 03, 2015 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
station = LoadMesh (objpath)
diffuse = LoadTexture (diffpath)
TextureBlend (diffuse , 2)
lights = LoadTexture(lightpath,4)
TextureBlend (lights , 3)
normal = LoadTexture(normalpath, 1)
TextureBlend normal, 4
EntityTexture (station, normal,0,0)
EntityTexture (station , diffuse , 0 , 1)
EntityTexture (station , lights , 0 , 2)

Sollte soweit richtig sein.
Ich denke es ist ein Problem der OpenB3D-Lib, deswegen hatte ich auch gefragt, ob man die Normalmap "invertieren" könnte.

DAK

BeitragSo, Apr 05, 2015 10:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Billiger Workaround: önne die Normalmap in Gimp. Uberlege sie mit einer weißen Ebene und gib dann als Mischmodus subtrahieren ein. Oder verwende die Farben Invertieren-Funktion deines bevorzugten Grafikprogrammes.
Gewinner der 6. und der 68. BlitzCodeCompo
 

West

BeitragSo, Apr 05, 2015 11:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt keinen Mischmodus "Subtrahieren". Es gibt "Abziehen", was in einem komplett schwarzen Bild endet und "Unterschied", was der Farben Invertieren-Funktion von GIMP entspricht, aber keinerlei Normalmapping-Funktionalität bietet. :/

DAK

BeitragSo, Apr 05, 2015 11:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Problem ist ja, dass die Normalmap genau umgekehrt von dem ist, was du brauchst. Helle Stellen werden verdunkelt und umgekehrt.

Das heißt, als Workaround könntest du einfach die Normalmap umkehren, das ist was ich gemeint habe. Wenn du Abziehen auf eine weiße Fläche machst, oder Unterschied, dann sollte das das Gleiche sein, die Farben sollten invertiert werden.
Damit sollten dann helle Stellen hell sein, und dunkle Stellen wieder dunkel sein.
Gewinner der 6. und der 68. BlitzCodeCompo
 

West

BeitragSo, Apr 05, 2015 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Dadurch wird das ganze Mesh(auch die Normalmap) von der falschen Seite beleuchtet.

Normalmap-Textur sieht in dem Fall so aus(Unterschied auf weiße Ebene):
user posted image

Xeres

Moderator

BeitragSo, Apr 05, 2015 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du mal ein kleines Mesh mit den dazugehörigen Texturen hast, kann ich das mal zusammen werfen, und das Ergebnis posten. Dann sieht man schnell, ob es am unterschied B3D zu openB3D oder an was anderem liegt.
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)
 

West

BeitragSo, Apr 05, 2015 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Mesh, Texturen und FB-Code

Ich habe mal den Macher der OpenB3D-Lib kontaktiert, offenbar ist es das selbe Problem unter BB3D. Ich schätze dass das Problem irgendwo in meinem Code liegt.
Das TurnEntity light im Code ist notwendig aufgrund der Lib, bitte nicht beachten.

Xeres

Moderator

BeitragSa, Apr 11, 2015 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bekomme bei dem Link nur eine Größtenteils weiße Seite zu sehen.
Falls das Paket klein genug ist, benutzt doch bitte das Foreneigene Archiv - danke.
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)
 

West

BeitragSa, Apr 11, 2015 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Upload wurde mittlerweile gelöscht, tut mir Leid Sad

Hier ein neues Paket: https://www.blitzforum.de/upload/file.php?id=12970

Xeres

Moderator

BeitragSa, Apr 11, 2015 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Lösung ist nicht ganz trivial - jedenfalls reicht es nicht, einfach die Texturen zu setzen:
1. Mit EntityFX das benutzen der Vertexfarbe einschalten, damit es flüssige Übergänge gibt.
2. Die Vertexfarben mit der Lichtposition verrechnen - dazu hat jemand mal eine Funktion geschrieben:

Quelle

So sieht das ganze dann brauchbar aus.
Funktioniert das so auch in OpenB3D?

BlitzBasic: [AUSKLAPPEN]
Graphics3D(800,600,0,2)

Local tex_base = LoadTexture("argonstation.png")
TextureBlend(tex_base, 3)

Local tex_normal = LoadTexture("argonstationnormal.png")
TextureBlend(tex_normal, 4)

;Local obj = CreateCube()
Local obj = LoadMesh("argontrade2.b3d")
EntityFX(obj,1+2)
TurnEntity(obj, 0, 45, 0)
UpdateNormals(obj)

EntityTexture(obj, tex_base, 0, 1)
EntityTexture(obj, tex_normal, 0, 0)

Local light = CreateLight(2), light_p#
Local lightMarker = CreateSphere(16,light)
ScaleEntity(lightMarker, 0.1, 0.1, 0.1)
MoveEntity(light, 1, 2, 0)
PointEntity(light, obj)

Local cam = CreateCamera()
CameraClsColor(cam, 64, 64, 64)
MoveEntity(cam, 0, 0, -4)

Local movelight = 1
Local turnObj = 1
Local turnSpeed# = 0.08
Local ftimer = CreateTimer(60)
Repeat
Cls

If KeyHit(59) Then movelight = movelight Xor 1 ;F1
If KeyHit(60) Then turnObj = turnObj Xor 1 ;F2

If (movelight) Then
light_p# = (light_p# + 1 + 360 Mod 360)
PositionEntity( light,Cos(light_p#)*4,Sin(light_p#*2)*1,Sin(light_p#)*4 )
EndIf

If (turnObj) Then
TurnEntity(obj, turnSpeed#, turnSpeed#, turnSpeed#)
EndIf

UpdateBumpNormals(obj, light)

UpdateWorld()
RenderWorld()

Text(10,10, "F2: light "+movelight)
Text(10,25, "F1: obj "+turnObj)

Flip(0)
WaitTimer(ftimer)
Until KeyHit(1)

; http://www.blitzbasic.co.nz/Community/posts.php?topic=78019
Function UpdateBumpNormals(mesh,light)

n_surf = CountSurfaces(mesh)
For s = 1 To n_surf
surf = GetSurface(mesh,s)
n_vert = CountVertices(surf)-1
For v = 0 To n_vert
TFormNormal VertexNX(surf,v),VertexNY(surf,v),VertexNZ(surf,v),mesh,0
nx# = TFormedX()
ny# = TFormedY()
nz# = TFormedZ()
TFormPoint VertexX(surf,v),VertexY(surf,v),VertexZ(surf,v),mesh,0
red# = EntityX(light,True)-TFormedX()
grn# = EntityY(light,True)-TFormedY()
blu# = EntityZ(light,True)-TFormedZ()
d# = Sqr(red*red + grn*grn + blu*blu)
red = (red/d)
grn = (grn/d)
blu = (blu/d)
dot# = red*nx + grn*ny + blu*nz
If dot>0.0
red = (1.0+(red*dot))*127.5
grn = (1.0+(grn*dot))*127.5
blu = (1.0+(blu*dot))*127.5
VertexColor surf,v,red,grn,blu
Else
VertexColor surf,v,127.5,127.5,127.5
End If
Next
Next

End Function
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)
 

West

BeitragDi, Apr 21, 2015 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe den Code mal in FB übersetzt. Das ganze scheint aber nicht richtig zu funktionieren:
user posted image

Der Code sieht übersetzt so aus:
Code: [AUSKLAPPEN]
#Include once "openb3d.bi"

Const xmax=1024
Const ymax=768

ScreenRes xmax,ymax,32,,2
Graphics3D xmax,ymax,32

Declare Sub UpdateBumpNormals(mesh As Any Ptr,light As Any Ptr)

Var tex_base = LoadTexture("argonstation.png")
TextureBlend(tex_base, 3)

Var tex_normal = LoadTexture("argonstationnormal.png")
TextureBlend(tex_normal, 4)

Var obj = LoadMesh("argontrade2.b3d")
EntityFX(obj,1+2)
TurnEntity(obj, 0, 45, 0)
UpdateNormals(obj)

EntityTexture(obj, tex_base, 0, 1)
EntityTexture(obj, tex_normal, 0, 0)

Var light = CreateLight(2)
Var lightMarker = CreateSphere(16,light)
ScaleEntity(lightMarker, 0.1, 0.1, 0.1)
MoveEntity(light, 1, 2, 0)
PointEntity(light, obj)

Var cam = CreateCamera()
CameraClsColor(cam, 64, 64, 64)
MoveEntity(cam, 0, 0, -4)

Var movelight = 1
Var turnObj = 1
Var turnSpeed = 0.08
Do
   Sleep 1,1
   TurnEntity(obj, turnSpeed, turnSpeed, turnSpeed)
   UpdateBumpNormals(obj, light)
   RenderWorld()
   Flip
Loop Until Inkey=Chr(27)

Sub UpdateBumpNormals(mesh As Any Ptr,light As Any Ptr)
   Dim As Any Ptr surf
   Dim As Integer n_vert
   Var n_surf = CountSurfaces(mesh)
   For s As Integer = 1 To n_surf
      surf = GetSurface(mesh,s)
       n_vert = CountVertices(surf)-1
      For v As Integer = 0 To n_vert
         TFormNormal VertexNX(surf,v),VertexNY(surf,v),VertexNZ(surf,v),mesh,0
         Var nx = TFormedX()
         Var ny = TFormedY()
         Var nz = TFormedZ()
         TFormPoint VertexX(surf,v),VertexY(surf,v),VertexZ(surf,v),mesh,0
         Var red = EntityX(light,1)-TFormedX()
         Var grn = EntityY(light,1)-TFormedY()
         Var blu = EntityZ(light,1)-TFormedZ()
         Var d = Sqr(red*red + grn*grn + blu*blu)
         red = (red/d)
         grn = (grn/d)
         blu = (blu/d)
         Var dot = red*nx + grn*ny + blu*nz
         If dot>0.0 Then
            red = (1.0+(red*dot))*127.5
            grn = (1.0+(grn*dot))*127.5
            blu = (1.0+(blu*dot))*127.5         
            VertexColor surf,v,red,grn,blu
         Else
            VertexColor surf,v,127.5,127.5,127.5
         End If
      Next
   Next
End Sub

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group