Pixmap Problem....

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

juse4pro

Betreff: Pixmap Problem....

BeitragMo, Feb 22, 2010 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,...

Ich arbeite jetzt zum ersten Mal richtig mit Pixmap's, und habe gleich mein erstes Problem:

ich habe eine Pixmap im Format: PF_RPGA8888 (also 32 Bit, mit Alpha, big endian)
wenn ich jetzt ClearPixels mache...--> ClearPixels(MinimapPixmap, den optionalen Parameter lass ich weg)

müsste das Bild, wenn ich es zeichne nicht unsichtbar sein?
denn 0 =
R ist 0
G ist 0
B ist 0
Alpha ist auch 0

aber ich sehe ein schwarzen Kasten... warum, das ergibt irgendwie keinen Sinn..

Falls es am Blendmode liegt... kann nicht sein, bin im AlphaBlend Wink

Hoffe mir kann wer helfen Very Happy Very Happy Very Happy
Portfolio |LinkedIn |XING

mpmxyz

BeitragMo, Feb 22, 2010 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst du Pixmap mit "DrawImage" über ein Bild und nicht mit "DrawPixmap" zeichnen.
"DrawPixmap" nutzt SolidBlend.
Diese Funktion ist auch nur zu Debug-Zwecken gedacht.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

juse4pro

BeitragDi, Feb 23, 2010 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
achso.. ich dachte DrawImage geht nur bei TImage's, nagut wenn's so ist werd ichs mal probieren, Danke... ^^
Portfolio |LinkedIn |XING

DaysShadow

BeitragDi, Feb 23, 2010 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
DrawImage geht ja auch nur bei TImage, aber du kannst auch eine Pixmap als Image laden wenn du statt einem Pfad eine Pixmap bei LoadImage( ) angibst.
Willst du nur etwas bearbeiten bei einem Image, dann kannst du per LockImage( image ) die Pixmap dazu erhalten und sie, wenn du fertig bist, wieder per UnlockImage( image ) freigeben.

Dazu ist zu beachten, dass die Bearbeitungen bei geringen Änderungen noch gehen mögen, bei größeren oder einfach nur etlich vielen wird es nicht mehr schön anzusehen sein, weil Pixmaps dafür zu lahm sind.

MfG DaysShadow
Blessed is the mind too small for doubt

juse4pro

BeitragDi, Feb 23, 2010 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
daheißt ich kreiere eine Pixmap, lad sie in ein Bild und kann das TImage per Lock / Unlock Image editieren...

Ist das Realtime-Performance lästig oder geht das in Ordnung?
Portfolio |LinkedIn |XING

DaysShadow

BeitragDi, Feb 23, 2010 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schon geschrieben, kleine Änderungen oder nicht so häufige pro Frame gehen klar, viele jedoch kann man vergessen.
Ich wollte mal den Aero Effekt von Windoof aus Spaß nachbasteln, den Gausschen Weichzeicher hatte ich mir erst geschrieben, aber das ging total auf die Performance und war absolut nicht zu gebrauchen.
Dann wollte ich mal Farben von Ländern auf einer Landkarte ändern, das wiederum ging gut, da es nur auf Mausklick losging und nicht soviele Pixel waren.

MfG DaysShadow
Blessed is the mind too small for doubt

juse4pro

BeitragDi, Feb 23, 2010 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
wie man vielleicht sehen kann geht es bei mir um eine 100x100 große minimap, welche nur 50 änderungen (50 neue Pixel) pro Frame bekommt
Portfolio |LinkedIn |XING

mpmxyz

BeitragDi, Feb 23, 2010 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sollte gehen.
Nutze aber die Pixmap, die dir "LockImage" zurückgibt!
Sonst wirst du keine Änderung sehen.
Die Anzahl der bearbeiteten Pixel sollte außerdem verhältnismäßig egal sein.
Das Problem ist eher die Tatsache, dass die Pixeldaten wieder auf die Grafikkarte hochgeladen werden müssen, und die dafür benötigte Zeit ist von der Größe des Bildes abhängig.
Das Hochladen sollte auch der Grund sein, warum "DrawPixmap" so langsam sein soll. (Ich habe den Befehl nie benutzt und habe daher keinen Vergleich angestellt.)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Ava

Gast

BeitragDi, Feb 23, 2010 23:20
Antworten mit Zitat
DrawPixmap macht ansich das selbe, wie LoadImage (TPixmap), nur das die Pixeldaten ein anderes Ziel haben (DrawPixmap überträgt sie auf den Backbuffer, LoadImage überträgt sie in einen Bildspeicher). Wenn man einen Pixmap also jeden Durchlauf modifzieren und zeichnen will, dann ist DrawPixmap also sogar einen Tick schneller (anstatt die Daten erst in einen Speichern und dann auf den Backbuffer zu übertragen, gelangen sie auf direkten Wege ans Ziel - bleibt aber dennoch so oder so verhältnismässig langsam!). Der Blendmode wird übriegens eigentlich auf jede Pixelübertragung angewand. Es ist nur leider eine Eigenart von Max2Dt, bei einem DrawPixmap zuvor den Blendmode auf SolidBlend einzustellen und anschliessed wieder zurück zu setzen.

BtbN

BeitragMi, Feb 24, 2010 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn mich nicht alles täuscht, schreibt DrawPixmap einfach die Pixel in den Backbuffer, ohne sie vorher durch die Rendring Pipeline gehen zu lassen, und somit können keinerlei Effekte auf sie angewandt werden.
 

Ava

Gast

BeitragMi, Feb 24, 2010 15:40
Antworten mit Zitat
Zitat aus BRL.GLMax2D:
BlitzMax: [AUSKLAPPEN]
	Method DrawPixmap( p:TPixmap,x,y )
Local blend=state_blend
DisableTex
SetBlend SolidBlend

Local t:TPixmap=YFlipPixmap(p)
If t.format<>PF_RGBA8888 t=ConvertPixmap( t,PF_RGBA8888 )
glRasterPos2i 0,0
glBitmap 0,0,0,0,x,-y-t.height,Null
glDrawPixels t.width,t.height,GL_RGBA,GL_UNSIGNED_BYTE,t.pixels

SetBlend blend
End Method

juse4pro

BeitragMi, Feb 24, 2010 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
das heißt ich müsste in Max2D rumpfuschen und den AlphaBlend anmachen, damit ich endlich per DrawPixmap eine poplige Minimap zeichnen kann? ^^

Wie hat es zum Beispiel DC in CarnageContest gemacht, da basiert doch auch alles auf Pixmap's, oder?? Very Happy
Portfolio |LinkedIn |XING
 

Ava

Gast

BeitragMi, Feb 24, 2010 19:38
Antworten mit Zitat
Einfacher wäre es, wenn Du die Methode in eine eigene Funktion kopierst und anpasst... Rolling Eyes
...muss man dann nur schauen, ob das "DisableTex" womöglich Probleme macht, da dies Private ist - wie die meisten Sachen in Max2D. Evil or Very Mad

Abgesehen davon gibt es aber unzählige Lösungswege.

Kannst ja mal ausprobieren (Grafiktreiber auf OpenGL einstellen!):
BlitzMax: [AUSKLAPPEN]
	Function DrawPixmap( p:TPixmap,x,y )

Local t:TPixmap=YFlipPixmap(p)
If t.format<>PF_RGBA8888 t=ConvertPixmap( t,PF_RGBA8888 )
glRasterPos2i 0,0
glBitmap 0,0,0,0,x,-y-t.height,Null
glDrawPixels t.width,t.height,GL_RGBA,GL_UNSIGNED_BYTE,t.pixels

End Function
Ich gebe aber keine Garantie, dass es so einfach funktioniert. Wink (Max2D lässt sich von Aussen wie gesagt nur schwer manipulieren) Wenn es klappt, solltest Du am besten noch das mit dem Flippen und dem Format optimieren.

mpmxyz

BeitragMi, Feb 24, 2010 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Max2D davon nutzt doch auch nur Pixmaps, die noch auf die Grafikkarte hochgeladen werden, für die Images.
Wenn man an denen nichts ändert, wird aber auch nichts hochgeladen.
Wenn du die Pixmap eines Bildes mit Hilfe von LockImage bearbeitest, reicht das aus.
Du kannst dann alle Spielereien von Max2D nutzen. (Das einfacher als alles andere. Smile )

Das Terrain von Carnage Contest besteht aus Pixmaps mit den entsprechenden Bildern.
Die trotzdem hohe Geschwindigkeit kommt von der Unterteilung in viele kleine Teile.
Bei einer Änderung werden nur die veränderten Teile erneut hochgeladen.
Das braucht weniger Zeit, als wenn man große Bilder bearbeitet.
(Irgendwo hat DC mal davon geschrieben.)

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

juse4pro

BeitragMi, Feb 24, 2010 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
ja ich glaube er hatte 128x128 große pixmaps... wenn das so schnell geht mit dem uploaden mache ich mir auch eine 128x128 große pixmap, und mach pixel errechnung mit writepixel (ist das empfehlenswert?)

und zeichne sie per manipuliertem Max2D mit DrawPixmap, oder hab ich noch was vergessen? ^^
Portfolio |LinkedIn |XING

mpmxyz

BeitragMi, Feb 24, 2010 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Nutze die ganz normalen Images!
Dann musst du dir nicht so viel Arbeit machen und kannst alle Max2D-Funktionen nutzen.
Bei WritePixel wird nur in einen Speicherbereich geschrieben.
(unterm Strich ähnlich wie bei einem Array)
Daher ist der Befehl nicht so langsam.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

BtbN

BeitragMi, Feb 24, 2010 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
glDrawPixels geht an der Rendering-Pipeline vorbei, also können ihre effekte nur schwer angewandt werden. Alpha und dergleichen ist damit nicht möglich. Es werden lediglich die Pixel direkt und ohne umweg in den Framebuffer geschrieben.
Das SolidBlend ist vermutlich da, um ungewollte nebeneffekte zu verhindern.
 

Ava

Gast

BeitragMi, Feb 24, 2010 23:21
Antworten mit Zitat
Tja, das ist nicht korrekt. GlDrawPixels geht durch die Einstellungen für den Pixeltransfer. Blending findet erst an diesem Punkt statt, nicht vorher in der Renderpipeline.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group