geringe Auflösung in höherer Auflösung abbilden



  • ich arbeite an einem Emulator für die Spielkonsole Super Nintendo.

    das snes kennt 4 verschiedene Auflösungen: 256 x 224, 256 x 448, 512 x 224, 512 x 448.

    Ok ich habe die Bildinformationen in einem mit dem new operator angelegten Speicherbereich, welcher 512 x 448 x 2 bytes belegt. jede Pixel Information ist 2 byte gross um einen Farbwert aus einer 15 bit Farbpalette zu beschreiben. Wird eine horizontale Auflösung von 256 Pixel verwendet, wird der gleiche Farbwert doppelt geschrieben. Wird eine vertikale Zeilenzahl von 224 verwendet, bleibt immer eine Zwischenzeile schwarz (scanlines) oder die Zeile wird doppelt geschrieben. Bei 448 Zeilen arbeitet das Snes im Halbbildverfahren.

    Die Auflösung 512 x 448 ist nicht im 4:3 Verhältnis. Auf einem TV wird sie hingegen 4:3 dargestellt, was natürlich bedeutet das keine quadratischen Raster dargestellt werden. Ich denke das TV teilt seine horizontale Breite in 512 Raster ein.

    Mein Anliegen ist, wie stellt direct x die Auflösung 512 x 448 dar, wenn die Vollbild Auflösung sagen wir 800 x 600 ist. Der Monitor stellt quadratische Pixel dar. Wie arbeitet der Algorithmus? Werden ausgewählte Pixel doppelt gesetzt? Ich habe Schwierigkeiten mir vorzustellen, wie das funktioniert. Können Monitore auch nicht quadratische Pixel darstellen?



  • wie stellt direct x die Auflösung 512 x 448 dar, wenn die Vollbild Auflösung sagen wir 800 x 600 ist

    das kommt darauf an, welche (directx-)funktionalitaet du benutzt um deine 512x448-bitmap auf die groesse des 800x600-backbuffers zu bekommen 😉
    die standard-mechanismen drehen deine bitmap dafuer ordentliche durch die bilineare filterwurst - was gerade bei pixelgrafik keine gute idee ist.


  • Mod

    du kannst eventuell fuer vollbild einen 512*448 modus selektieren und dann konvertiert die graka des PCs es vermutlich auf die selbe art und weise wie es die graka des snes getan hat. (ich glaube fernseher selbst koennen keine verschiedenen aufloesungen fahren, jedenfalls nicht die alten.)



  • Die meisten Emulatoren werten das Bild optisch auf, indem sie einen Vergrößerungsfilter wie hq2x oder hq3x anwenden. Mit hq2x habe ich selber auch schon gearbeitet (640x480 -> 1280x960) und bin damit zufrieden.



  • ich bin mir nicht so sicher ob das snes 512 x 448 an den TV ausgibt und dieser sich um die Scalierung kümmert. Eins weiß ich, z.b der ntsc TV arbeitet mit 625 Zeilen. Das ist bei jedem "alten" ntsc TV so. Das macht ca. 480. sichtbare Zeilen. Die horizontale Ausdehnung (Raster) hingegen ist von TV zu TV verschieden, abhängig von der Qualität(max. 720). Jedoch hat praktisch kein TV die Qualität 720 Rasterpunkte in der horizontale derart abzubilden, dass man sie zweifelsfrei von einander unterscheiden kann. Darum denke ich, daß das Snes nur 256 bzw 512 Bildpunkte an den TV sendet und dieser sein Raster entsprechend einstellt. Bei einer vertikalen Auflösung von 224 arbeitet das Snes im progressiv scan, das heisst es werden 60 (ntsc) echte Bilder dargestellt. 224 Zeilen passen in ein Halbbild, somit braucht das Snes nicht das komplette Bild aus 2 zeitversetzten Halbbildern aufzubauen. Bei einer vertikalen Zeilenzahl von 448 oder bei bei overscan 478 werden quasi alle Zeilen des TV's zur Darstellung benötigt und das Snes arbeitet mit Halbbildern, somit können nur noch 30 (ntsc) volle Bilder pro Sekunde dargestellt werden, dafür in der doppelten Auflösung.

    also kann ein TV in der vertikalen die Auflösung nicht ändern in der horizontalen schon (Raster), bin mir aber nicht 100 % sicher.

    Den bilinearen Hardwarefilter verwende ich auf jeden Fall "D3DTEXF_LINEAR" und natürlich eine normale Darstellung "D3DTEXF_POINT".

    Ich denke nur, wenn der Monitor keine nicht quadratischen Pixel darstellen kann, wird es nicht 1:1 wie auf dem TV aussehen. Ich glaube aber auch, das menschliche Auge wird das nicht wahrnehmen können, wegen der unsauberen analogen TV Darstellung. Im Gegensatz dazu wiederum, lässt sich die unsaubere TV Datstellung nicht auf einem PC Monitor nachempfinden, vielleicht mit Software Filtern.

    andere Frage:

    if (d3dcaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES)

    macht diese Abfrage überhaupt Sinn oder unterstützt quasi jede Graka der letzten Jahre D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES?

    Es geht darum, dass ich z.B. die Bild Ausgabe nicht in der aktuellen Vollbildauflösung darstellen will, sondern in ein Rechteck bestimmter Auflösung scalieren möchte. Um der Ausgabe wäre dann ein schwarzer Rahmen zu sehen.


Anmelden zum Antworten