zozi hat mich vor kurzem gefragt ob ich ev. eine Shader erstellen könnte um in MPC-Playern NLS zu ermöglichen.
Also habe mich also ran gemacht, die HomeAssistant-Anleitung pausiert und diesen NLS-Shader programmiert.
Mdann hatte hier schon mal begonnen. MPV Shader: Non Linear Stretch
Wobei sich mein NLS-Shader automatisch an das Seiterverhältnis der Medianquelle anpasst. Und als Nutzer kann man im Shader drei Parameter festlegen und diese für sich optimieren.
- Seitenverhältnis des Screens (Leinwand)
- Bis auf welche Größe das Bild gezoomt werden soll, bevor die Seiten gestreckt werden
- Größe des zentralen Bildbereichs ohne Verzerrung
Zusätztlich liegt dem Shader noch ein Simulator (Excel) bei, damit könnt ihr die Auswirkugnen der Parameter gut visualisieren:
Zuerst zum Simulator:
Hier könnt ihr links oben die 4 Parameter einstellen die das NLS konfigurieren.
Anm: Da ich kein Mathematiker bin, konnte ich keine universell gültig Formel herleiten, aber setzt man für die Parameter aus einem für unsere Anwendung sinnvollen Wertebereich ein, ergibt das auch ein korrektes Ergebnis. (Nur arsource sollte kleiner-gleich arscreen sein, das werde ich ev. noch ergänzen.)
Die Parameter:
- arsource: Seitenverhältnis des Quellmaterials (Wird vom Shader automatisch ermittelt)
- arscreen: Seitenverhältnis eurer Leinwand)
- zoom2width: Das Bild kann vor dem Strecken das Bild noch gezoomt werden. Trägt man hier zB. 2.0 ein, wird jedes Bild mit einem Seitenverhältnis unter 2:1 zunächst auf die Breite 2:1 gezoomt (Dadurch wird oben und unten etwas abgeschnitten)
- centerwidth: Breite des zentralen Bildbereichs (ohne Verzerrung). Der Wert ist im Verhältnis zu Bildhöhe anzugeben!
Im Diagramm darunter sieht man dann, was der Shader mit dem Bild machen wird:
- Die blaue Kurve zeigt den Faktor der Verzerrung. Diese ist hier im Zentralbereich 1. Also keine Verzerrung. Und am Rand maximal, 2,6 also 2,6x breiter als hoch. Also praktisch nicht brauchbar
- Die rote Kurve zeigt um wieviel eine Bildspalte nach außen geschoben wird. Im Randbreich also um 0,31*Höhe. Anm.: Seitlich wird nie abgeschnitten.
Für unterscheidliche Parameter beispielhaft folgende Darstellungen:
Jetzt zum Shader
In der Zip-Datei findet ihr eine Datei names NLS_NN_20240423.hlsl. Das ist ein Shader-Programm in der Direct3D-Sprache "High-Level Shader Language".
Hier könnt ihr in den Zeilen 8 bis 10 die für euch passenden Parameter eintragen oder experimentieren.
Zur Installation einfach MPC-HC/BE öffnen, die Datei als Shader imporiteren und als "Post-Resize-Shader" entragen.
Wichtig ist noch, dass ihr in MADVR, das Erkennen des Seitenverhältnisses und das Bescheiden der Letterboxen aktiviert, und dass das auch funktioniert!
Dann also nur noch einen Film starten und über das MPC-Context-Menü oder den Short-Cut <Ctrl-Alt-P> den Post-Resize-Shader ein und ausschalten.
Praktisch ist, man kann die Parameter in der HLSL-Datei zu Laufzeit ändern und die Datei speichern, dann werden die Änderungen unmittelbar aktiviert und sichtbar.
Gibt es einen Fehler in der HLSL-Datei (z.B. Strichpunkt am Zeilenende vergessen) läuft der Shader nicht und im Shader-Debugger wird eine Fehlermeldung angezeigt!
Fazit:
Mir gefällt das Bild mit NLS eigentlich nicht. Die Bildverzerrungen am Rand stören mich bei Kameraschwenks doch sehr. Daher werde ich wohl bei der seitlichen Maskierung bleiben.