GLSL filtering in Vapoursynth, suche Empfehlungen?

  • Zitat

    Nope, noch kein Degrain&Co gesehen nur generelle Smoother.

    Hab das mit den Smoothern beim ersten mal überlesen, welche kennst du da? Ausprobieren könnte man den ein oder anderen ja mal,...

  • Werde wohl bSat und filmgrain in die GUI einbauen, für die anderen baue ich erstmal keine extra Buttons&Co.


    Cu Selur

    Ist ja auch teilweise sehr speziell und ich hab's halt der Vollständigkeit halber mal aufgeführt.

    Beim SSIMDownscaler würde ich aber nochmal drüber nachdenken den etwas präsenter einzubauen. Sonst wird den allermeisten usern ein exzellenter Downscaler vorenthalten. Selbst mir, der ich Hybrid schon jahrelang benutze ist ja sogar der ganze tab filtering->vapoursynth->frame->resize irgendwie entgangen, da ich gar nicht nach sowas gesucht habe, denn es gibt ja eine extra resize section.


    Ich finde den SSIMDownscaler jedenfalls bis jetzt ziemlich überzeugend. Bild ist scharf und detailreich, nerviges ringing ist mir bis jetzt noch nicht aufgefallen und der output ist im crf Modus etwas kleiner als bei spline16 und merklich kleiner als bei lanzos und spline36. Der Speed liegt dabei bei etwa 90-95% von Lanczos/Spline.


    Aber du wolltest da ja eh generell was umstricken bei den crop/resize und filtering tabs, wenn ich das richtig verstanden hab.

  • Ne einfache Übergangslösung ohne alles umdenken zu müssen wäre erstmal ein Hinweis in der Crop/Resize section, dass es eine riesige "advanced resizer" section in der entsprechenden AviSynth/VapourSynth Abteilung gibt. Oder ein Button der einen direkt dort hinführt o.ä.

    Wär doch schad drum, wenn das viele gar nicht finden, die so blind sind wie ich ;)

  • Außer mir nutzen vermutlich auch wenige Leute für Vapoursynth die Optionen:

    • FilterQueue (anstatt der standard FilterOrder) zu nutzen
    • Filter nur auf bestimmte Szenen anzuwenden
    • Filter nur auf bestimmte Regionen (Rechteck)
    • Filter nur auf bestimmte Masken anzuwenden (z.B. nur dunkle Bereiche filtern)

    sprich es gibt sicher zick Optionen (quer durch Hybrid) welche die meisten Benutzer nicht nutzen. :)

    -> Wer interessiert ist wird es entdecken und wenn nicht dann nicht. Geht ja auch ohne das man spezielle Resizer (oder ml filter) verwendet.


    Cu Selur

  • Funktioniert bei dir das CAS-scaled von https://gist.github.com/agyild?

    Sehe da auch mit SHARPENING 1.0 keinen Unterschied.

    FSR.glsl scheint bei mir auch nicht zu gehen,..

    braucht man bei den beiden eventuell ne AMD Karte?

    Fürchte, ich weiß nicht richtig, wie ich die in hybrid korrekt einbinden soll. Wenn ich sie einfach nur als resizer einbinde und versuche von fhd nach 4k hochzuskalieren crashen beide Filter.

    Wie ich weitere parameter außer width=3840 und height=2160 wie SHARPENING=1.0 übergeben soll ist mir nicht klar, da der Punkt parameters unterhalb GLSL resizer ausgegraut ist.


    Hab dann noch in Hybrid versucht ein custom script zu erstellen und die parameter als beforeEnd funktion übergeben, einmal so:

    Code
    1. # defining beforeEnd-function - START
    2. def beforeEnd(clip):
    3. clip = core.placebo.Shader(clip=clip, shader="C:/Program Files/Hybrid/64bit/vsfilters/ResizeFilter/GLSL/CAS-scaled.glsl", width=3840, height=2160, SHARPENING=1.0)
    4. return clip
    5. # defining beforeEnd-function - END


    Und einmal so:

    Code
    1. # defining beforeEnd-function - START
    2. def beforeEnd(clip):
    3. # adjusting color space from YUV420P8 to YUV444P16 for VsGLSLResizer
    4. clip = core.resize.Bicubic(clip=clip, format=vs.YUV444P16, range_s="limited")
    5. clip = core.placebo.Shader(clip=clip, shader="C:/Program Files/Hybrid/64bit/vsfilters/ResizeFilter/GLSL/CAS-scaled.glsl", width=3840, height=2160, SHARPENING=1.0)
    6. return clip
    7. # defining beforeEnd-function - END


    Hat aber auch beides gecrashed.

  • vsPlacebo hat keine Option um einfach Parameter zu übernehmen. :)

    Code
    1. placebo.Shader(clip clip, [string shader, int width, int height, int chroma_loc = 1, int matrix = 2, int trc = 1, string filter = "ewa_lanczos", float radius, float clamp, float taper, float blur, float param1, float param2, float antiring = 0.0, int lut_entries = 64, float cutoff = 0.001, bool sigmoidize = 1, bool linearize = 1, float sigmoid_center = 0.75, float sigmoid_slope = 6.5, string shader_s])

    Quelle: https://github.com/Lypheo/vs-p…slope--65-string-shader_s

    Aber über den shader_s kann man etwas tricksen. ;)

    Als Beispiel kannst Du Dir anschauen, was Hybrid macht wenn Du "Adaptive Sharpen (GLSL)" verwendest.

    Code
    1. # adjusting color space from YUV420P8 to YUV444P16 for vsGLSLAdaptiveSharpen
    2. clip = core.resize.Bicubic(clip=clip, format=vs.YUV444P16, range_s="limited")
    3. with open("i:/Hybrid/64bit/vsfilters/GLSL/parameterized/adaptive-sharpen.glsl") as glslf:
    4. glsl = glslf.read()
    5. glsl = glsl.replace('#define curve_height 1.0', '#define curve_height 1.0000')
    6. glsl = glsl.replace('#define anime_mode false', '#define anime_mode false')
    7. glsl = glsl.replace('#define overshoot_ctrl false', '#define overshoot_ctrl false')
    8. glsl = glsl.replace('#define video_level_out false', '#define video_level_out false')
    9. clip = core.placebo.Shader(clip=clip, shader_s=glsl, width=640, height=352)

    Da wird:

    • nach YUV444P16 umgewandelt.
    • der Filter in die glsl-Variable geladen.
    • einige Ersätzungen gemacht
    • der Filter angewendet


    Wenn man in so etwas im 'Custom'-Bereich macht.

    Muss man:

    • Hybrid wissen lassen, dass man die Auflösung und das colorformat geändert hat ("# width ..", "# height ... # colroformat")


      Hybrid würde da dann:


    • Hybrid wissen lassen, dass diese Änderung auch die Ausgabeauflösung ändert. ('Filtering->Misc->Overwrite Output->Width to' 'Filtering->Misc->Overwrite Output->Height to')

    Sehe aber gerade da ist noch ein Bug, da der "Filter View" da noch nicht geht, da die Original Ansicht nicht an die gefilterete Auflösung angepasst wird.

    Das werde ich heute Nachmittag fixen.


    Cu Selur


    Ps.: für das CAS muss man aber noch mehr anpassen weil das auf linear light arbeitet wenn ich mich recht entsinne.

  • Ja, da muss man immer etwas anpassen, bei mpv durch die autoproflies mehrere/richtige Varianten einsetzen.


    mit CAS hab ich jetzt noch nicht viel gemacht. Aber du meinst mit der scaled Version?

    hast du die CAS.glsl auch probiert?


    Auf der Seite sind meist mehrere glsl Varianten. z.B. NVScaler und NVSharpen

    oder CAS-scaled.glsl und CAS.glsl

  • NVScaler ist mir spontan nicht klar,...

    Was sind denn für Werte für NIS_THREAD_GROUP_SIZE erlaubt und muss ich dann in der '//!COMPUTE 32 24 256 1'-Zeile nur die '256' ändern oder noch was anderes?

    (gerade keine Zeit zum Testen)


    Cu Selur

  • Du musst NIS_THREAD_GROUP_SIZE und die COMPUTE Befehl ändern. Muss der gleiche Wert sein.


    NIS_THREAD_GROUP_SIZE: number of threads per group. Use GetOptimalThreadGroupSize query for your platform


    Code
    1. constexpr uint32_t GetOptimalThreadGroupSize()
    2. {
    3. switch (gpuArch) {
    4. case NISGPUArchitecture::NVIDIA_Generic: return 128;
    5. case NISGPUArchitecture::NVIDIA_Generic_fp16: return 128;
    6. case NISGPUArchitecture::AMD_Generic: return 256;
    7. case NISGPUArchitecture::Intel_Generic:return 256;}