Backbuffer filtern?
Übersicht

CO2ehemals "SirMO"Betreff: Backbuffer filtern? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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()- 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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
count-doku |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein FBO ist doch hier völlig überflüssig, ein shader auf die gesamte scene tuts genau so. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group