[GELÖST]Problem mit Pixmap

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Skabus

Betreff: [GELÖST]Problem mit Pixmap

BeitragMo, Nov 30, 2009 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Nabend!


Ich schreibe momentan an einem Raycaster und brauche dafür eine Möglichkeit einzelne Pixel möglichst schnell in einen Buffer und/oder
Bilder zu schreiben.

Durch einen alten Code von vertex bin ich auf die Idee gekommen
dafür eine Pixmap zu nehmen und das Ergebnis anzeigen zu lassen.

Mein Problem ist nun, dass ich nicht ganz verstehe wie ich
genau mit Byte-Pointern arbeiten soll.Ich habe bereits versucht das Prinzip zu verstehen, leider erschließt sich mir das ganze nicht sonderlich.

Mein (erstes) Grundlegendes Problem: Ich will einen 640*200 Pixel großen Streifen bei einer Auflösung von 640*480 am oberen Teil
anzeigen.Mein Code sieht in etwa so aus:

Code: [AUSKLAPPEN]


'diese Methode wird aufgerufen wenn der Bildschirm aktualisiert werden muss
Method drawPixmap()

'lokale Variablen
Local x:Int  = 0
Local y:Int  = 0
Local pixMapArray:Byte Ptr
Local red:Byte = 255
Local blue:Byte = 255
Local green:Byte = 255
Local alpha:Byte = 255

'jede Spalte der Bildbreite wird gezeichnet
For x=0 To Self.screenX-1

 'der Pointer auf die Pixmap
  pixMapArray = test.Pixels + Byte(4*x)


  For y=0 To 199
   pixMapArray[0] = red
   pixMapArray[1] = green
   pixMapArray[2] = blue
   pixMapArray[3] = alpha
   pixMapArray:+Self.screenX*4
  Next

Next

'das Ergebnis ausgeben
DrawPixmap(test,0,0)

End Method



Mein Lösungsansatz war also,stelle die Spalte der Pixmap ein, dann
schreib die Pixelinformation in die Pixmap geh die Breite des Bildschirms mal 4 weiter und zeichne erneut einen Pixel,
solange bis alle 200 Pixel gezeichnet wurden danach
geh eine Spalte weiter und fang von vorn an.

Leider funktioniert das einfach nicht richtig.
Weiß jemand was ich falsch mache?

Über jede Art von Hilfe würde ich mich freuen.
Danke im vorraus!^^


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu
  • Zuletzt bearbeitet von Skabus am Mi, Dez 02, 2009 18:41, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMo, Nov 30, 2009 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Leider funktioniert das einfach nicht richtig.
Großartige Fehlerbeschreibung... Neutral
Lauffähige Beispiele wären an solchen Stellen auch Vorteilhaft.
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)

coolo

BeitragMo, Nov 30, 2009 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde bei sowas FrameBufferObjects nehmen, diese funktionieren zwar erst ab OGL 2.1 sind aber um einiges leichter in der Handhabung. Klepto2 hat mal eine tolle Lib geschrieben: https://www.blitzforum.de/foru...hlight=fbo

Diese Lib ist sehr nützlich Wink
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat

Xeres

Moderator

BeitragMo, Nov 30, 2009 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitteschön:
BlitzMax: [AUSKLAPPEN]
SuperStrict

'lokale Variablen
Local gfx_w:Int = 640
Local gfx_h:Int = 480

Graphics(gfx_w, gfx_h)

Local pixmap:TPixmap = TPixmap.Create(gfx_w, gfx_h, PF_RGBA8888)
'*** Zufällige Pixeldaten Überschreiben... (Grau)
pixmap.ClearPixels($FF888888)

'* Vorher
DrawPixmap(pixmap, 0, 0)
DrawText("Taste", 10, 10)
Flip()
WaitKey()

Local x:Int = 0
Local y:Int = 0
Local RED:Byte = 255
Local Blue:Byte = 255
Local Green:Byte = 255
Local Alpha:Byte = 255

'der Pointer auf die Pixmap
Local pixMapArray:Byte Ptr = pixmap.Pixels '+ Byte(4 * x)

'jede Spalte der Bildbreite wird gezeichnet
Local time:Int = MilliSecs()

'** Zeile für Zeile...
For y = 0 Until 199

For x = 0 Until gfx_w

pixMapArray[0] = RED
pixMapArray[1] = Green
pixMapArray[2] = Blue
pixMapArray[3] = Alpha
pixMapArray:+4 'gfx_h

'pixmap.WritePixel(x, y, $FFFFFFFF)
Next

Next

'das Ergebnis ausgeben
DrawPixmap(pixmap, 0, 0)
SetColor(0, 0, 0)
DrawText((MilliSecs() - time) + " ms", 10, 10)
Flip()
WaitKey()


WritePixel: 36 ms
Pointer: 31 ms

Achja, erklärung: Wenn du den Pointer in der Schleife resetest kann das nichts werden Wink
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)

Skabus

BeitragMo, Nov 30, 2009 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank Xeres, erstmal^^

Ich hatte allerdings geschrieben, dass ich eben nix weiter als einen weißen Streifen in die Pixmap schreiben wollte.

So wie dein Code habe ich das allerdings bereits auch hinbekommen.

Das Problem ist allerdings, dass ich die Zeichenroutine nicht für
horizontales Zeichnen sondern für vertikales Zeichnen benötige.

Wie ich schon schrieb.Es soll nicht Zeile für Zeile einen 200 Pixel hohen und 640 breiten Streifen zeichnen sondern Spalte für Spalte.

Ich möchte also, dass der erste Pixel bei 0,0 beginnt und der letzte
Pixel der ersten Spalte bei (0,199) aufhört.Darum hatte ich den pixMapArray resetet damit ich wieder von oben aus anfangen kann.

Sinn des ganzen soll später sein, damit ich bestimmte Spalten aus einer Textur auslesen kann und dann in diese Pixmap schreiben kann.

Kannst du mir also vllt. nen Tipp geben wie ich das realisieren kann?

Sorry wenn ich mich etwas unverständlich ausdrücke^^"
Ich habs schon versucht so präsise wie möglich zu machen...

MfG Ska

coolo: Mir gehts prinzipiell umm den Geschwindigkeitsvorteil.
Ich muss aus meinem Raycaster das Maximum an Geschwindigkeit rausprügeln.In wie fern bringt mir odder bringt sie mir überhaupt einen Geschwindigkeitsvorteil im vergleich zum normalen Zeichnen?
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Xeres

Moderator

BeitragMo, Nov 30, 2009 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach... vertikal
Klar.
BlitzMax: [AUSKLAPPEN]
SuperStrict

'lokale Variablen
Local gfx_w:Int = 640
Local gfx_h:Int = 480

Graphics(gfx_w, gfx_h)

Local pixmap:TPixmap = TPixmap.Create(gfx_w, gfx_h, PF_RGBA8888)
'*** Zufällige Pixeldaten Überschreiben... (Grau)
pixmap.ClearPixels($FF888888)

'* Vorher
DrawPixmap(pixmap, 0, 0)
DrawText("Taste", 10, 10)
Flip()
WaitKey()

Local x:Int = 0
Local y:Int = 0
Local RED:Byte = 255
Local Blue:Byte = 255
Local Green:Byte = 255
Local Alpha:Byte = 255

'der Pointer auf die Pixmap
Local pixMapArray:Byte Ptr = pixmap.Pixels '+ Byte(4 * x)

'jede Spalte der Bildbreite wird gezeichnet
Local time:Int = MilliSecs()

'** Zeile für Zeile...
For y = 0 Until gfx_h

For x = 0 Until 200

pixMapArray[0] = RED
pixMapArray[1] = Green
pixMapArray[2] = Blue
pixMapArray[3] = Alpha
pixMapArray:+4 'gfx_h

'pixmap.WritePixel(x, y, $FFFFFFFF)
Next
rem
Die Bilddaten liegen im Array Linear vor, darum wird hier
die Differenz zur nächsten Zeile übersprungen (wiederum
jedes Pixel = 4 Byte)
endrem

pixMapArray:+(gfx_w - 200) * 4

Next

'das Ergebnis ausgeben
DrawPixmap(pixmap, 0, 0)
SetColor(0, 0, 0)
DrawText((MilliSecs() - time) + " ms", 10, 10)
Flip()
WaitKey()


Die Bilddaten liegen im Array Linear vor, darum muss die Differenz zur nächsten Zeile übersprungen werden (wiederum jedes Pixel = 4 Byte).
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)

Skabus

BeitragMo, Nov 30, 2009 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Argh, ich drück mich einfach zu undeutlich aus XD


Das Ergebnis deines ersten Codes ist schon richtig^^"
Ich will aber die einzelnen SPALTEN so zeichnen lassen das sie so gezeichnet werden

erst (0,0)
dann (0,1)
dann (0,2)

usw.

bis (0,199)

Danach soll die nächste Spalte gezeichnet werden.
Also

erst (1,0)
dann (1,1)
dann (1,2)

usw.

bis (1,199)

Sodass dann ein horizontaler Streifen entsteht mit 640*200 Pixel
nur halt gezeichnert mit vertikalen Linien...

Ich hoffe dass jetzt klar ist was ich meine sonst lade ich nachher nochmal meinen ursprünglichen Code hoch, damit man den Unterschied erkennt^^"

Aber vielen Dank für deine Hilfe bissher!
Langsam dämmert mir wie das funktioniert...

MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Xeres

Moderator

BeitragDi, Dez 01, 2009 1:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun, dies hier sollte passend sein...
BlitzMax: [AUSKLAPPEN]
SuperStrict

'lokale Variablen
Local gfx_w:Int = 640
Local gfx_h:Int = 480

Graphics(gfx_w, gfx_h)

Local pixmap:TPixmap = TPixmap.Create(gfx_w, gfx_h, PF_RGBA8888)
'*** Zufällige Pixeldaten Überschreiben... (Grau)
pixmap.ClearPixels($FF888888)

'* Vorher
DrawPixmap(pixmap, 0, 0)
DrawText("Taste", 10, 10)
Flip()
WaitKey()

Local x:Int = 0
Local y:Int = 0
Local RED:Byte = 255
Local Blue:Byte = 255
Local Green:Byte = 255
Local Alpha:Byte = 255

'der Pointer auf die Pixmap
Local pixMapArray:Byte Ptr = pixmap.Pixels

'jede Spalte der Bildbreite wird gezeichnet
Local time:Int = MilliSecs()

'** Links -> Rechts
For x = 0 Until 200

'** Oben -> Unten
For y = 0 Until gfx_h

pixMapArray[0] = RED
pixMapArray[1] = Green
pixMapArray[2] = Blue
pixMapArray[3] = Alpha

'** Eine komplette Zeile verschieben
pixMapArray:+(gfx_w * 4)

'pixmap.WritePixel(x, y, $FFFFFFFF)
Next

'** Alle Zeilen zurück verschieben...
pixMapArray:-(gfx_w * gfx_h * 4)
'** Nächste Spalte...
pixMapArray:+4

Next

'das Ergebnis ausgeben
DrawPixmap(pixmap, 0, 0)
SetColor(0, 0, 0)
DrawText((MilliSecs() - time) + " ms", 10, 10)
Flip()
WaitKey()

... wenn du's nicht schon hast Wink
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)

Skabus

BeitragDi, Dez 01, 2009 2:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, vielen Dank^^

Jetzt versteh ich auch was ich falsch gemacht habe.
Nochmals Danke, damit kann ich jetzt weiterarbeiten Very Happy


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group