Filter wie SuperEagle bei Emulatoren


Dragoon

Active Member
Joined
Feb 23, 2009
Messages
721
Jeder der ScummVM oder einen Emulator wie Snes9x kennt, hat bestimmt schon mal etwas vom SuperEagle- oder Super2xSaI-Filter gehört. Mich würde mal interessieren, ob es bezüglich der Pandora-Emus da schon genauere Infos gibt.

Ich bin zwar ein Fan von alter Pixelgrafik, aber bei einer Auflösung von 800x480 und einem (erzwungenen) Scaling könnte eine 320x200 Grafik (wie die vom SNES) gescaled und gefiltert sehr schön aussehen.

Ich hab mal schnell einen Vergleich gemacht: :D

x39jlb.jpg

(Breath of Fire II - Snes9x)
 
Dragoon said:
Jeder der ScummVM oder einen Emulator wie Snes9x kennt, hat bestimmt schon mal etwas vom SuperEagle- oder Super2xSaI-Filter gehört.

Habe ich, ehrlich gesagt, noch nicht, aber bei Vice (C=64-Em) gibt es auch so einen Filter, der mich allerdings längst nicht so überzeugt hat wie das Beispiel, das Du hier zeigst. Vielleicht wäre es möglich, den Filter direkt in SDL einzubauen, so dass ein Programm nicht gesondert den Filter "beigebracht" bekommen muss, sondern ihn (eventuell abhängig von User-Preferences) automatisch bekommt, wenn es einen Screen mit deutlich niedrigerer Auflösung als der natürlichen anfordert.
 
grond said:
Vielleicht wäre es möglich, den Filter direkt in SDL einzubauen, so dass ein Programm nicht gesondert den Filter "beigebracht" bekommen muss


Hallöchen. Auf http://en.wikipedia.org/wiki/Pixel_art_scaling_algorithms sind ein paar dieser Algorithmen erklärt. Besonders das hq3x-Beispiel ist sehr eindrucksvoll. Vielleicht macht sich jemand mit etwas Ahnung die Mühe, ne simple lib für alle zu programmieren ala:

SDL_surface* filterHQ2X(SDL_surface* input)
{
algorithmus
}
...

Kann man sowas auch mit nem Pixelshader bauen? Das verringert die Prozessorlast, die je nach Emulator noch gebraucht wird.

Whynodd
 
Kann man sowas auch mit nem Pixelshader bauen? Das verringert die Prozessorlast, die je nach Emulator noch gebraucht wird.

So was kann man doch nicht in ein Pixelshader Bauen :eek: . Soweit ich weiß wirkt der Pixelshader auf 3D Modelle und dann erst auf die Textuhren, doch wir sprechen hier von einer Art Antialiasing und das kann nur auf Textuhren oder wie oben auch auf Bildern wirken also eine Art Nachbearbeitung des fertigen Bildes. Antialiasing in einen Pixelshader zu Bauen, das wäre ja wie ein Kreuzung zwischen Hund und Katze :D
 
RMfast said:
Kann man sowas auch mit nem Pixelshader bauen? Das verringert die Prozessorlast, die je nach Emulator noch gebraucht wird.

So was kann man doch nicht in ein Pixelshader Bauen :eek: . Soweit ich weiß wirkt der Pixelshader auf 3D Modelle und dann erst auf die Textuhren, doch wir sprechen hier von einer Art Antialiasing und das kann nur auf Textuhren oder wie oben auch auf Bildern wirken also eine Art Nachbearbeitung des fertigen Bildes. Antialiasing in einen Pixelshader zu Bauen, das wäre ja wie ein Kreuzung zwischen Hund und Katze :D
Warum sollte das nicht gehen? Natürlich kann das fertig gerenderte Bild mit einem Pixelshader verändern werden. Das nennt sich dann Postprocessing. Dafür muss das ganze aber irgendwie in der OpenGL Renderpipeline drin sein...
 
Warum sollte das nicht gehen? Natürlich kann das fertig gerenderte Bild mit einem Pixelshader verändern werden. Das nennt sich dann Postprocessing. Dafür muss das ganze aber irgendwie in der OpenGL Renderpipeline drin sein...

Gehen Ja kla, aber wenn man z.B ein 3D Spiel hat mit 4-9 Pixelshadern und man am ende dann noch ein Pixelshader über das Gerenderte Bild legt sieht das blöd aus, weil die 4-9 Pixelshader darunter nicht mehr zu Geltung kommen, Z-Brush lässt grüßen zudem ging es um Pixelgrafik 320x200 die automatisch auf 800x480 Pixel erhöht wird und Antialiasing macht eigentlich auch nichts anderes doch die Reihenfolge ist immer die selbe


1. 3D Modell
2. Pixelshader auf 3D Modell

3. Textuhr oder Bild
4. und dann Antialiasing über alles (Rendering)

wenn ich jetzt noch mal ein Pixelshader über alles ziehen würde währe das schon wieder eine Verschlechterung des Bildes, weil kein Antialiasing auf dem neuen Bild lastet oder soll dann noch mal Antialiasing angewendet werden :lol: ??

…. Antialiasing kommt immer zuletzt sonst währe das nicht effizient und die Reihenfolge ist immer die selbe
 

Attachments

  • Antialiasing_test.jpg
    Antialiasing_test.jpg
    188.5 KB · Views: 3,169
Von Antialiasing redet ja keiner, das ist ne ganz andere Technik, das macht die Grafikhardware von selbst, das muss man prinzipiell nicht programmieren.

Dachte mir das so:

Der Emu pixelt sein 320x240-Bild in den Ram. Dann painte ich ein Quad mit OpenGL auf 640x480Pixel Größe und lege das kleine Emulatorbildchen als Textur drüber. Und da auf der Pandora der Videoram nicht vom normalen Ram getrennt ist, macht sich das doch ganz praktisch, spart sinnlose Kopieraktionen zur 3D-Hardware :lol:.
Das genannte Texturemapping auf unser Quad muss man ja in einem kleinen Vertexshader machen (wir haben keine Fixed Functions), der den Ecken des Quads die Ecken der Textur zuweist. Ergebnis: Bilinear gefilterter Emulator. Das wäre ja schonmal ein Anfang, so macht das jeder Videoplayer
Jetzt der Ansatz: Zu dem Vertexshader nimmt man nun noch einen Pixelshader, der für jeden Pixel auf dem Bildschirm (640x480) ausgeführt wird. Und hier soll jetzt einer dieser dollen Skalierungsalgorithmen passieren. Meine Frage: Hat man mit einem Pixelshader die Möglichkeit, nach Belieben (bzw. so wie der Skalierungsalgorithmus es will) in der zugewiesenen Textur herumzupeeken um die endgültige Farbe für das Pixel zu bestimmen?
Nebenbei: Wenn sowas so einfach geht, könnte man doch mal eben (lach) frei nach CUDA n Framework bauen, womit Vektor und Matritzenoperationen von der Grafikhardware erledigt werden.

Kann jemand abschätzen, wieviele Shaderanweisungen (Größenordnung) unser PowerVR-Ding pro Pixel bei Vollbild (hier 640x480) so schafft?

Whynodd
 
Das Hört sich sehr umständlich an :D , wie so keine Skalierung in Kombination mit Antialiasing ähnlich Vue4 und schon sollte das Ergebnis wie beim Super2xSaI-Filter oben sein :huh: ??
 
Whynodd said:
Meine Frage: Hat man mit einem Pixelshader die Möglichkeit, nach Belieben (bzw. so wie der Skalierungsalgorithmus es will) in der zugewiesenen Textur herumzupeeken um die endgültige Farbe für das Pixel zu bestimmen?
Klar geht das, sonst wären die Pixelshader ja ziemlich eingeschränkt.
Code:
<i>
</i>vec4 texColor = texture2D(Textur,vec2(X,Y));

Whynodd said:
Der Emu pixelt sein 320x240-Bild in den Ram. Dann painte ich ein Quad mit OpenGL auf 640x480Pixel Größe und lege das kleine Emulatorbildchen als Textur drüber.
-->Framebufferobject, ich nehm jetz einfach mal an dass es das auch bei OpenGl ES gibt.
 
Bislang gibt es ja schon ein halbes Dutzend auf der p&|a laufende Emulatoren. Mich würde mal interessieren, wie es sich bei denen mit der Filter-Sache verhält. Evtl. muss da nichts neu programmiert werden. Einen Emu - wie beispielsweise PicoDrive - für Amströng (und die Beschaffenheiten des Pandora-Displays) umzuschreiben bedeutet doch gleichzeitig, all seine Preference-Gimmicks mit zu transportieren, oder nicht? :confused:

@ED: exisitiert bei irgendeinem der Emus die Du bislang laufen hast, schon eine Filterungs-Möglichkeit?

Edit: ED: watt is denn nu midde Filters? :confused: :D
 
Dragoon said:
Jeder der ScummVM oder einen Emulator wie Snes9x kennt, hat bestimmt schon mal etwas vom SuperEagle- oder Super2xSaI-Filter gehört. Mich würde mal interessieren, ob es bezüglich der Pandora-Emus da schon genauere Infos gibt.

Da die Pandora Emus Portierungen der bekannten Emus sein dürften und die Pandora auch noch mehr Hardwareleistung bringt, sehe ich keinen Grund war das ein grosses unlösbares Problem werden könnte.
 
RMfast said:
Kann man sowas auch mit nem Pixelshader bauen? Das verringert die Prozessorlast, die je nach Emulator noch gebraucht wird.

So was kann man doch nicht in ein Pixelshader Bauen :eek: . Soweit ich weiß wirkt der Pixelshader auf 3D Modelle und dann erst auf die Textuhren, doch wir sprechen hier von einer Art Antialiasing und das kann nur auf Textuhren oder wie oben auch auf Bildern wirken also eine Art Nachbearbeitung des fertigen Bildes. Antialiasing in einen Pixelshader zu Bauen, das wäre ja wie ein Kreuzung zwischen Hund und Katze :D

Stimmt Du hast Recht. Man kann es nicht. Aber der Mann hier hat es trotzdem gemacht:

http://www.si-gamer.net/gulikoza/src/scale2x.fx

Allerdings ist es sicher nicht "mal eben schnell" in ein Programm eingebaut, welches kein
OpenGL verwendet. Beim googlen hab ich das hier gefunden: http://rainwarrior.thenoos.net/dragon/sdl_glsl.html

Da man es aber so machen würde wie unten beschrieben, also mit SDL ein Surface zusammenblitten, welches am Ende angezeigt werden würde,
dieses Surface dann als Textur für eine Quad verwenden (oder 2 Tris, da wir ja OpenGL ES verwenden :) ), sollte es machbar sein was allgemeines zu coden, was von anderen verwendet werden kann. Ein init() zur initialiserung und vorbereitung von OpenGL und ein render( SDLSurface* s) welches man vor dem swapbuffers aufruft.
 
Back
Top