Backbuffer filtern?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: Backbuffer filtern?

BeitragDi, Apr 15, 2014 0:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
der Titel passt mal wieder nicht 100%ig zum Problem... Naja, folgendes: Ich versuche mich gerade an einem kleinen Filter, der auf das Bild im Backbuffer angewandt werden soll. Eigentlich soll dieser nur die Pixel so verändern, dass diese Schwarz/Weiß sind und nur noch einen schwachen Stich ihrer eigentlichen Farbe haben. Das funktioniert an sich auch ganz gut - wäre da nicht 100% CPU Auslastung und nicht mal 10 FPS... Folgenden Code verwende ich BlitzMax: [AUSKLAPPEN]
Function ScreenToBW()
Local img:TImage = CreateImage(GraphicsWidth(), GraphicsHeight(), 1, DYNAMICIMAGE)

GrabImage(img, 0, 0)

Local pixmap:TPixmap = LockImage(img)

For Local x:Int = 0 To (PixmapWidth(pixmap) - 1)
For Local y:Int = 0 To (PixmapHeight(pixmap) - 1)
momcol:Int = ReadPixel(pixmap, x, y)

Local a:Byte = (momcol & $FF000000) / $1000000
Local r:Byte = (momcol & $FF0000) / $10000
Local g:Byte = (momcol & $FF00) / $100
Local b:Byte = (momcol & $FF)

tempcol:Byte = Byte((r + g + b) / 3)

newcol:Int = (a Shl 24) | ((tempcol + r / 12) Shl 16) | ((tempcol + g / 12) Shl 8) | (tempcol + b / 12)

WritePixel(pixmap, x, y, newcol)
Next
Next

UnlockImage(img)
DrawImage(img, 0, 0)
End Function
- Diese Funktion grab-t sich das Bild aus dem Backbuffer und wandelt es in eine Pixmap um. Danach wird dieses Bild Pixel für Pixel durchlaufen (im Test 1600 x 900) und die Farbe des jeweiligen Pixels angepasst. Danach wird der veränderte Pixel wieder in die Pixmap geschrieben.

Der Übeltäter ist hier GrabImage(), ich habe gelesen, dass es seehr langsam arbeitet, was sich durch den Test bestätigte (Das Auskommentieren der nachfolgenden Zeilen brachte nur eine verschwindent geringe Performance-Verbesserung). Meine Frage: Gibt es eine performantere Möglichkeit, einen solchen Filter auf den Backbuffer anzuwenden?
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Xeres

Moderator

BeitragDi, Apr 15, 2014 0:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Grafik über die CPU berechnen zu lassen ist immer super langsam.
Die GPU ist fürs pixel schubsen gemacht, und sollte prinzipiell dafür genutzt werden. Soll heißen: OpenGL/DirektX und Shader benutzen, wenn es in Echtzeit dargestellt werden soll.
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)
 

PhillipK

BeitragDi, Apr 15, 2014 1:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde zu OpenGL greifen. Schon alleine, weil ich DirectX nicht kann.

Zwar habe ich es nie aktiv versucht, aber mit dem treiber "GlMax2DDriver()" müsstest du auch weiterhin normale Max2d funktionen nutzen können.

Schritt 2 wäre dann ein FBO (FrameBufferObject) einbinden und die szene darauf rendern. FBO stellt einen Texturenbuffer als target, nicht wie üblich den Backbuffer - du kannst in eine Textur rendern und diese später auf dem bildschirm (-> backbuffer) rendern.
Hier kannst du dann beliebige Filter oder auch shader zuschalten, je nach belieben.

Allerdings bedarf es hier ein paar grundlagen, bevor du tatsächlich mit shadern anfangen kannst. Erste tests wären zb überhaupt OpenGL zum laufen zu kriegen.
Wenn du dafür bereit bist, können wir dir sicher ein paar tips geben, aber es ist mehr arbeit.

PS: Die Grab variante kannst du voll vergessen.
Ein mögliches workarround ist, für alles ein 2tes image zu halten und entsprechend zu rendern. Ergo: In gimp oder paint etc vorbereiten Smile

count-doku

BeitragDi, Apr 15, 2014 5:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu OpenGL und FBO:
https://www.blitzforum.de/foru...hp?t=27274

Habe ich schonmal verwendet, läuft gut und schnell.

lg,
count-doku

BtbN

BeitragDi, Apr 15, 2014 5:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein FBO ist doch hier völlig überflüssig, ein shader auf die gesamte scene tuts genau so.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group