madVR 概述

(madVR 的开发者,德国人 Madshi)对于 madVR 渲染器,使用 PC 视频播放器的用户不会陌生。说它是 PC 电脑上的最强渲染器一点都不为过。有了它,PC 播放的画质超过顶级蓝光播放器不再是” 不可能的任务 “。即使是这个神一般的工具,使用起来依然与大多数 PC 软件一样 - 设置选项繁多而且复杂。再加上这是一个由德国人开发的软件,菜单统统是英文的,对于大多数用户来说并不是很友好。

即使看到过几篇关于使用电脑播放器 + madVR 播放的文章,感觉作者也只是人云亦云,一知半解。以为自己安装了 madVR 就万事 OK 了。殊不知,madVR 的强大远远超出了人们的想象。

幸好,一名叫做 “萬年冷凍庫” 的朋友(应该是台湾人),在 Blogspot 发布一篇大约 3 万字的 madVR 使用指南。详细到每一项设置该如何调整,最终测试效果如何。相信读完这篇文章,大家都能成为 PC 视频播放的高手。原文在此:萬年冷凍庫:系列之 3─最強渲染器 - madVR

由于一些不可抗力的原因,原文页面无法被大多数人访问,因此一烧体验馆将此文章搬运过来,分 2 篇进行连载。

上篇 最强渲染器 madVR - 使用指南(上篇)

下篇开始 (以下约一万字,请收藏文章后阅读)

=================

Scaling algorithms

简单介绍

接下来要进入重头戏,关于 scaling 算法的设置,这部分是影响效能最大也是影响画质表现最明显的地方,也是 madVR 的最大特色,我们可以看到有四个地方需要设置算法,分别是 chroma upscaling、image downscaling、image upscaling 和 upscaling refinement

简单解释一下这四者的意义:

  1. chroma upscaling 是指色度升频,通常我们常见的 YCbCr 4:2:0 的图像文件就是经过色度抽样的,人眼对色度的改变不及亮度敏感,所以用较多的信息储存亮度信息 (Y),较少的信息储存色度信息 (CbCr) 以节省带宽,以 YCbCr 4:2:0 而言,水平方向及垂直方向的色度分辨率都只有 YCbCr 4:4:4 的一半。举例来说,一个分辨率 1920*1080 的影片,在 4:4:4 的情况下,亮度分辨率是 1920*1080,色度分辨率也是 1920*1080,但是在 4:2:0 的情况下,亮度分辨率一样是 1920*1080,色度信息水平和垂直都只取一半,也就是说色度分辨率是 960*540。常见的影视内容多半是抽样成 4:2:0 储存,因此我们播放一个 YCbCr 4:2:0 的图像文件时,首先要将其色度信息升频到原始分辨率,也就是 YCbCr 4:4:4,这时就会用到色度升频的算法。关于色度取样的相关知识也可参考维基百科:色度抽样 - 维基百科,自由的百科全书 (wikipedia.org)

  2. image downscaling 就是指影像降频,也就是影像缩小,只要目标分辨率小于原始分辨率就会用到这部分的算法。

  3. image upscaling 就是指影像升频,也就是影像放大,只要目标分辨率大于原始分辨率就会用到这部分的算法。

  4. upscaling refinement 这部分是锐化算法,跟前面的 iamgeenhancements 不同,其目的在于改善放大演算后造成的模糊,作用在放大演算之后,属于 post-processing。如果是 1:1 无放大的影像,这部分勾选了也不会有作用。

chroma upscaling

通常一个图像文件播放,到渲染器这步骤时,渲染器会先对其做色度升频,然后再将其原始分辨率依需要做影像升降频到目标分辨率,也就是说,一个 1080p YCbCr 4:2:0 的档案,就算在分辨率 1920*1080 的屏幕播放,它不需要做任何影像升降频演算,但还是需要做色度升频的演算。

chroma upscaling 里面指定的的算法,在完成原始分辨率 YCbCr 4:2:0→RGB 4:4:4 的升频后即完成任务,之后影像要放大缩小都跟其无关。后续的 resize 需要的亮度和色度升降频由 image upscaling 或是 image downscaling 所指定的算法来负责。

在对视觉感受的影响上,影像升降频算法的影响比色度升频演算的影响要大得多。换句话说,改变影像升降频的算法,你比较容易感觉的到差别,改变色度升频的算法比较难感受到差别。

接下来我们来看看算法内容,右上角有个表格,每种算法有不同的数值,通常绿色是优点 (sharpness = 锐利度),越高越好,红色部分是失真,缺陷 (aliasing = 锯齿、ringing = 振铃效应),越低越好。

再来以各算法的消耗效能来说,Nearest Neighbor、bilinear、DXVA2 这几种消耗的效能最低 (DXVA2 在此处是指 DXVA-scaling,这项演算优劣直接受显卡影响,因卡而异,有些类似 bilinear,有些则类似 Bicubic 或 Lanczos 的水平),再来是 Cubic (Mitchell-Netravali、Catmull-Rom、Bicubic、Softcubic) 这几种,消耗效能其次,再来是 Lanczos、Spline,消耗效能又高一点,再来是 Jinc 和 super-xbr,消耗效能更高,不过效果也比前面几种都好,再来是 NGU 系列,NGU-low 消耗跟 Jinc 差不多;NGU-med 以上消耗比 Jinc 多,但效果也更好。

此外,勾选 "activate anti-ringing filter"(以下简称 AR) 能够有效的抑制算法本身产生的振铃效应,相对的也会增加一点点效能消耗。

看到 chroma upscaling 这页,上面也提过 chroma upscaling 的提升对整体画面的影响比较难察觉,通常只会影响一些颜色边缘、色块,在一些对比高的场景才会看得到一点点差别 (红底黑字或黑底红字之类),故不用投资太多效能在这里。

几个建议的设置是 super-xbr 100 以上 + AR、NGU Anti-Alias (以下简称 NGU AA) low、med、high (chroma upscaling 这边设到 very high 没必要)、Bilateral (soft 或 sharp) 或 Reconstruction (soft)。

NGU-Sharp 则在锐利度的表现不错,其锐利度仅次于 Reconstructionsharp 和 placebo,但有些地方会有点锐化过头,个人不是很喜欢。另外就是抑制 artifacts 的能力,这边我没有做太多测试,doom9 上有几位认为这一项 super-xbr + AR 或 Reconstruction soft 又比 NGU-Sharp 好一点,仅供参考。

super-xbr + AR、NGU-low 或 med、Bilateralsoft、Reconstruction soft 这几个效能消耗都差不多。

上面几个跑不动的话,再退一步则是 Cubic (Bicubic 75)+AR,或不开 AR,还是跑不动的话才用 Bilinear。

根据 madshi 说法 NGU 在这边还非最终版本,以后还会像 Bilateral 一样加入 luma channel 做为参照,所以也许 NGU 的一些不足之处还有进步空间,可以期待一下。

这边提一下 Bilateral,它是以亮度频道 (luma channel) 做为色度的参考,但是其结果比较极端,受片源影响很大,有些片源它的色度升频效果明显比 NNEDI3 和 super-xbr 甚至目前的 NGU 还要好,但有些却又比较糟糕。

Bilateral 有三个版本,old 是原始版本,消耗的资源很少,大概跟 Bicubic 差不多,但上面提到的受片源影响最明显,soft 和 sharp 则是改良版本,资源消耗跟 super-xbr 差不多,sharp 比 soft 锐利一些。

Bilateral soft 或 sharp 拿来当常驻选项也是一个不错的选择,个人喜欢 soft 多于 sharp

而 Reconstruction 算是基于 Bilateral 的改造版本,也有三个版本,soft 比较泛用,不会那么极端,但相对优点就没那么明显,sharp 跟 placebo 则强化了锐利度 (另外两个是各加了 AR 滤镜),但有时候会让人觉得锐化过头了,而且效能消耗比 soft 高太多,个人不是很建议,不过请自行判断,也许有人喜欢。

Reconstruction 系列中个人认为比较适合当常驻的是 Reconstruction soft

下面 AR 滤镜基本上能开就开,至于要不要开 SuperRes 则见仁见智,个人是不喜欢开 (这边的 SuperRes 跟后面 upscaling refinement 里面的 SuperRes 并没有关系,是各自独立的选项,但一样都是额外做锐化处理)

在我个人的测试中 Bilateral soft 是我最喜欢的选项,锐利度跟抑制 artifacts 效果都很棒很平衡,其次是 NGU-AA high,但我不是很确定 Bilateral soft 会不会有表现比较糟的片源,所以这个仅供参考。super-xbr100 或 125 + AR 和 Reconstruction soft 则是 doom9 上比较多人推荐的选项,但我个人觉得有点不够锐利就是了。

另外值得注意的是,不同分辨率 / 帧率的片源对于 chroma upscaling 的效能消耗也不同,像 4K>>1080>480,这方面的差别,需要透过设置 profile 才能达到最大限度的显卡资源应用。

image downscaling

在 image downscaling 的部分,SSIM 是目前表现最好的算法,在缩小画面的同时很好的保留了原分辨率的细节跟锐利度,不过效能消耗也比较大。1D 是以 Bicubic 为基础,2D 则是以 Jinc 为基础,在 4K→FHD 的场合,某些场景中 2D 比 1D 稍微好一点点,但是效能消耗大很多,请斟酌使用。(以 GTX 960 来说,4K@60p→FHD 屏幕,只能开到 1D,2D 会负荷不了) 后面的强度 % 数越高画面越锐利,但相对的可能会让画面有些刺刺的,哪个强度比较适合自己请自行测试。另外建议勾选 "activate anti-ringing filter"(以下简称 AR) 跟 "scalein linear light"(以下简称 LL)。

AR 滤镜后面有一个 strict (soft) 跟 relaxed,前者是 AR 滤镜预设强度,后者是降低 AR 滤镜强度,换得一些锐利度的提升 (但 ringing 也会比较多),relaxed 个人认为一些本身就比较柔和的算法比较适合,像 Catmull-Rom,不过这个没有绝对,自己试试看比较重要。

至于 "activate anti-bloating filter"(以下简称 AB),它会强化高频讯号并移除低频讯号,用在 SSIM 上面,效果很类似直接把强度 % 数降低,不过 madshi 认为某些场景用 AB 滤镜效果比直接降低 % 数好,需不需要用这个滤镜,要用的话要开多强,也是请各位自行测试,每个人喜好跟观赏环境不一样。

如果显卡跑不动 SSIM 的话,次一级的选项是 Cubic (Bicubic 150)+AR+LL,再次一级是 Cubic (Catmull-Rom)+AR+LL,如果还是跑不动再依次把 LL 跟 AR 拿掉,还是跑不动的话最后再去考虑 bilinear 或 DXVA2

值得注意的是,降频演算跟升频演算一样,各种算法的差异也是倍率差越多越明显,例如在 4K→1080 的场合,有些场景我可以观察到 SSIM 2D 跟 SSIM 1D 的差别,但如果是 1440→1080 的场合,就很难看出差别了,而如果是升频再降频的场合,例如 720→1440→1080,由于升频上去的影像本来细节就比原生高分辨率的影像少,因此这时候 SSIM 1D 和 Bicubic 150 的差别也很小了。如何对各种不同分辨率的影片作最适合的设置以达到最好的效能利用,就要靠 profile 设置了。

备注:madVR v0.91.4 之后,"升频再降频" 所使用的降频算法不在 image downscaling 里设定,而是在 image upscaling 里的子选项 "if any (more) scaling needs to be done:" 里设定

image upscaling

接下来看到 image upscaling,Bilinear 和 DXVA2,是对于一些比较弱的显卡或内显,效能无法负担其他任何算法时的选择,但其效果远不如其他算法。

Cubic 系列 (image upscaling 这边一般使用下拉式选单里的 Bicubic,后面数字越高锐化越高,但超过 100 的不建议) Lanczos、Spline 这几种,效能消耗在伯仲之间 (Lanczos、Spline 比 Cubic 略高),而效果互有利弊,可参考右上角图表,一般来说 Lanczos 比 Spline 和 Bicubic 好一点。而 Jinc,效能消耗比上面三种高一点,锐利度稍低于 Lanczos,但对于 artifacts 的抑制做得很好,综合表现在上面三种之上。使用这几种算法时,下面的 "activate anti-ringing filter"(AR 滤镜) 都建议勾选,至于 "scalein sigmoidal light" 这个选项,照 madshi 的说法它在有些场景可以稍微降低一些锯齿 (aliasing),但某些场景可能又糟一些些,故各位自行测试决定要不要勾。

至于 super-xbr 和 NGU 系列,比较特别一点,它只能做 2 的次方倍的放大 (2 倍、2 倍再 2 倍 = 4 倍),不过 NGU-(Sharp、Standard、Soft) 可以做 4 倍的直接放大。就效果而言,这几种算法 (尤其是 NGU 系列) 跟其他几种完全不是同一等级,提升非常明显,当然效能消耗也会比较大。同时,很多情形下 2 的次方倍放大不会刚好等于目标分辨率,所以还会需要其他的升降频算法辅助把画面 scale 到目标分辨率。

NGU 系列下面第一个下拉式选单里,algorithmquality–luma doubling,即亮度分辨率的翻倍,选择 luma 的运算强度,有四个等级,very high (非常高)、high (高)、med (一般)、low (低),越高运算越精密,消耗的效能也越多,low 的效能消耗大概跟 Jinc 差不多。在锐利度上四者有一点点差别但不是差很大那种,very high 在线条的聚焦上会稍微好一点点,最主要是差在 artifacts 的抑制程度,越高抑制效果越好。

第二个下拉式选单,luma quadrupling,这项选择 "let madVR decide" 的话,会自动根据 luma doubling 里的翻倍强度设定来决定二次翻倍是否启用和强度。NGU Anti-Alias (以下简称 NGU-AA) luma doubling 选 low~med,"let madVR decide" 不会启用二次翻倍,lumadoubling 选 high~very high 则 "let madVR decide" 二次翻倍会使用 med。

选择 "disable" 则是不启用二次翻倍。

另外 NGU-(Sharp、Standard、Soft) 可以自行指定四倍放大时是使用 "翻倍后再翻倍" 的再次翻倍 double again 模式,或是直接四倍放大 direct quadruple 模式 (NGU-(Sharp、Standard、Soft) 限定,AA 没有)。纯以锐利度来说 double again 会比 direct quadruple 高一点,但 direct quadruple 效能消耗会比 double again 低很多,而且对于噪声抑制和整体自然感而言 direct quadruple 都比较好,个人推荐 direct quadruple,NGU-(Sharp、Standard、Soft) 选择 "let madVR decide" 的话预设也就是用 directquadruple。

第三个下拉式选单,chroma,影响色度升频到目标分辨率所使用的算法,选择 "let madVR decide" 时,luma doubling 选择 low~high,会使用 Bicubic60+AR;luma doubling 选择 very high,会使用 NGU-med。

  • normal = Bicubic60+AR

  • high = NGU-low

  • very high = NGU-med (此项如果 luma doubling 设定 high 时会跳回 high)

第四个下拉式选单,activate doubling,是设定翻倍的启用条件,达到条件才会启用 NGU 进行翻倍。

  • NGU-AA 的选项:

选择 "let madVR decide" 时,默认是目标分辨率宽或高大于或等于原始分辨率 1.2 倍时启用,没达到 1.2 倍启用条件的话则会使用 Jinc+AR 替代。

  • NGU-(Sharp、Standard、Soft) 的选项:

选择 "let madVR decide" 时,默认是目标分辨率宽或高大于或等于原始分辨率 1.2 倍时启用,没达到 1.2 倍启用条件的话则会使用 Jinc+AR 替代。

  • 其他选项:

    • …only if scaling factor is 2.0x (orbigger) 当目标分辨率宽或高大于或等于原始分辨率 2 倍时启用

    • …only if scaling factor is 1.5x (orbigger) 当目标分辨率宽或高大于或等于原始分辨率 1.5 倍时启用

    • …only if scaling factor is 1.2x (orbigger) 当目标分辨率宽或高大于或等于原始分辨率 1.2 倍时启用

    • …only if any upscaling is needed 只要目标分辨率宽或高大于原始分辨率就启用

    • …always - supersampling 强制启用,即一般所谓的 "超取样"

关于超取样,选择此项的话即使在 1:1 播放时 (例如 1920*1080 影片在 1920*1080 屏幕上播放),也会启用翻倍算法 (看选的是 super-xbr 还是 NGU),强制升频后再降频回来,这个使用在 super-xbr 或 NGU-AA 时一般是搭配 upscaling refinement 里面的锐化算法一起用来取得锐利度的强化,当独使用并没什么效果。或是使用在 NGU-Sharp 时,可以受惠于它自带的 deringing 效果。不过这个选项并不是很建议,除非你的显卡效能非常强非常够用,而且实际使用上也真的看的出 1:1 播放强制升频再降频的画面区别才去用它,千万不要盲目的认为用了画质一定会变好。

第五个下拉式选单,activate quadrupling,是设定二次翻倍的启用条件,达到条件才会启用 NGU 进行二次翻倍。

  • NGU-AA 的选项:

选择 "let madVR decide" 时,默认是目标分辨率宽或高大于或等于原始分辨率 2.4 倍时启用。(但如果前项手动设定成 1.5 倍启用的话这边会变成 3 倍启用;如果前项手动设定成 2 倍启用的话这边会变成 4 倍启用)

  • NGU-(Sharp、Standard、Soft) 的选项 (第二个选单选择 doubleagain 时):

选择 "let madVR decide" 时,默认是目标分辨率宽或高大于或等于原始分辨率 2.4 倍时启用。(但如果前项手动设定成 1.5 倍启用的话这边会变成 3 倍启用;如果前项手动设定成 2 倍启用的话这边会变成 4 倍启用)

  • NGU-(Sharp、Standard、Soft) 的选项 (第二个选单选择 directquadruple 时):

选择 "let madVR decide" 时,默认是目标分辨率宽或高大于或等于原始分辨率 2.00001 倍时启用。(直接四倍消耗比再次翻倍小很多,所以自动启用判定很宽松)

  • 其他选项:

    • …only if scaling factor is 4.0x (orbigger) 当目标分辨率宽或高大于或等于原始分辨率 4 倍时启用

    • …only if scaling factor is 3.0x (orbigger) 当目标分辨率宽或高大于或等于原始分辨率 3 倍时启用

    • …only if scaling factor is 2.4x (orbigger) 当目标分辨率宽或高大于或等于原始分辨率 2.4 倍时启用

    • …only if any upscaling is needed 只要目标分辨率宽或高大于原始分辨率就启用

第六个下拉式选单,if any (more) scaling needs to be done – upscaling algo,则是当翻倍或二次翻倍后,可能还小于目标分辨率,必须再升频到目标分辨率,这个选项影响此时使用的升频算法,选择 "let madVR decide" 时,luma doubling 选择 NGU-low~high,会使用 Bicubic60+AR;luma doubling 选择 NGU-very high,会使用 Jinc+AR。也可以直接指定想用的算法。

第七个下拉式选单,if any (more) scaling needs to be done – downscaling algo,则是当翻倍或二次翻倍后,可能大于目标分辨率,必须再降频一次到目标分辨率,这个选项影响此时使用的降频算法,选择 "let madVR decide" 时,Luma 选择 NGU-low~high,会使用 Bicubic150+AR;Luma 选择 NGU-very high,会使用 SSIM1D100+AR。

如果不想用上面两种算法,可以选择 "use image downscaling settings",沿用 imagedownscaling 里面的设定。或也可直接指定选单里任何一种你想用的算法。(doom9 有很多使用者认为升频再降频用的算法不需要加 LL,当然这个主要还是看个人喜好)

现在的 madVR 版本,使用 NGU 系列时其实几乎只要指定 luma (doubling 和 quadrupling) 的强度就好,其它交给 "let madVR decide" 就自动帮你选择好了,其实非常方便,对于新手来说友善多了,也避免了一些无谓浪费效能的设定。

另外关于 super-xbr,个人认为它可以被 NGU 取代,不过有些人还是会想要使用它 (可能因为效能消耗够低,约等于 Jinc+AR 的程度,或是其它原因等等),这部分选项上跟 NNEDI3 和 NGU 大同小异,第一个下拉选单是选择锐化程度,一般选择 100 左右,可依自己喜好调整。第二个下拉式选单是选择是否要二次翻倍及二次翻倍锐化程度。

第四个下拉式选单,选择 "let madVR decide" 时,默认是目标分辨率宽或高大于或等于原始分辨率 1.2 倍时启用,没达到 1.2 倍启用条件的话则会使用 Jinc+AR 替代。

第五个下拉式选单,选择 "let madVR decide" 时,默认是目标分辨率宽或高大于或等于原始分辨率 3 倍时启用 (但如果前项手动设定成 2 倍启用的话这边会变成 4 倍启用)。

而第六个下拉式选单 (upscaling algo),选择 "let madVR decide",会使用 Bicubic60+AR;第七个下拉式选单 (downscalingalgo),选择 "let madVR decide",会使用 Bicubic150+AR。

以下举几个例子来说明整个流程,设定如上图,屏幕分辨率是 1920*1080,

当我要播放一个 1280*720 的影片时,首先:

YCbCr 1280*720 4:2:0 → RGB1280*720 4:4:4 (chroma upscaling 算法)

RGB 再转回 YCbCr 并把 Y (亮度频道) 跟 CbCr (色度频道) 拆开处理

1280*720 亮度分辨率升为 2560*1440 (符合 1.2 倍条件,NGU Sharp 翻倍启用,强度 high)

1280*720 色度分辨率升为 1920*1080 (chroma 选项决定,此例会使用 Bicubic60+AR)

亮度分辨率 2560*1440 → 1920*1080 (downscaling algo 选项决定,此例会使用 Bicubic150+AR)

合并色度信息和亮度信息,转换为 RGB 输出 1920*1080 到屏幕上

设定如上图,当我要播放一个 640*360 的影片时,首先:

YCbCr 640*360 4:2:0 → RGB 640*3604:4:4 (chroma upscaling 算法)

RGB 再转回 YCbCr 并把 Y (亮度频道) 跟 CbCr (色度频道) 拆开处理

640*360 亮度分辨率升为 2560*1440 (符合 2.00001 倍条件,NGU Sharp 直接四倍启用,强度 veryhigh)

640*360 色度分辨率升为 2560*1440 (chroma 选项决定,此例会使用 NGU-med 直接四倍)

色度和亮度分辨率 2560*1440 降为 1920*1080 (downscale algo 选项决定,此例会使用 SSIM1D100+AR)

合并色度和亮度信息,转换为 RGB 输出 1920*1080 到屏幕上

对于各种算法的选择,实际上还是要依显卡等级,各种不同的片源及对各种算法的主观感受去调整,找出能够顺畅播放而且自己看了也喜欢的组合,强烈建议设置 profile,可以编写切换逻辑或设置热键方便快速切换,这方面需要经过一定时间的测试才能找出最适合自己计算机的设定。

另外要如何判断显卡负荷不负荷的了此种算法呢?第一个当然是看画面会不会很顿,再来看看 GPU 使用率是否高达 9X% 快破表,再来也可以在播放时按 Ctrl+J 叫出 OSD,看看有没有掉帧 (dropped frames),render queue 是否一直很低,rendering time 是否超过 movie frame interval,如果都没有那就恭喜啦,可以放心看片!

现在我们来谈谈关于 NGU 系列,在此之前不得不先谈到 NNEDI3,NNEDI3 这个算法原本是在转文件编码时用来升频及去交错等等处理的算法,因为其消耗资源过大,速度不够快到可以拿来做实时演算 (real-time),因此一直没被拿来用在影片播放时使用的升频演算。直到 Doom9 上有高手重新编写了这个算法的 OpenCL 版本,madshi 将之修改之后加入到早先的 madVR 版本之中实现了此算法的实时演算 (现今版本已经拿掉),即使如此,这个算法消耗的显卡资源仍然相当惊人,但它带来的升频效果也是同样惊人,可以打趴一堆高阶蓝光机和高阶电视号称的 4K 影像升频,绝不夸张。

我们可以看到 madshi 自己对这个算法的说明和范例图片:

madVR - high quality video renderer (GPU assisted) - Page 1080 - Doom9’s Forum

基本上除了 2^N 倍的限制之外,这个算法升频出来的影像,锐利度和噪声抑制程度相比 Jinc+AR,都有着可说是跳跃性的进步,它有让影片看起来不像是升频上来的影片的实力,但是这个算法也并非完美,它在某些场合中可能会出现一些莫名其妙的 artifacts (原因似乎是因为它 "太聪明"),madshi 的范例里就有这个现象,这些是在使用 Jinc 时不会出现的,提高运算强度的话可以减低这些 artifacts 的出现,但消耗的效能也是倍数成长。

这边也提供一个简单测试比较:

原始分辨率 640*360 (点图放大)

目标分辨率 1440*810 (点图放大) NNEDI3 64

目标分辨率 1440*810 (点图放大) Jinc+AR

How amazing!! right?

不过其实 Jinc+AR 比较 "忠于原味",NNEDI3 则把锯齿状线条都拉成直的还不失锐利度,整体观感会比较讨喜,当然这只是一个小例子,真要比较必须要用大量的影片来比较才会比较中肯。以实测的结果来说,NNEDI3 对于低解析影片,多反差线条 (游戏或动画的影片),锯齿边缘明显的改善最为明显且巨大,对于真人影片比较没那么神奇的效果,虽然仍就有非常优异的表现,但跟 Jinc+AR 的差别就没上面那个例子那么大了。所以由此可见,影片的内容也是选择算法的重要因素。

接下来谈谈 NGU 吧,这是 madVR v0.91 之后加入的新算法,全名是 "Next Generation Upscaling",是 madshi 自己写的算法,据他的说法也花了不少时间研究、参考好几篇论文加上他自己的 idea 才做出来的东西,就实测效果来看颇令人惊艳,在很多地方可以说已经超越了 NNEDI3。NGU 有四个版本 (AA、Soft、Standard、Sharp),其中 Sharp 几乎就是最原始的 NGU 版本,其目的是尽可能把低分辨率影像还原到接近高分辨率 "母片" 的程度,在不增加 artifacts 的前提下。下面两个连结是 madshi 自己 po 的测试图,里面的 NG1 就是 NGU 之前暂定的名称

madVR - high quality video renderer (GPU assisted) - Page 2002 - Doom9’s Forum

madVR - high quality video renderer (GPU assisted) - Page 2006 - Doom9’s Forum

可以发现,NGU 的锐利度胜过 NNEDI3 不少,接近 NNEDI3 256+SuperRes 4,而画面又比 NNEDI3 256+SuperRes 4 更接近原图,仅次于 waifu2x (但 waifu2x 是对照用,运算太复杂不可能在实时演算使用)

不过高度还原这点虽然是优点但有些情形下也可能变成缺点,在我个人的测试中,NGU-Sharp 的确非常适合真人类的影片,其他算法没有一个锐利度比它好而 artifacts 更少的,包括 NNEDI3,NNEDI3 要达到 NGU-Sharp 的锐利度至少要搭配 SuperRes 4,但这个组合 artifacts 又比 NGU 严重一点,效能消耗也高很多。但对于动画类而言,NGU-Sharp 虽然也有很惊人的效果,但提前是片源必须够 "干净",如果片源本身有很多 artifacts 或锯齿的话,这些也会被 NGU-Sharp 当成细节如实的放大,出来的结果就有点残念了,偏偏动画类,尤其是低分辨率或是高压缩比的,这种情况还不少。NNEDI3,如同我前面提过的,对治这种片源缺陷的能力特别强大,而锐利度不足的地方则可以透过锐化算法补齐,达到跟 NGU-Sharp 接近的锐利度。

在 0.91.6 版发布时,madshi 加入了 NGU 的另一个修改版本─ NGU-AA,这个版本跟原始 NGU (NGU-Sharp) 大不相同,不过度的强调细节还原,而是如同其字面意义 Anti-Alias,强化消除线条锯齿和画面的 artifacts 等缺陷的能力,也就是说,跟 NNEDI3 非常的类似,但却可以比 NNEDI3 花费更少的效能就做出相同甚至超越的结果。在我个人的测试中,某些画面它消除锯齿的能力比 NNEDI3 还要好,而线条也比 NNEDI3 更为聚焦,其它的画面至少也跟 NNEDI3 差不多,而 doom9 上大部分使用者也认同画面上 NGU-AA 略胜或不输 NNEDI3。因此最后 madshi 决定把 NNEDI3 自 madVR 中移除,把 NGU 系列作为 madVR 的招牌升频算法。

目前对于低分辨率或是高压缩比动画类我个人会视情形,如果锯齿不是很严重的话,我会使用 NGU Sharp+RCA 算法,RCA 对 artifacts 有很好的抑制效果,再配上 NGU Sharp 的高还原度可谓天作之合。如果是干净的片源则单独使用 NGU-Sharp。如果是锯齿严重的片源,则使用 NGU-AA,当然 NGU-AA 可以再搭配锐化算法使用,效果比单独使用 NGU-AA 更好。

另外关于 NGU-Soft 和 NGU-Standard,跟 NGU-Sharp 的基本调性是一样的,只是降低锐化的程度,有些画面用 NGU-Sharp 放大的结果可能会显得太过锐利或刺眼,那它可能就比较适合用 NGU-Standard。至于 NGU-Soft,个人认为它的锐利度降得有点低 (比 NGU-AA 还低),可能适用的场合并不多,不过还是以各位亲自测试为准。NGU-Soft 和 NGU-Standard 两个并不像 NGU-AA 带有消锯齿的功能,所以跟 NGU-Sharp 一样比较适用在干净的片源,或是搭配 RCA 使用。

另外就是 NGU-(Sharp、Standard、Soft) 已经内建有 deringing 的效果,所以不要跟 artifact removal 底下的 reduce ringing artifects (deringing) 一起开,不然可能损害画质。

下面看看几张范例:

640*480→1440*1080 (点图放大)

一般的老动画 DVD 放大到 FHD 的情形,注意衣服上的噪声以及眼睛和头发的部分

Jinc+AR

NGU Sharp very high (direct 4X)

NGU Sharp very high(direct 4X) + RCA 6

NGU AA very high 2X > very high 2X

NGU AA very high 2X > very high 2X + RCA6 (high)

NGU AA very high 2X > very high 2X + RCA6 (high) + crispen edges 2.0 + thin edges 1.0 + AR (crispen edges 和 thin edges 皆为 upscalingrefinement)

可发现这边 NGU Sharp very high (direct 4X) + RCA 6 的组合可得到最理想的还原效果,噪声也得到充分抑制,最后一张所使用的组合 NGU AA very high 2X > very high 2X + RCA 6 (high) + crispen edges2.0 + thin edges 1.0 + AR 虽然也有接近的效果,但还原细节仍差了一点点,重点是消耗的效能高太多了,因此这类动画最适合 NGU Sharp + RCA 的组合。

720*480→1920*1080 (点图放大)

注意衣服跟皮肤的细节,及线条边缘轮廓

Jinc+AR

NGU Sharp very high (direct 4X)

NGU AA very high 2X > very high 2X

NGU AA very high 2X > very high 2X +SuperRes 4

可以发现锐利度 NGU AA very high 2X > very high 2X + SuperRes 4 可能稍微高一点点,但 artifacts 也比较多,而 NGU Sharpvery high (direct 4X) 则把画面细节还原的很好,artifacts 也比较少,重点是这边 NGU Sharp very high (direct 4X) 消耗的效能要少得多。

另外一个是上面用过的初音范例,再比较一次,可以看出 NGU Sharp 在低分辨率动画类并带严重锯齿的状况可能遇到的问题

640*360→1920*1080 (点图放大)

Jinc+AR

NGU Sharp very high(direct 4X)

NGU Sharp very high(direct 4X) + RCA 6

NGU AA very high 2X > very high 2X

NGU AA very high 2X > very high 2X + RCA7 (high) + deringing + crispen edges 2.0 + thin edges 1.0 + AR (crispen edges 和 thin edges 皆为 upscalingrefinement)

可以发现这个例子 NGU Sharp 就不太适合,即使它是很忠实的还原了原图上的细节跟锯齿,但那可能不是我要的,NGU AA 消锯齿效果良好但锐利度差了些,而 NGU-AA 再加上噪声修饰跟锐化算法结果就不错,不过效能消耗也比较高。

另外 doom9 上也有网友收集了各种 madVR 的升降频算法以及 artifact removal 算法的效果对比图片,可至下列网址把图片点开参考:

Image Gallery of madVR Image Processing Settings - Doom9’s Forum

如果不想搞太复杂,只想要一组设定打天下,那就这样设定吧,显卡不够强就自己换成 med 或 low,显卡够力可换成 very high,片源不够干净再加个 RCA 即可。但有心的话自己可以慢慢去做不同组别的设定来对应不同的分辨率 / 帧率 / 片源,madVR 的 profile 功能,让我们可以用各种不同的设置去应付各种不同的状况,最大限度去利用有限的显卡效能,这部分我在另一篇文章皆有说明。

upscaling refinement

接下来看到 upscaling refinement 的部分,这边可将其视为改善放大算法专用的锐化演算,跟前面 image enhancements 相较,这边处理过后的影像差距不会太巨大,但锐化造成的副作用也会小很多 **,这边我的习惯仍然是第一组 profile 常驻的不启用任何锐化算法,其它几组设置热键视情况切换。** 开启锐化算法也会增加显卡负担,务必注意。另外原则上,可以同时开 1~3 种算法,只要注意互补性,不要过度重迭,不要锐化过度就好,但是 image enhancements 跟 upscaling refinement 最好不要同时开,很容易会锐化过头。(锐化过头画面会变的尖尖的、刺刺的、失去立体感、或是充满油画感)

特别要注意的是使用 NGU-(Sharp、Standard、Soft) 的时候,除了其专属搭配的两个算法外不建议再开其他任何锐化算法,因为 NGU-Sharp 本身就已经非常锐利了,再开其他的就锐化过头了。

这边简单介绍一下各个锐化算法

  • sharpen edges:针对边缘线条锐化,不锐化纹理内容,适合开启 AR 和 AB 滤镜使用

  • crispen edges:FineSharp 的改良版本,有不错的整体细节锐化效 - 果,新版本里也抑制了噪声被锐化的程度,madshi 认为它有最自然的锐化效果

  • thin edges:把边缘线条变细,适合低分辨率的动画类放大时使用

  • enhance detail:针对纹理内容锐化,例如皮肤跟衣服之类的细节,不过也有噪声被锐化的可能

  • soften edges:柔化线条边缘,是 NGU-Sharp 专属搭配使用的,NGU-Sharp 可能造成线条边缘过于锐利,这个选项可稍加修饰。至于要不要开以及开多少,则视个人口味跟片源而定,例如有人认为 SD 片源→FHD 的升频,本身锐利度已经不足了,不太适合再柔化,而 FHD 片源→UHD 的升频就比较有需要。当然这只是一种个人看法而已…

    不过 madVR 在 v0.91.8 之后加入 NGU-(Standard 和 Soft),想要低一点的锐化程度选择这两个就好,所以这个选项个人认为已经没有必要

  • add grain:在纹理内容上面加上颗粒,也是 NGU-(Sharp、Standard、Soft) 专属搭配使用的,NGU-Sharp 虽然能把低分辨率内容的线条提升到接近原生高分辨率的锐利度,但纹理内容缺失的部分并无法完美的还原,加上颗粒让影像比较有真实感。这边建议开 1~2,但这选项只适合真人影像,不适合动画类 (动画开了看起来会像噪声)

  • LumaSharpen:整体锐化,强化线条跟适度的细节提升,并避免强化噪声,强烈建议开启 AR 和 AB 滤镜使用,开了后效果很类似 crispen edges

  • AdaptiveSharpen:整体锐化,特别注重强化中等锐利程度的线条,但会避开全平面区域跟高锐利的线条,强烈建议开启 AR 和 AB 滤镜使用,AR+AB 有开没开差很多,开了后效果很类似 crispen edges

  • SuperRes:包含一整套的后处理过程,得到的也是整体性的锐化效果,后面的 LL、AR 滤镜则不建议开启 (LL 可能有副作用而且增加的效能消耗太大,SuperRes 本身不太产生 ringing 所以不需要 AR),后面的数字代表跑几次 SuperRes 流程,数字越高锐化效果越强,但锯齿跟 artifacts 也会更明显,效能消耗也越大 SuperRes 跟非 NGU 的升频算法一起用有不错改善效果。跟 NGU-AA 一起用也可以增加不少锐利度。但并不适合跟 NGU-(Sharp、Standard、Soft) 一起用,SuperRes 并无法让 NGU-Sharp 效果再改善或提升锐利度,反而可以造成锯齿和 artifacts 再次被凸显出来

    个人测试的结果认为 SuperRes 很适合在真人影片中使用 (如果使用 NGU-(Sharp、Standard、Soft) 以外的算法的话),但极度不建议在动画类使用 (包括 2D 和 3D 动画),只要一开锯齿跑出来了,破坏非常明显,强度只开 1 也一样…

  • refine the image after every ~2X upscalingstep

  • refine the image only once after upscalingis complete

前者是每放大两倍就锐化一次,后者是不管放大多少倍总共只锐化一次,这个选项只对极大倍率 (4 倍以上) 的放大会有影响,理论上每放大两倍就锐化一次最能维持锐化效果,但是对显卡的效能消耗也是倍增,还是要视自己显卡能力而定

以下是个人使用的两组 upscaling refinement 设定,分别是真人影片 (FHD 片源升频 4K) 跟动画类 (仅限需要消锯齿的片源) 使用,用热键控制切换,供各位参考

需要消锯齿的动画片源 (配合 image upsclaing 里的 NGU-AA 使用)

真人影片类 FHD 的片源升频 4K (配合 image upscaling 里的 NGU-Sharp 或 Standard 使用)

要不要开锐化?要用哪几种算法?强度开多少?这个是要由观赏的片源,跟使用的屏幕,显卡的负荷能力,亲自去做测试才能得出结论,不必要盲从,别人的设定不一定是适合自己的设定

========================================================================

Rendering

general setting

接下来继续往下设定,到 "general setting" 这页,我的建议设定 (win7 适用) 如下图:

  1. "delay playback start until renderqueue is full" 建议勾选,可减少开启影片时的掉帧现象,下面的 "delay playback start after seeking" 不建议勾选,勾了拉时间轴会变慢
  2. "enable windowed overlay"N 卡跟 I 卡可勾可不勾,这功能 A 卡并不支持勾了也没用,优缺点下面总结会解释。
  3. "enable automatic fullscreen exclusivemode" 建议勾选,这个选项勾了会在进入全屏幕时使用独占模式 (FSE),优缺点下面总结会解释。
  4. "disable desktop composition (Vistaand newer)“跟底下的"only when media player is in fullscreen mode”,如果有使用全屏幕独占模式的话,就两个都一起勾选;如果没使用全屏幕独占模式的话,就不要勾选 (这个选项是播放时或者全屏幕时把 win7 的 AERO 关掉,win8 以上的系统则没有影响)
  5. use Direct3D 11 for presentation,勾了会使用 D3D11 模式,必须显卡跟操作系统支持才能用,而 madVR 的 10bit 输出也必须在 D3D11 跟 FSE 模式底下才能达成,此外 D3D 11 模式下从窗口切换到 FSE 模式速度比较快一些,效率较好。D3D 11 模式必须使用 AERO,故这里勾选的话 "disable desktop composition (Vista and newer)" 会自动失效。下面的 "presenta frame for every VSync" 建议勾选,可减少 presentation glitches 的增加,反之若不勾则能节省一点点效能但有可能 presentation glitches 会变多。
  6. "use a separate device forpresentation (Vista and newer)" 建议勾选,不过如果 N 卡勾了发生问题的话可以取消勾选看看有没有改善,另 N 卡驱动为 301.42 版以前的话不要勾选。
  7. “use a separate device for DXVAprocessing (Vista and newer)”,勾或不勾都可。(此项只有在用到 DXVA 的场合,如硬件去交错或硬件译码时才有影响)

6.、7. 这两项主要会影响 renderingtimes,而 rendering times 是越低越好,太高的话会掉帧,可自行测试勾选或不勾选的差别。我的建议设定是使用 AMD HD7750 显卡驱动 13.12 测试,这样设定在 fullscreen exclusive mode 下的 rendering times 最低,而 N 卡使用者也可自行测试这两项勾或不勾哪种组合较好。

CPU queue 跟 GPU queue,是决定播放时占用的 RAM 的大小,我喜欢用自来水跟水塔的概念来举例,queue 的总量就像是水塔大小,不管大水塔或小水塔,目的都是确保水龙头打开能够源源不绝的出水不会没水用 (掉帧),queue 设小的话 (小水塔) 它很快就会装满,对硬件负担也小,但是一个稍大的变动可能就让它暂存的容量不及应付而降成 0,就会掉帧了。queue 设太大的话则是吃比较多的 RAM,开影像会稍微变慢 (如果有勾选 "delay playback start until render queue is full",要等它装满),但相对就比较不会掉帧,这方面要自己多测试取舍。需注意硬件不是太强的话也有 queue 开太大反而播放不顺的情形发生。

我的建议是如果没有使用 smooth motion 功能的话,这部分维持预设即可,如果有使用 smooth motion 的话,这边可以设到 CPU queue 20 跟 GPU queue 12,甚至要更大也可以 (在我以前的测试中,使用 smooth motion 时如果 queue 不够大有时候会有不顺畅或顿顿的情形发生)。

另外 win8/8.1 或 win10 的话,建议设定如下图:

“enable automatic fullscreen exclusivemode”,勾选后如果没遇到异常状况 (全屏幕时严重 LAG、rendering time 暴增或无画面) 的话也是可以使用。

windows mode settings

到 "windows mode settings" 这页,如下设置:

勾选 "present several frames in advance",会使用 0.87.10 版加入的新窗口模式,有接近 FSE (全屏幕独占) 模式的效能跟稳定性,如果你不喜欢 FSE 模式的话全屏幕播放可直接使用这个新窗口模式。

如果播放出现问题的话则取消勾选 "present several frames in advance",会改回使用 0.87.10 之前版本的旧窗口模式。

如果使用新窗口模式的话,下面的 "'how many video frames shall be presented in advance" 数字依 GPU 能力去设置,一般在 6-12 之间,更大也可以,如果有掉帧情形就调整看看,使用 smooth motion 的话这项最好开大一点。

欲使用全屏幕 "新" 窗口模式的话还必须如下设置,取消勾选这两项:

exclusive mode settings

到 "exclusive mode settings" 这页,如下设置:

"delay switch to exclusive mode by 3seconds" 这项勾选的话会在切换成全屏幕 3 秒后才进入独占模式,自己决定要不要勾选,像我喜欢它马上进入独占模式所以就不勾选。

下面的 "'how many video frames shall be presented in advance" 数字依 GPU 能力去设置,一般在 6-12 之间,更大也可以,如果有掉帧情形就调整看看,使用 smooth motion 的话这项最好开大一点。

这边小总结一下,在非全屏幕时,可以使用的模式及设定方法:

  • 旧窗口模式 windowed mode (old path)
  • 新窗口模式 windowed mode (new path)
  • overlay 窗口模式 overlay mode

勾选 "enable windowed overlay" 会使用 overlay 窗口模式 (N 卡跟 I 内显限定),不勾选则使用其他两种窗口模式,新跟旧窗口模式的选择方法如上面的说明。

在全屏幕时,可以使用的模式:

  • 旧窗口全屏幕模式 fullscreen windowed mode (oldpath)
  • 新窗口全屏幕模式 fullscreen windowed mode (newpath)
  • overlay 全屏幕模式 fullscreen overlay mode
  • 全屏幕独占模式 fullscreen exclusive mode

勾选 "enable automatic fullscreen exclusive mode" 会强制使用全屏幕独占模式,不勾选则使用其他三种模式,有勾选 "enable windowed overlay" 会使用 overlay 全屏幕模式 (N 卡跟 I 内显限定),不勾选则使用其他两种窗口全屏幕模式,新跟旧窗口全屏幕模式的选择方法如上面的说明。

下面整理一下各种模式的优缺点,"+“表示优点,”-" 表示缺点,主要来自 madshi 本人的回复

Problem with MadVR using full screen exclusive mode

  • 旧窗口模式

    • + 可使用在非全屏幕及全屏幕模式

    • + 切换全屏幕时不会有额外的延迟

    • - 有时会出现画面撕裂 (没有打开 AERO 的情形下)

    • - 有时会有播放不顺畅、顿顿的情形 (特别容易发生在使用 smoothmotion FRC 时),对于描绘时 间的容忍度较低

    • - 在老旧的机器上效率低落 (比较容易掉帧)

  • overlay 模式

    • + 可使用在非全屏幕及全屏幕模式

    • + 不会有画面撕裂情形

    • + 常保播放顺畅

    • + 效率高,比较不容易掉帧

    • - A 卡不能使用

  • 全屏幕独占模式 (FSE)

    • + 不会有画面撕裂情形

    • + 常保播放顺畅

    • + 效率最高

    • + 即使 GPU 短期间处在比较忙碌的状态也能有效防止掉帧,是最稳定的播放模式

    • + N 卡只有此模式下能够输出 10bit

    • - 只有全屏幕时能使用

    • - 切换全屏幕时会有延迟现象

    • - 播放器自己的控制接口无法运作

    • - 叫出播放器选单时 (例如点右键) 会强制跳出 FSE 模式

  • 新窗口模式

    • + 有 FSE 模式一切优点,但没有其缺点 (运行机制跟 FSE 只差在没有进 入 Direct 3D 模式)

    • - 必须搭配 AERO 才能使用 (在 win7 下 AERO 的 compositionrate 是以主屏幕为准,这在使用多屏幕 时会成为麻烦,因为不能让它对应当下屏幕的更新率,win8 之后则无此问题)

    • - 在某些系统有兼容性问题,导致播放不顺

    • - win10 以外的系统无法输出 10bit (win10 除 N 卡外可在全屏幕窗口模式输出 10bit)

stereo 3D

到 "stereo 3D" 这页,madVR 在 v0.90 之后加入对 3D 影片的支持,这一页的设定在有播放 3D 影片的需求时才有需要勾选,当然要播 3D 还必要达成其他几个条件:

要有支持 3D 的显示器跟眼镜

操作系统要 win8.1 以上

桌面右键 > 屏幕分辨率 > 进阶,里面有一个 3D 选项要勾

使用 LAV 0.68 之后的版本 (3D 原盘 OK,但如果是 mkv 格式封装则必须是 MVC 编码)

3D 输出目前仅限制在 1080p23 模式

smooth motion

到 "smooth motion" 这页

这是 madVR v0.86.0 加入的功能 "smoothmotion frame rate conversion".,详见官方论坛:

madVR - high quality video renderer (GPU assisted) - Page 876 - Doom9’s Forum

这个功能相当好用,解决了帧率跟屏幕更新率不同步所产生的 judder 问题 (详细可参考我在 reclock 那篇所提到的内容),开发者 madshi 提到这功能有两大优点:

1. 能够让任何帧率去对应任何屏幕更新率,并保持影像的流畅

2. 如果硬件能够应付,在完整的播放中不会有任何的帧 drop 或 repeat,且不需要依靠 reclock 来达 成。

两个缺点:

1. 稍微增加一点 GPU 的负担

2. 会损失一点锐利度,影片帧率小于屏幕更新率的话损失较少,例如 24fps 的影片在 60Hz 屏幕使用这功能播放的锐利度损失是不太容易看出来的:而影片帧率等于屏幕更新率的话,使用这功能锐利度损失就较多而且很容易看出来。

Reclock 难以处理的非整数倍的同步问题,像最常见的 24fps (23.976) 影片在 60Hz 屏幕上播放,就很适合让 madVR 的 smoothmotion FRC 功能来解决,把这功能打开会发现影像的 judder 都消失了,就有如同步播放时的那种流畅感。

madVR 的 smooth motion FRC 功能是透过 Blending 来达成的而非补帧,当然也没有补帧带来的副作用像 soap opera effect 和一堆 artifacts。madshi 有提到 Blending 是 "30% of frame A and 70% of frame B to calculate the outputframe (pixelC = pixelA * 0.3 + pixelB * 0.7)"。

我不是很确定它运行的方式,不过猜想可能是接近以下的情形:

1 1 1 2 2 3 3 3 4 4 (24fps@60Hz 屏幕,不做任何处理的呈现方式,是一个 3:2 的 pattern,每个帧停留时间不一样,造成 judder)

1 1 1+2 2 2 3 3 3+4 4 4 (24fps@60Hz 屏幕,经过 Blending 处理的呈现方式,每个帧停留时间相同,接近 2.5/60 秒)

透过 Blending 来达成的同步,没有像补帧那种顺到不可思议的流畅感,但是影像相对比较自然,比较接近原汁原味。至于喜欢哪种就交由各位自己决定。以下介绍设置方法:

到 "smoothmotion" 这个分页,如图设置,下面三个选项是判断要不要启用 smooth motion FRC 的方法,

第一个选项判定的基准似乎是帧率跟屏幕更新率差超过 0.5 时会启用,反之不启用。

第二个选项是屏幕更新率为帧率的精确整数倍时不启用,反之启用

第三个选项是强制启用

另外也可以设置热键手动控制这个功能的开关

使用 SVP 或 AMD 的 Fluid Motion 或其他补帧软件的话,这个功能就取消勾选不要启用

screenshots

到 "screenshots" 这页,这边的设定主要是搭配播放器的截图功能 (例如 MPC-BE 的截图热键是 "F5",截下来的图片会在 "本机">"图片" 文件夹中)

  • “create screenshots with a custom zoomfacter”,这项不勾选的话,截图就是看目前播放器放出来的目标分辨率多少就直接截那个分辨率,有勾选的话就可以自己指定,看是要影片原分辨率 50%、100%、200%、300%、400%、800%,或是指定 720p、1080p、2160p 这些常见分辨率。举例来说,没有 4K 屏幕,但想看看某些算法升频到 4K 的效果,就可以善用这个选项。

    • 至于 edcoded video size,指的是影片压制编码出来的原始分辨率,但是跟 100% 的不同之处在于,有些影片原始分辨率跟它 100% 播放时的分辨率不一定一样,影片串流中会夹带一个 Display aspect ratio (DAR,显示宽高比例) 的标签,100% 播放时会依 DAR 所指定的比例去拉伸,举例来说,日本电视台录制下来的档案就常见这种形式,其原始分辨率是 1440x1080,但夹带一个 16:9 的 DAR,因此 100% 播放时会拉伸成 1920x1080 去播放,这个例子如果选 100% 去截图,图片会是 1920x1080,如果选 edcoded video size 去截图,则图片会是 1440x1080。
  • “use high quality scaling algos -image upscaling:”,这项勾选的话可以直接指定截图要套用的升频算法,有 NGU Sharp、NGU Standard 和 NGU AA 三种,以及这三种各自再搭配 add grain,总共六种

  • “don’t draw OSD”,勾选的话,截图一律不显示 OSD

  • “don’t perform color & gammaprocessing, calibration etc”,勾选的话,截图会忽略 color & gamma 和 calibration 里面套用的设定

  • “don’t draw subtitles”,勾选的话,则截图就不会把字幕挂上去

  • “don’t perform artifact removalprocessing”,勾选的话,截图会忽略 artifact removal 里面套用的算法

  • “don’t perform image enhencementprocessing”,勾选的话,截图会忽略 image enhencement 里面套用的锐化算法

  • “don’t perform upscaling refinementprocessing”,勾选的话,截图会忽略 upscaling refinement 里面套用的锐化算法

  • “don’t execute custom shaders”,勾选的话,截图会忽略套用的自定义 shaders 效果

dithering

到 "dithering" 这页

关于 error diffusion 和 ordered dithering,是 0.87 版后新加入的 dither 方法。madVR 在输出 8bit 的讯号时,是把内部用 16bit 高精度处理完的讯号以 dithered 8bit RGB 的形式输出,在色彩阶调上跟 10bit 输出是不会有差别的,差别在于画面上会多了一些 "噪点",我前面有个连结也解释过 dither 的原理,是以噪点来模拟更多的色阶数,某些场景下你也许会看到这些噪点,并将其视为画面的负面因素。madVR 过去一直使用的是 random dithering 的演算方法,在大部分画面都会制造噪点使得其比较容易被查觉,而新的 error diffusion 算法只在必要的地方制造噪点,也就是说它可以维持同样的色彩阶调,但是大幅降低画面的 "底噪"。至于 ordered dithering 则是 madVR 在 v0.87.5 之后做为默认取代 random dithering 的算法,其效能消耗跟 random dithering 差不多低,但是有接近 error diffusion 的低噪点表现。我的建议是你如果有一个不算小的屏幕 (40 吋以上),去使用 error diffusion 才会比较察觉得出效果,一般计算机屏幕尺寸太小可能很难感觉到它带来的差别,维持预设 ordered dithering 即可。error diffusion 的话会增加一些显卡消耗 (开启 smooth motion FRC 会再增加一些,因为其消耗是跟最终输出的帧数成正比) 如果显卡效能许可的话要将 error diffusion 做为常驻选项也是可以。

error diffusion 是用 DirectCompute 写的,由于 DirectCompute 是 DirectX 11 的一部分,必需要显卡及操作系统支持 DX11 才能使用。

下面两个选项,"use colored noise" 勾选的话是使用多色噪点,不勾的话是使用单色噪点;"change dither for every frame" 勾选的话是使用动态噪点,不勾的话是使用静态噪点,静态噪点在主观上会让你觉得噪点数量较少,但是一些噪点的排列纹路可能会比较容易被查觉到。

也就是说,不考虑 random dithering 的话,我们目前有三种 dither 算法,ordered dithering、error diffusion-option 1 和 errordiffusion-option 2,以及两个控制选项,总共 12 种不同排列组合的设置可以去使用,这边请各位有兴趣自行去测试,每个人喜欢的画面重点可能不太一样,很多情况下其实差别很小,但都优于 random dithering 就是了。

至于有兴趣测试者,由于在 8bit 输出的情况下不太容易看得出差别,我们可到前面屏幕设定那边去选用较低的 bit 数,如此一来可更明显看出各种 dither 算法和选项的差别。例如我们如果选择 3bit 的话,则 RGB 三色每一色都只有 2^3=8 个色阶数,三色总共只有 8*8*8=512 个色阶数可用 (跟 8bit 的 1670 万个色阶数比起来是 "非常" 低),dither 算法变得极为重要而且任何选项的改变差别都非常明显,以下我们可以看到简易比较图:

8bit ed-op1 两选项皆勾 (点图放大)

3bit ed-op1 两选项皆勾 (点图放大)

3bit none (无 dither) (点图放大)

以上只是简单让各位看一下 dither 用低色阶数输出高色阶的强大效果,这边各种算法的差异请自行测试。测试完毕别忘了再到屏幕设定那边改回 8bit。

再次声明,madVR 的 8bit 输出,使用 error diffusion 或 ordered dithering 作为 dither 算法的话,跟 10bit 输出几乎是没有差别的,肉眼几乎不太可能察觉到那些噪点的存在,虽然 madVR 有支持 10bit 输出,我们不必追求一定要用 10bit 输出,事实上 10bit 输出反而比较容易遇到问题 (不管是显卡方面或是显示器方面)。

trade quality for performanc

到 "trade quality for performance" 这页,** 这页的选项都是降低质量以换取效能,如果显卡效能够高的话尽可能都不要勾选,** 如果显卡负荷不了的话就从最上面开始勾选。有时候你使用某些算法在播放循序式影像或是软解时没问题,播放交错式影像开启硬件去交错时或是硬解时显卡却负荷不了,这时就可以勾选那几个 DXVA (deinterlacing or decoding) 的选项,如此显卡就只有在用到 DXVA 运算时才会降低质量,总之这边的选项低阶显卡可以依需要勾选。

这边的选项由上到下依序来看的话:

第 1 项是跟外挂字幕渲染器 xy-SubFilter 相关,有使用才有影响。

第 2 项是使用硬解 (DXVA) 时,同时使用 DXVA 的 chroma upscaling 算法

第 3 项是使用硬件去交错时,同时使用 DXVA 的 chroma upscaling 算法

第 4 项是跟播放器的自定义 pixel sharder 功能相关,有使用才有影响。

第 5 项勾选的话 dithering 演算会用 gamma light 取代 linear light (gamma light 在 0.87.7 之前的版本是预设使用),取消勾选的话就是使用 linearlight,linear light 能提供较好的色彩还原度。

第 6 项跟第 7 项是跟 debanding 的运作有关,勾选的话会取消一些侦测机制。

第 8 项是如果能节省效能的话把色度升降频分开处理,里面唯一一个我觉得中高阶卡也可以勾选的,这个选项的效果,举例来说,一个 4K 4:2:0 的影片要在 FHD 屏幕播放,一般来讲要先把色度分量 (1920*1080) 升频到 4K 再跟亮度分量一起降频到 FHD,勾选这个选项的话,色度分量直接维持 1920*1080 不动,而亮度分量 3840*2160 直接降频到 1920*1080,对 4K 影片来说,少了这个色度升频动作节省的效能非常多,对画面质量影响却不多。

第 9 项是色调映射和色域转换使用较低精度

第 10 项是去掉影片的 BTB (比黑更黑指 015 这段) 和 WTW (比白更白指 236255 这段) 的黑位范围信息

第 11 项是跟 smooth motion 有关。

第 12 项跟第 13 项跟 madVR 本身的处理精度有关。

第 14 项跟放器的自定义 pixel sharder 功能相关,一样有使用才有影响。

第 15 项是跟 DXVA deinterlacing 有关,勾了就不会把 60i 去交错倍帧成 60p 而是变成 30p

第 16 项也跟 DXVA 有关

========================================================================

User interface

keyboard shortcuts

到 "keyboard shortcuts" 这项,可以依自己喜好设置热键

另外附上 madVR 预设设定已有的热键一览表:

  • create freeze report - Ctrl+Alt+Shift+Break

  • open settings dialog - Ctrl+S (打开选单)

  • Enable OSD - Ctrl+J (打开 OSD)

  • Reset OSD Statistics - Ctrl+R (OSD 统计归零)

  • Source Primaries - Ctrl+Alt+Shift+P

  • Source Decoding Matrix - Ctrl+Alt+Shift+M

  • Source Levels - Ctrl+Alt+Shift+I

  • Output Levels - Ctrl+Alt+Shift+Y

  • Deinterlacing - Ctrl+Alt+Shift+D (强制开关去交错)

  • Deinterlacing Field Order -Ctrl+Alt+Shift+F

  • Deinterlacing Mode - Ctrl+Alt+Shift+T (切换去交错模式 video/film)

  • 顺时钟转 90 度 -Ctrl+Alt+Shift+Right

  • 逆时钟转 90 度 -Ctrl+Alt+Shift+Left

  • 3dlut 开关 - Ctrl+Shift+3

  • 3dlut 分割展示 - Ctrl+Alt+Shift+3

  • desired display gamma value - increase - Ctrl+Alt+Shift+G (配合 "enablegamma processing" 的设定)

  • desired display gamma value - decrease - Ctrl+Alt+Shift+B (配合 "enable gamma processing" 的设定)

建议设置热键的项目:

  • debanding - toggle (切换 off-low-med-high)

  • deringing - toggle (开关 deringing)

  • deblocking strength - increase (RCA 强度增加)

  • deblocking strength - decrease (RCA 强度降低)

粗体是我认为比较实用的几个,这边要特别提一下 Deinterlacing Mode 的切换,我们知道图像文件基本上有循序式 (或称逐行扫描) 跟交错式 (或称隔行扫描) 两种,循序式 (Progressive) 如 480p、720p、1080p 这种后面有个 "p" 的都是,交错式 (Interlaced) 如 480i、1080i 这种后面有个 "i" 的都是。遇到交错式影像,必须要进行去交错处理 (Deinterlacing),否则会有明显的横向扫描线,而交错式影像基本上又可分成两大类─Video 跟 Film,Video 通常指原生的交错式影像,为摄影机以 60i 模式拍摄,一秒 60 个场 (field),场是指半个画面,也就是半个帧 (frame),这种没办法还原成一个完整的图像,只能靠各种去交错算法去仿真出完整的画面,让其变成 30p 或 60p。

而 Film 是指原生为循序式影像,把每个图像经过拆场并重新排列让其变成一秒 60 场 (60i) 的交错式影像,这个过程称为 Telecine,常见于电影或动画 (原生 24p 的影像) 经过 2:3 pulldown 的处理后变成 60i 的交错式影像,这种影像可以完美的还原为 24p 的循序式影像,只需将每两个场交迭并去掉多余的场即可,这种方法称为 Inverse Telecine (IVTC 即反向 Telecine)。

而 madVR 侦测到交错式影像,就会呼叫显卡去做硬件去交错 (DXVA deinterlacing),不过 madVR 目前并不会判断它是 video 还是 film,而一律视为 video 并呼叫 DXVA deinterlacing,就算我们播的是 film 内容的交错式影像。有时候显卡自己的去交错算法并不能正确的执行 IVTC,或是显卡经过 IVTC 后,一样是用 3:2 的 pattern 输出给 60Hz 屏幕,一样有 judder 问题,这时候我们就需要手动使用 Ctrl+Alt+Shift+T 这个指令将其切换为 film,这时 madVR 就会用 CPU 执行它自身的 IVTC 算法,而我们就会得到完美的原生 24P 影像,如果再同时使用 smooth motion FRC,就能在 60Hz 屏幕上得到无 judder 的播放。

不过译码器使用 DXVA (native) 的时候无法切换成 film 模式,如果要搭配硬解使用必须使用 DXVA (copy-back),须注意

以我的经验来说,这个功能用在一些标准 DVD 格式的电影最为好用 (标准 DVD 输出皆为交错式影像)。

另外电视台录制下来的电影跟动画 (常见的为 TS 檔 60i),也可以使用 IVTC 算法将其实时还原为 24p。

另外关于 "Debanding custom settings" 这个热键,其实是 madVR 隐藏起来的 dabanding 自定义参数功能,可以像测试版时期那样手动更改各项参数,左右键切换项目 (被选择到的会变大写),上下键增减数值,至于各个参数的定义有兴趣请自行到 Doom9 上找,这功能我懒得玩了,默认值就很好用了。

接下来介绍在影像播放时按 Ctrl+J 叫出的 OSD 上面一些数据的意义,配合图上的标记解说:

  1. 目前的屏幕更新率。
  2. 影片帧率 (音频时钟) 与屏幕更新率 (影像时钟) 的偏移率,此数值越小表示越同步。
  3. 显示 smooth motion FRC 功能是否启用。
  4. 显示目前为 D3D9 或是 D3D11 模式;窗口模式、全屏幕窗口模式 (fullscreen windowed mode)、或是全屏幕独占模式 (fullscreenexclusive mode) 或 overlay 模式;8bit 或是 10bit 输出。
  5. 来源档案的编码、bit depth 和色度信息以及译码器译码完传给 madVR 的色彩空间、bit depth 和色度信息。
  6. 影片的帧数。(由源滤镜提供的信息判断)
  7. 每隔多久会掉 1 格,这与影片帧数和屏幕更新率的同步程度有关,另一篇会提到的 Reclock 有一个作用就是提高同步程度。
  8. 影片的原始分辨率及画面比例。
  9. 目标分辨率,有四组数字,分别是 "left, top, right, bottom",必须把第三组减第一组 第四组减第二组才是目标分辨率的 "width,height"。
  10. chroma (色度升频) 和 luma (影像亮度升频) 和 chroma (影像色度升频) 所使用的算法
  11. 每一个帧容许的绘制时间,这个值跟影片的帧数有关,例如我看 24p 的影片时,这个时˙间就是 1/24=0.04167s=41.67 ms,也就是说每一帧都有 41.67ms 的时间让显卡去处理;如果是 60i 的影片,去交错后是 60p,这个时间就是 1/60=16.67 ms,由此可见帧数越高,可以处理的时间变短了,对显卡的处理能力要求的也就越高,也就是说越容易掉帧。
  12. 影片进行 YUV<>RGB 转换使用的系数标准,由影像流的信息判断或是 madVR 自行判断。
  13. 影片的色彩定义标准 (色域),由影像流的信息判断或是 madVR 自行判断。
  14. 影片的黑位范围,由影像流的信息判断或是 madVR 自行判断。
  15. on 表示有开 DXVADeinterlacing ,off 表示没开,若 madVR 把循序式影像跟交错式影像判断错误的话请自行用热键 Ctrl+Alt+Shift+D 开关。若切换为 film mode 的话会在下方显示 film mode,和侦测到的 pulldown 的形式。
  16. 各个 queue 是否充满通常能反应硬件是否能负荷,例如 decoder queue 很低的话表示 CPU 负荷不了了,render queue 很低的话表示显卡负荷不了了。
  17. dropped frames 跟 delayedframes 为掉帧计数器,若数字一直增加表示硬件无法负荷,请降低设定或找出原因。
  18. 平均绘制时间,通常也可观察 GPU 负荷情形,越好的算法跟较重的负荷通常会让绘制时间变多,多到超过 movie frame interval 的时间就会掉帧。
  19. 5 秒区间内的最多绘制时间,观察 GPU 负荷的另一种方式,多到超过 movieframe interval 的时间就会掉帧。

========================================================================

显卡设置

最后,为了避免不必要的负面影响及显卡效能的多余消耗,请进显卡控制接口把一些跟影像播放有关的处理通通关掉只留下去交错的部分,当然 madVR 本来就会绕过这些后处理,但是有使用到 DXVA-deinterlacing 跟 DXVA-scaling 的时候还是会被影响 (DXVA 译码则没有影响,因为那跟渲染器无关),所以保险一点还是全部关掉。

以下以 A 卡的 CCC 为范例:

以 Nvidia 控制接口为范例,默认都是 "使用视讯播放器设定",这个不用去改它:

如果屏幕接 HDMI 的话,建议使用 RGB 输出,不要用 YCbCr 输出,用 YCbCr 输出的话会在显卡层多一道色彩空间转换,造成画质损失,而且 YCbCr 都是输出 16-235,只有 RGB 输出才能选择输出 0-255 或是 16-235

N 卡旧驱动有些接 HDMI 输出 RGB 也会强制输出 16-235,但如果屏幕支持 0-255 的话,可以用 madVR 文件夹里的一个小程序 "madLevelsTweaker.exe" 强制让它输出 0-255,如下图勾选并套用后重开机即可。

而 N 卡 347.09 之后的驱动,可以直接选择 0~255 输出不用透过 madLevelsTweaker.exe 修改

353.06 之后位置改到这边

另外还有一个很重要的地方,最近的显卡驱动默认值都以省电为主,但是却会造成运行 madVR 时显卡不会用全力跑,造成效能比预期低落,以 NV 为例,必须到控制面板选取播放器执行文件 (图中范例为 mpc-be64.exe),把电源管理模式设定为 "自适应" 或 "惯用的最大效能"(广域设定默认值是 "最佳电源",一切的元凶…),如此才能让显卡全力运行 madVR。而 AMD 的控制接口也有电源管理的相关选项要关掉,不然也是可能会降频跑。

到此整个设置就算大功告成,enjoy it!

关于 madVR 到底需要多少显卡效能的议题,这边也简单做个结论,第一当然就是跟你的设置息息相关,你启用了哪些功能,那些功能吃掉了多少效能?第二就是跟你看的影片种类有关,看的影片跟屏幕分辨率相同时消耗的效能最少,因为只需要做 chroma upscaling (但影片本身分辨率越大,例如 4K 影片,光做 chroma upscaling 消耗的效能也不少)。而当影片分辨率跟屏幕分辨率不一样时,是放大还是缩小?再来就是影片的帧率,60p 的影片稳定播放需要的效能会远大于 24p 的影片,再来就是 interlaced 跟 progressive 的差别,interlaced 需要做去交错,所以一个 60i 的影片消耗的效能又比 60p 更大… 这些不同种类的影片,我们可能都需要不同的设置去对应,因此 madVR 加入了 profile 的功能,提供最大的自定义弹性,这部分我将在另一篇文中介绍。

另外介绍 madTestPatternSource filter 用法,这是一个 madVR 用的测试工具,首先去下载

http://madshi.net/madTestPatternSource.zip

解压缩后点击里面的 install.bat 安装,方法跟安装 madVR 一模一样

然后打开播放软件,将文件夹里面的.ytp 文件拖到播放软件上放开就会自动播放。

不过请注意.ytp 檔只能在 32bit 的播放器上运行,如果使用 x64 播放器的话请另外抓 x86 版才能玩这个东西…

里面各种 ytp 档可测试各种不同的播放条件,下图为 SmoothMotion 的测试档,可自行测试不同帧率在自己屏幕上播放,有开跟没开 SmoothMotion FRC 的差别。

档名 tag 使用教学

其实这是早在 v0.85.4 版就加入的功能,还蛮实用的,特别提一下,当然随着版本更新陆续有一些新的 tag 加入。

madVR 可以辨识一些在影音档的档名中加入的 tag (标签),而在开启档案时套用 tag 上的设定,

这样一些需要特别设定的档案就不用每次都在那边手动调整

以下为所有的 tag:

  • tag"matrix=709|601|NTSC|PAL|YCgCo|240M|2020"

  • tag"primaries=709|SmpteC|EBU|sRGB|NTSC|PAL|470M|240M|170M|2020|DCI"

  • tag"levels=PC|TV|fullrange|limited|doubleExp|tripleExp"

  • tag “deint=On|Off|Video|Film”

  • tag “blacklevel=%value%”, valuerange [-50, +50]

  • tag “whitelevel=%value%”, valuerange [-50, +50]

  • tag “contrast=%value%”, valuerange [-100, +100]

  • tag “brightness=%value%”, valuerange [-100, +100]

  • tag “saturation=%value%”, valuerange [-100, +100]

  • tag “hue=%value%”, value range[-180, +180]

  • tag “frameRate=%value%”, e.g.23.976, 24.000, 23, 24, …

  • tag “refreshRate=%value%”, e.g.23.976, 24.000, 23, 24, …

  • tag “deband=off|low|medium|high”

  • tag “profile=‘profile name’”

  • tag"dering(ing)=on|off|half|full"

举例来说,一个普通的档案,开启时会按照自动侦测的结果套用预设的设定。

以下以去交错方法为例子来说明,虽然是原生 24p 的电影,但因为电视录下来是 60i 的档案,开启时自动使用了显卡硬件去交错

文件名中加入标签 "deint=Film",于是开启时自动使用了 IVTC,不用再手动切换

以上只是简单的例子,基本上档案需要特别设置的色域、色阶、去交错方法、亮度、对比、饱和度、色相等等,都可以透过这种加 tag 方式来减少手动调整的麻烦

madVR Profile 设置实战

萬年冷凍庫:系列番外篇之 2─madVR Profile 設置實戰

这篇文章常年来随着版本更新增加删减不少内容,虽然我改完会大致看一遍但是难免会有所遗漏,如果你看了觉得哪里有前后矛盾或是文意不顺、文章内容跟现有 madVR 版本兜不上或是任何难以理解的地方,欢迎留言提问或指教,感谢!