 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 22.05.2008, 07:03 Titel: Normal Map Generator Quelltext Übersetzung... |
|
|
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... )
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 |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 22.05.2008, 11:34 Titel: |
|
|
Das finde ich ja mal sehr interessant. Nur leider läuft es bei mir nicht so richtig.
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
|
Nach oben |
|
 |
|
|
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.
|
|