» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[其他] 【多图】介绍一下模拟器里各种常用滤镜的原理和效果,以及9102年了该如何模拟CRT!

泥潭也不能都是战帖,发点原创的东西吧。对了多说一句,转载的话跟我说一声……注明作者和TGFC这个帖子的链接。

模拟器中的Filter或Shader基本都是基于图像本身的。一般来说模拟器不会提供与几何相关的shader(32位机以后会有少量这类shader)。也就是说,模拟器滤镜生成的图像都是在不清楚游戏本身运行逻辑的情况下,单纯对最终输出的图像进行变换。因此这里用Filter远比用Shader来得更为精确。不过因为RetroArch的滤镜系统将其称为Shader,因此之后将不分辨该用词(shader=滤镜=filter)。

以下将从抗锯齿滤镜、放大增强滤镜、效果滤镜和硬件仿真滤镜四个角度对模拟器常用滤镜进行介绍,并着重对现在应该如何模拟CRT进行说明。



抗锯齿滤镜
对模拟器常见的2D游戏,抗锯齿滤镜基本没什么用,所以只是简单介绍一下。
首先是为什么要抗锯齿。大家知道时域采样往往要用规则采样。时域采样在频域中相当于用狄拉克梳子卷积信号本身,如果被采样信号的带宽低于采样信号的奈奎斯特频率,就没问题,不然就会堆叠失真产生aliasing(一维叫混叠,二维叫锯齿)。在空间域中采样几何本身或者现实世界图片的时候,规则采样用得很少,因为很容易对周期性高频信号出现aliasing。人们通过局部改进分辨率、随机采样等等途径进行抗锯齿,就产生了各种AA算法。

我们知道模拟器滤镜都是作用于屏幕空间(不是模拟器图形设置中的AA选项),和图形渲染不同:它往往是通过减少图像中的高频信号,而非增加采样频率或改变采样策略进行AA的。是纯粹的初次采样完毕之后的空间域行为,不需要获知图形的几何信息。

常用的屏幕空间AA就是FXAA了,其具体原理太过繁琐,可参考此贴:
https://catlikecoding.com/unity/ ... ced-rendering/fxaa/
一般来说,2D游戏,尤其16位机器以下的游戏不要使用Anti-aliasing shader。像素图像本身甚至可以说就是由锯齿构成的,如果强行进行AA会使图像看起来非常诡异:



3D游戏可酌情使用,尤其是模拟器本身AA开的不高的情况下。屏幕空间的AA效果虽然一般但通常速度较快,如果开3D游戏模拟器内AA比较吃力的情况下,就凑合用屏幕空间的AA吧。

放大增强滤镜
这类滤镜是平时最常见的,也是人们最为经常使用的滤镜(虽然LZ并不常用这类滤镜)。它的主要作用是减少像素画面的颗粒感。像素艺术最大的问题就是经不起放大:一旦放大以后,原本可爱的Sprite瞬间变得狰狞了起来:


为了解决像素图像放大的问题,人们发明了一系列增强算法。在机器学习介入之前,这类滤镜还比较简单,我们也只考虑机器学习之前的常用滤镜。

首先是基本的插值:Nearest Neighbor,Bilinear两种
像素图片放大这件事上,只要模拟器输出分辨率跟具体显示分辨率不匹配,模拟器本身就要选择一种插值方式。可以进行线性插值(颜色设为邻居的加权平均)或者最近邻插值(与最近的邻居像素颜色相同)。显示上最近邻插值能够还原原本的像素颗粒,而线性插值能进行初步的模糊和润滑,具体喜欢哪种就看个人喜好了。

Scale系列:
包括Scale2x、2xSal、EPX、AdvMAME2x等等。这类滤镜是使用简单的filter对图像进行卷积。有时比单纯的卷积要复杂一些,等价于使用了多个不同的滤镜进行卷积以后产生多个图像,最后对图像进行条件混合。还有些强调边缘的滤镜也会通过图像的二次差分判断边缘从而采取不同的混合策略(权重)。

考虑最简单的Scale2x,将像素P放大为4个子像素,根据周围4像素设置子像素的颜色采用以下规则:

1=P; 2=P; 3=P; 4=P;
IF C==A => 1=A
IF A==B => 2=B
IF D==C => 3=C
IF B==D => 4=D
IF of A, B, C, D, three or more are identical: 1=2=3=4=P

则称之为Scale2x算法。其结果其实基本上就是把一个像素分成了四个像素,颗粒感会大大下降。规则简单,性能也好:


其它Scale系列同理,主要都是在放大之后根据原图像周围像素颜色通过一定规则决定子像素颜色。
Eagel、2xSal也是同一系列的滤镜,只不过考虑的周围像素范围不同。例如比较复合的Super2xSal考虑的像素范围就要更大一些,涉及周围11个像素的值,并且也设置了相似的判定规则,效果如下:



Scale系列滤镜是我认为16位机和8位机的底线,下面的就稍微有点越界了。

HQx和xBR滤镜系列

有时候现代人口味刁钻,希望能消除像素本身的颗粒感。而前面那些简单的临像素加权平均或分支的滤镜会导致边缘模糊,并且处理像素游戏中的线条非常苦手,因此有人开发了相应更复杂的滤镜满足这些人的需求。

HQx系列:(high-quality scale)
这一系列滤镜会根据周围像素颜色与自己的不同关系(周围8个像素根据阈值分为相似或者不相似两类,因此共256种可能),通过查找表的方式确定放大之后的像素颜色如何定义。而这一查找表本身的定义比较复杂。用C写几千行也很不容易(包含了HQx-2/3/4 https://github.com/grom358/hqx/blob/master/src/hq2x.c),当然用GLSL要简单不少。其目的主要是为了放大之后的线条能够更加顺滑。


xBR滤镜系列

xBR滤镜系列,包含 xBR , xBRZ, xBR-Hybrid, Super xBR, xBR+3D 和Super xBR+3D.

同样的,这些滤镜也主要是用来游玩像素游戏时消除像素颗粒感使用。总有人认为这种圆滑感看起来比颗粒感的像素更舒服一些。
这类滤镜比HQx更强大的地方在于通过多个pass解决了许多HQx的单次查找表索无法解决的问题,让还原的线条更加锐利。
具体原理参考:( https://forums.libretro.com/t/xbr-algorithm-tutorial/123)( https://pastebin.com/cbH8ZQQT



虽然这里可怜的马里奥看起来有点不堪,但一般情况下这个滤镜没有那么惨。xBR滤镜对边缘的处理远比HQx更加强大,非常善于消除像素的颗粒感并且保留色块和边缘的锐利。NGA有人专门写过一篇文章吹这个滤镜,并且认为xBRZ是最好的2D放大滤镜(单纯从放大角度,不考虑深度学习类的方法,应该算是没错的)。有需求的可以参考一下:
https://bbs.nga.cn/read.php?tid=9171524
(然而说实话我是xBR PTSD,看着就难受)

其他大多数像素增强也都是采用了各种不同的自定规则对子像素进行插值。效果有好有坏。游戏之间的图像特征也有很大的区别,适用不同滤镜,大家使用时可以根据自己的视觉体验进行选择。
比如NEDI(New Edge-Directed Interpolation), 论文: http://web.archive.org/web/20101 ... et/library/nedi.pdf
比如专门为GB/GBA设计的OmniScale: https://sameboy.github.io/scaling/
深度学习方面尤其跟GAN有关的方法则包含一些AI将图片库中特征结合进行的创作,不符合高还原度retro gaming的主题,一般也不推荐使用。


效果型滤镜

以下滤镜会生成一些有趣的效果,一般用不着,想体验一下也行。

Dithering:dithering是早期PC、针式打印机等等用点阵表示密度来展现色彩的。最近很火的独立游戏《obra dinn》也是这种风格。但单纯基于图像的dithering其实很消耗时间,采用一些近似的化效果也不好。用在16位机的游戏上也并不合适,凑合看看吧:
bayer-matrix-dithering:


Cel-shading:卡通渲染用在16位机上当然是个灾难,但3D游戏有时候也有点意思。同样的,不要指望单纯的屏幕空间的滤镜能搞出什么花来:


老电影
technicolor滤镜是一个不错的老电影效果滤镜,还能模拟胶卷上的点和划痕:


效果型滤镜随喜好添加即可。

硬件仿真型滤镜
这是我认为模拟器屏幕空间滤镜真正有用的地方,也是本帖的重头戏。这类滤镜的目标是尽量模拟真实硬件的显示设备,在现代LED显示器上对古旧显示设备(掌机屏幕、电视、街机CRT等)进行仿真,从而带来更多模拟游戏和怀旧乐趣的一类滤镜。
注意,这里介绍的大部分滤镜的最佳使用场景都是4K显示器全屏游玩。各种掌机屏幕几乎都没有能力模拟这些效果,而手机屏幕太小,效果是看不清的。

首先来说说比较简单的掌上设备。使用显示器屏幕模拟掌机设备的一大问题是无法准确模拟掌机屏幕的表现。而屏幕空间的滤镜通过色彩、像素颗粒感这两方面尝试逼近掌机屏幕的表现。

例如GB(带光)式的色彩和像素映射(gameboy-light):仔细观看会发现马里奥采用了方形像素,并且使用了横向和纵向的像素分割线对老式LCD进行了风格化。色彩映射也是GB的绿屏。


可见像素并非简单近邻插值,而是同时模拟了像素本身的荧光扩散效果。使用了大量的像素模拟了单个GBA像素的荧光扩散灰度显示不同亮度时的不同梯度。因此才能将像素显示的阴影感准确模拟出来。而这一效果也是在4K显示器下才能体现得最为明显。因为4K显示器有足够的像素去表现这些效果。(你要问我为什么用4K显示器全屏玩GB游戏?可能是吃得太饱了……)

对比一下就知道加滤镜和不加滤镜的天壤之别。很可爱吧,是不是想起了另一个古旧LCD设备(文曲星):


这里这个GB的滤镜是LCD系列滤镜的一种。这一系列滤镜就是为了创造相应掌机设备LCD屏幕效果而出现的。它的原理大框架就是增加像素之间的间隔形成LCD颗粒感,通过隔离的荧光过渡形成像素本身的阴影感,从而复原当年的古旧LCD屏幕的样子。

比如GBA样式(包括了GBA屏幕的颜色映射,GBA反射颜色并不鲜艳,用现代的屏幕去显示需要通过一定的映射)。一定程度上还原了像素排列方式,甚至还原了GBA屏幕本身的动态模糊:


举个GBA游戏的例子:用GBA的朋友对这种色彩和像素风格的画面应该有印象



对比不加滤镜的鲜艳色彩和线性插值的图像(用模拟器玩晓月的朋友记忆中应该是这个画面):


如果你觉得9102年了还要还原GBA的色彩简直开历史倒车(虽然这正是这篇文要干的事情……),那么也可以只进行LCD像素映射。只使用LCD3X系列滤镜而不映射色彩即可:


同样的,NDS也可以采用类似滤镜。

由于PSP的屏幕相对来说要好不少,类似现代显示器屏幕,一般没有针对PSP屏幕的模拟需求。如果想模拟PSP的屏幕可以使用RetroArch自带的PSP-color进行色彩映射。


下面说说另一个(真正的)重头戏:
CRT滤镜

首先请把所有其它CRT滤镜扔掉,只留下一个:CRT-Royale(除非硬件跑不了,再考虑其他)。

滤镜使用了大量pass进行了CRT的模拟。如果PC性能够强的话,延时方面的影响也很小。CRT-Royale十分复杂和强大,对GPU有一定的要求。如果用intel的GPU的话(集显)需要进行修改,改版也在RetroArch里提供了。

用来显示CRT-royale滤镜的屏幕至少需要2K以上的分辨率,4K甚至8K屏幕的模拟效果更加真实。是的你没看错,要模拟CRT,最低要求是2K分辨率,4K更佳

我们知道CRT中的磷光体(或荧光体)是产生冷发光现象的物质,受到阴极射线(电子束)激活发光。它发出的光线具有一定的特征,与现代LED的像素光线有较大的区别。CRT滤镜的关键就是通过大量现代LED像素去模拟磷光体的发光特征,从而模拟CRT的显示效果。而在这方面做得最好的就是此滤镜了。(CRT虽然没有直接的像素的概念,只有荧光粉或者荧光条。不过电子束的信息改变是离散的,因此我们可以将离散电子束信息改变周期内扫过的空间等价为像素的概念)。

在RetroArch的桌面UI里打开CRT-royale的设置界面,我们可以看到很多相关设置,涉及到一些重要的调整项。如果你对Shader语言略有了解,也可以直接打开Shader文件进行调整,只是没有界面中方便。根据每个人接触到的不同型号和不同厂家生产的CRT,你所喜爱的CRT参数必然有所不同,玩家可以自行调整到喜欢的设置选项。

首先看看效果(网络图片有压缩,要观看大体效果还是自己4K全屏运行模拟器比较靠谱。看图片也要看大图,小图自带AA,把所有特征都抹掉了):



对比没开滤镜的游戏:


影响最终效果的选项很多。下面我们来解释一些影响较大的参数:

Halation and Diffusion
Halation是被荧光体直接反射的光线,而Diffusion是光线穿过CRT玻璃时产生的散射荧光。这两项参数的权重可以进行调整。


Bloom
如果点亮的荧光体发光过强影响到了电视上的其他面积,使整个画面变得过亮,就是一种bloom的效果。特别好的CRT会控制bloom,但由于这是大量中低端电视可能产生的效果,因此也需要忠实模拟。


Beam
这项参数控制了实际进行扫描的电子束的各项维度。不知为何一直有人认为scanline是黑线:scanline是扫描到的线,而没扫描到的地方才是黑线。除了可以调整Beam本身的大小以外,这里也可以调整高斯模糊函数的各个参数。根据不同的参数选择可能产生不同型号电视或街机的效果:


Convergence
彩色电视电子枪发射的三束射线对荧光粉的轰击是否足够整齐:好的CRT比如彩监是非常整齐的,但许多消费者级别的CRT这方面的表现就很一般了,根据每个人童年不同质量的CRT可以仔细微调。


MASK
这项控制的是荧光体的排列方式。滤镜提供了三种排列:0.0 (Aperture Grille), 1.0 (Slot Mask), 和 2.0 (Dot Mask)。这三种排列如下:

每一种排列都对应不同厂家的电视效果,可以分别予以调整。同时,MASK也有大量参数可以进行调整。比如使用的荧光体个数可以调整CRT显示的粒度。


和其它滤镜相比也是高下立判。如果你觉得没有高下立判,就调整参数让它高下立判!


不同的制式和不同的输入会有一定程度的图像失真,没关系,这些失真可以用额外的pass来模拟。比如电视机的composite输入导致的色彩失真效果,加NTSC的色彩映射的效果如下:





再传两个其他游戏的图,还是那句话,要在自己的屏幕上运行模拟器动态才能比较明显看到效果。





以上基本介绍了常见的几种Filter和它们的大体效果。那么如何使用这些filter?哪些模拟器支持shader语言写的filter呢?
这里:http://emulation.gametechwiki.com/index.php/Shaders_and_Filters 介绍了一些常见模拟器支持的filter文件类型。一般来说,采用通用前端RetroArch可以使用大部分的shader,而使用模拟器自带前端则有很多限制。所以最简单的方案就是直接使用RetroArch,然后从其shader文件夹中选择所需shader,并通过菜单调整相应参数即可。

具体来说,RetroArch目录下有个Shaders目录,Shaders目录下面三个文件夹分别是三种不同类型的shader语言写的shader,大多都实现了一遍。其中不少预设做得不错,比如GBA可以用预设好的lcd-grid-v2-gba-color-motionblur,就集成了好几个滤镜同时对图像进行变换。而CRT滤镜CRT_royale在shaders/shaders_xxx/crt文件夹里。通过RetroArch的加载预设Shader的功能,选择这些文件,就可以使用相应滤镜了。

总结:模拟器滤镜是个挺大的话题,这里只是简单介绍一些类型和它们的效果。一般来说,对32位及以下机型模拟时才推荐使用屏幕空间的滤镜,抗锯齿滤镜一般不推荐像素游戏使用。像素放大增强滤镜根据个人口味使用,一般来说进行简单的2xSal等即可,特别讨厌像素的颗粒感的话,可以考虑HQx或xBR系列滤镜。如果追求一些特殊效果,可以使用效果型滤镜。而为了模拟古旧硬件(主要是显示设备),则可以分别使用该种硬件的滤镜。CRT滤镜主要就是CRT-Royale,按照自己口味调整之后,配合高亮度4K显示器,基本可以满足一般CRT模拟需求。如果有特殊需要当然实机+彩监更好,没有这个条件的话模拟器效果也不赖,而且彩监只能体验一种或少数型号的显示效果,而滤镜可以自行配制体验多种电视和信号的不同感觉,因此也并不冲突。此外,部分Filter会降低游戏性能,或者因为需要帧信息从而略微增加游戏延时,有性能需求时应当关闭所有滤镜。
不摸鱼了。

参考:

http://emulation.gametechwiki.com/index.php/CRT-Royale
https://en.wikipedia.org/wiki/Pixel-art_scaling_algorithms
https://www.retroarch.com/index.php?page=shaders
http://emulation.gametechwiki.com/index.php/Shaders_and_Filters


感谢版主加亮,加一些FAQ。
Q&A
Q:我在用xxx模拟器(比如PS2……),这个模拟器好像不支持CRT_Royale,怎么办呢?或我不喜欢RetroArch,不用这个的话怎么自由使用滤镜?

首先当然是看RetroArch能否支持你使用的模拟器后端(也就是是否包含在Libretro里)。一般来说只要使用RetroArch,事情就解决了。

如果RetroArch不支持,或者不喜欢使用这个前端,另一个办法是用ReShade,但需要改写一下Shader的源文件。只能有志者去改了。其他一些可用的滤镜见这里:
https://github.com/Matsilagi/reshade-retroarch-shaders
再有就是通过OBS之类录屏软件间接执行shader,可以参考这里:
https://obsproject.com/forum/res ... er-v1-0-update.775/

具体我就没时间研究了,有愿意尝试的可以试着跳坑。

一个典型例子是PS2,现在只能采取上面这些间接的办法。要直接使用,要么改一下CRT_Royale让PCSX2能编译(应该不算特别难但暂时没人去做),要么等PCSX2的Core做出来,或者看Play!的Core什么时候发布。
制作PCSX2的Libretro Core的悬赏:
https://github.com/libretro/RetroArch/issues/6867
libretro近期会发布Play!的Core,有兴趣也可以关注一下:
https://www.libretro.com/index.p ... ng-a-libretro-core/


Q:使用这些滤镜延时大不大?
一般来说这类滤镜由于只是处理一遍图像,因此所需的性能不多,Lag很小。CRT-Royale因为有14个pass,如果增加其他效果的话pass更高,对性能还是有一定需求的,但很多人的测试是GTX750以上性能方面就基本不是问题了。如果明显感觉到Lag当然还是关掉滤镜比较好。

Q: LZ能不能提供你使用的滤镜?
因为每个人的显示设备不同,所以还是自行调整比较好(至少gamma要调好)。
RetroArch已经有一些多pass的预设,比如crt-royale-tvout+image-adjustment等等,直接用效果也不错。如果对扫描线很执着,也可以直接用cgp/crt-royale-kurozumi(国外论坛很多人喜欢这个滤镜,有兴趣不妨试试看效果)。

Q:为什么我加载一些滤镜没有效果?
可能是RetroArch的bug,有些后端运行的时候不支持编译某种类型的shader。试试其他语言(比如CG、GLSL换着试试)的相应滤镜。

Q:球面效果和CRT皮肤是怎么弄的?
球面效果在CRT_Royale的geom选项那里设置,可以设置球面的半径,以及设置观众距离球面的距离等等参数。
至于那个CRT皮肤,是我直接放在OBS里的一张边框图片而已,营造一些怀旧氛围。模拟器设置里也有一些边框可以选择。

Q:搞这个干啥反正比不上CRT
手机照相或许被单反秒杀,不代表手机照相没意义。至少有一定怀旧需求的朋友还是需要一些利用现代硬件模拟古旧硬件的简单方法。虽然总体应该不如成色好的CRT,但如果使用的4KLED显示器质量还行的话,效果也不赖,具体可以自行实验一下。

[ 本帖最后由 Lunamos 于 2019-6-27 19:10 编辑 ]


本帖最近评分记录
  • sfox 激骚 +3 最骚 Rated by wap 2019-6-26 19:37
  • 深蓝色的海 激骚 +3 最骚 Rated by wap 2019-6-26 17:43
  • SimbaKing 激骚 +2 精品文章 2019-6-26 15:37
  • ggggfr 激骚 +1 最骚 Rated by wap 2019-6-26 14:38
  • Kilveru 激骚 +1 精品文章 2019-6-26 14:36

TOP

有些独立游戏像素精灵尺寸低,用2xSal作为自带滤镜,还不能改,看上去就很不舒服



TOP

支持长文分享 马克学习一下

这么看来高亮GBA屏幕实机的显示效果其实更接近模拟器效果 色彩鲜艳一点


TOP

专业文顶一个

TOP

XBR是最烂的,直接把游戏的艺术风格都破坏了

TOP

引用:
原帖由 qwerrrr 于 2019-6-25 20:08 发表
支持长文分享 马克学习一下

这么看来高亮GBA屏幕实机的显示效果其实更接近模拟器效果 色彩鲜艳一点
都知道最早的GBA没有背光,但是开发者自己也是用模拟器在PC上做测试,早期有的作品实机测试不足,月轮就是个例子
所以后来很多游戏在有意识给图像本身加亮,比如白夜,这种在模拟器上又太亮了
转机是2003年,出现了普通版GBA SP,还有NGC的GB PLAYER,有的游戏开始在选项里加入不同的亮度给玩家自由选择

TOP

mark,营养贴赞。。。

TOP

引用:
原帖由 Nemo_theCaptain 于 2019-6-25 20:01 发表
有些独立游戏像素精灵尺寸低,用2xSal作为自带滤镜,还不能改,看上去就很不舒服
这种不算特别激进的近邻像素规则还好了,就是粗像素变成了细像素,毕竟现代人看不惯高清马赛克了。而HQx和xBR看起来难受多了,SE一开始在Steam上卖CT就是默认这种滤镜被各种喷,喷到后来SE加了去除滤镜的选项。

TOP

posted by wap, platform: Chrome
技术贴。。。。

TOP

略带夸张的说,这怕不是近20年来edfc最有内容的帖子。

如果有反驳意见,不必动嘴,直接把你觉得edfc上有干货的帖子地址发出来即可。

能凑出一个  有干货的帖子  的收藏贴,也行。

TOP

楼上确实夸张了……我就是前阵子稍微查了些模拟CRT的东西,发个简单分享贴。现在回头一看可读性有点差,有空再改改。
本帖最近评分记录
  • 小悟空 激骚 +1 最骚 Rated by wap 2019-6-26 20:54
  • 混血王子 激骚 +1 最骚 Rated by wap 2019-6-25 23:50

TOP

mark,学习了

TOP

posted by wap, platform: Samsung
在我眼里所有不能保证像素清晰的滤镜都是辣鸡,尤其是那些hqx滤镜,简直毁了pixelart

另外retroarch自带的那些仿真滤镜效果真是太棒了,稍微去看了下发现是好几个效果叠加出来的。

本帖最后由 wind 于 2019-6-26 00:53 通过手机版编辑

TOP

posted by wap, platform: iPhone
前排仰望,看不懂但觉得很专业

TOP

太有心了,谢谢楼主。

建议楼主可以把它编成图文并茂的PDF,能长远广泛流传。

在下虽然稍有涉猎,但是这么详尽的技术解说让人功力大增。

TOP

发新话题
     
官方公众号及微博