OpenB3D/minib3d Normalmapping
Übersicht

WestBetreff: OpenB3D/minib3d Normalmapping |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo werte Blitzler ![]() 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: ![]() 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. ![]() mfg, West |
||
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
einfach horizontal und vertikal flippen dann geht es. Programmatisch kannst Du das über Scale(-1, -1) lösen. | ||
Farbfinsternis.tv |
West |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
West |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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:
![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
- 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
West |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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): ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
West |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
West |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der Upload wurde mittlerweile gelöscht, tut mir Leid ![]() Hier ein neues Paket: https://www.blitzforum.de/upload/file.php?id=12970 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Lösung ist nicht ganz trivial - jedenfalls reicht es nicht, einfach die Texturen zu setzen:
1. Mit EntityFX ![]() 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) |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
West |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe den Code mal in FB übersetzt. Das ganze scheint aber nicht richtig zu funktionieren:
![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group