Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Normal Map Generator Quelltext Übersetzung...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 22.05.2008, 07:03    Titel: Normal Map Generator Quelltext Übersetzung... Antworten mit Zitat

Hi!

Weil ich mal n bissl Langeweile hatte, habe ich mal ATIs NormalMapGenerator nach FB portiert... Naja irgendwie läuft da was schief, denn der berechnet eher die Silhouette (zwar auch nich ganz uninteressant, aber... durchgeknallt)

Mal ein paar Bilder:

Meine Test-Heightmap


Ergebniss von meinem Programm


Ergebniss von ATIs Originalfassung

http://28398labs.28.funpic.de/stuff/DOT3.bas
Der Sourcecode

http://28398labs.28.funpic.de/stuff/TGAtoDOT3.cpp
ATIs Originalcode

Ich hab das mit den Speicher abgeändert auf Arrays, aber ich hatte es zuerst Original übersetzt, beide Programme liefern auf das BIT genau dasselbe Ergebnis (beide FB programme), nämlich eine Art Silhouette!

Was zum Henker mache ich da falsch!?
(Ich glaube es liegt an dem Codeblock nach den beiden Sobel-Filtern)

(JA, heute fiel bei mir die erste Stunde aus!)

Und die "große" Hauptschleife:
Code:
      For y = 0 To gHeight
         For x = 0 To gWidth
            ' Do Y Sobel filter
            pix = srcImage((x-1+gWidth) Mod gWidth, (y+1) Mod gHeight)
            dY = Cast(Double, pix.red / 255.0 * -1.0)
            
            pix = srcImage(x Mod gWidth, (y+1) Mod gHeight)
            dY += Cast(Double, pix.red / 255.0 * -2.0)
            
            pix = srcImage((x+1) Mod gWidth, (y+1) Mod gHeight)
            dY += Cast(Double, pix.red / 255.0 * -1.0)
            
            pix = srcImage((x-1+gWidth) Mod gWidth, (y-1+gHeight) Mod gHeight)
            dY += Cast(Double, pix.red / 255.0 * 1.0)
            
            pix = srcImage(x Mod gWidth, (y-1+gHeight) Mod gHeight)
            dY += Cast(Double, pix.red / 255.0 * 2.0)
            
            pix = srcImage((x+1) Mod gWidth, (y-1+gHeight) Mod gHeight)
            dY += Cast(Double, pix.red / 255.0 * 1.0)
            
            ' Do X Sobel filter
            pix = srcImage((x-1+gWidth) Mod gWidth, (y-1+gHeight) Mod gHeight)
            dX = Cast(Double, pix.red / 255.0 * -1.0)
            
            pix = srcImage((x-1+gWidth) Mod gWidth, y Mod gHeight)
            dX += Cast(Double, pix.red / 255.0 * -2.0)
            
            pix = srcImage((x-1+gWidth) Mod gWidth, (y+1) Mod gHeight)
            dX += Cast(Double, pix.red / 255.0 * -1.0)
            
            pix = srcImage((x+1) Mod gWidth, (y-1+gHeight) Mod gHeight)
            dX += Cast(Double, pix.red / 255.0 * 1.0)
            
            pix = srcImage((x+1) Mod gWidth, y Mod gHeight)
            dX += Cast(Double, pix.red / 255.0 * 2.0)
            
            pix = srcImage((x+1) Mod gWidth, (y+1) Mod gHeight)
            dX += Cast(Double, pix.red / 255.0 * 1.0)
            
            ' Cross Product of components of gradient reduces to
            nX = -dX
            nY = -dY
            nZ = 1
            
            ' Normalize
            oolen = 1.0/Cast(Double, Sqr(nX^2 + nY^2 + nZ^2))
            nX *= oolen ' nX *= oolen; ??
            nY *= oolen ' nY *= oolen; ??
            nZ *= oolen ' nZ *= oolen; ??
            
            pix.red = PackFloatInByte(nX)
            pix.green = PackFloatInByte(nY)
            pix.blue = PackFloatInByte(nZ)
            
            dstImage(x, y) = pix
         Next x
      Next y
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 22.05.2008, 11:34    Titel: Antworten mit Zitat

Das finde ich ja mal sehr interessant. Nur leider läuft es bei mir nicht so richtig. traurig
Sobald es an der
Zitat:
"großen" Hauptschleife
angekommen ist gibts bei mir eine Fehlermeldung ("Test.exe hat ein Problem festgestellt und...") Ich kenn mich zwar nicht wirklich aus aber vielleicht liegts der Fehler ja im Laden der TGA-Dateien. (EDIT: Was ich bei genauerem nachdenken doch unwarscheinlich finde)

MfG

EDIT_2:Ich wollt keinen Doppelpost machen also hab ich das noch hier reingepackt:
Dein Ergebnis ist bis auf diese "Silhouette" eigentlich garnicht mal so verschieden wie das von ATI, denn bei dir sind einfach die Farben etwas verschoben. Ich würde es mal damit probieren:
Code:
Function PackFloatInByte (in As Double) As UByte
   Return (Cast(Byte, (in * 255.0)))
End Function

Aber bin mir da nich sicher weil ichs ja nich selbst ausprobieren kann, da ja das Prog bei mir nich läuft...

MfG
_________________
Eine Erkenntnis von heute kann die Tochter eines Irrtums von gestern sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 22.05.2008, 17:21    Titel: Antworten mit Zitat

Gibt eine aktualisierte Fassung (mom.) von mir: http://28398labs.28.funpic.de/stuff/DOT3.zip

siehe auch englisches Forum: http://www.freebasic.net/forum/viewtopic.php?t=11519

Werde deinen Tipp gleich mal ausprobieren lächeln

EDIT:
Scheint so als wäre die Funktion richtig, allerdings wird beim speichern wie beim Originalprog die BGR-folge verwendet.
Mit GRB ist alles bis auf die Silouhette gleich grinsen

Na
Wenn ich die noch wegkriege isses perfekt^^
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz