• FC/NES
  • SFC/SNES
  • N64
  • NGC
  • Wii
  • WiiU
  • GameBoy
  • GBC
  • GBA
  • NDS
  • 3DS
  • PS1
  • PS2
  • PS3
  • PSP
  • PSV
  • MD
  • SS
  • DC
  • PC-E
  • Xbox360
  • More...
2 0 0

[转载][多图]介绍游戏模拟器里各种常用滤镜的原理和效果,以及9102年了该如何正确模拟CRT!

管理员 Mr.C
4103 2

本文共计9103个字,预计阅读时长36.4分钟。

目录

原文链接:

原文作者:Lunamos

这是一篇我之前发在老害论坛TGFC的帖子(

),修改整理一下发在这里的专栏了。主要是尝试看看B站这个专栏怎么用。以后可能也会搬运一些我的其他帖子过来。打扰到你的时间线的话非常抱歉。


模拟器滤镜生成的图像都是在不清楚游戏本身运行逻辑的情况下,单纯对最终输出的图像进行变换。因此实际上这里用Filter远比用Shader来得更为精确。不过因为RetroArch的滤镜系统将其统称为Shader,因此之后我们也将不分辨该用词(也就是下文中的shader=滤镜=filter)。

本文将从放大增强滤镜抗锯齿滤镜特殊效果滤镜硬件仿真滤镜四个角度,对使用模拟器时常见的各种进行介绍,并着重对现在应该如何模拟CRT进行说明。读完本文,你应当对模拟器中常见后处理滤镜有更多的了解,并能够更好地享受硬件仿真滤镜带来的独特怀旧感受。

放大增强滤镜

这类滤镜是最常见,也是人们最为经常使用的滤镜。它的主要作用是在分辨率增多、屏幕放大的模拟环境中,尽量减少像素画面的颗粒感,从而提供顺滑的视觉感受。

众所周知,像素艺术的一个最大的问题,就是经不起放大:一旦放大以后,原本可爱的Sprite瞬间变得狰狞了起来:

图片隐藏,注册或登陆后显示

虽然UP本人十分喜欢Sprite直接放大的锐利感,但并非所有人都觉得舒服,因此才会出现很多放大增强滤镜以减缓这种像素的突兀感,增加图像的顺滑度。在机器学习相关的方法介入之前,这类滤镜可以说都还比较简单,我们也只考虑深度学习之前的基于图像处理的基础滤镜。

首先是基本的插值:Nearest Neighbor,Bilinear两种。

像素图片放大这件事上,只要模拟器输出分辨率跟具体显示分辨率不匹配,模拟器本身就要选择一种插值方式。可以进行(双)线性插值(颜色设为原生像素邻居的加权平均,权值与距离成反比,当然,插值使用的曲线也不见得必须是线性的,还可以是bicubic等)或者最近邻插值(像素颜色与最近的原生邻居像素颜色相同)。显示上最近邻插值能够还原原本的像素颗粒,而线性插值能进行初步的模糊和润滑,具体喜欢哪种当然就看个人喜好了。

图片隐藏,注册或登陆后显示

Scale系列滤镜

包括Scale2x、2xSal、EPX、AdvMAME2x等等。这类滤镜是使用较为简单的filter对图像进行卷积,以改进单纯进行双线性插值产生的模糊感。有时比单次卷积要复杂一些,会使用多个不同滤镜进行卷积以后产生多个图像,最后对图像进行条件混合,有些希望强调图像边缘的滤镜也会通过图像的二次差分判断边缘从而采取不同的混合策略(权重),其中许多具体过程则涉及到一些图像处理的专门知识,希望深入了解的话可以参考经典的冈萨雷斯版《数字图像处理》。

这里我们只介绍最简单的Scale2x的原理本身

参考维基

考虑我们希望将像素P生成四个子像素,如何确定每一个像素的颜色呢?Scale2X算法根据周围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

如果A, B, C, D中有3个或更多像素颜色相等,那么: 1=2=3=4=P

结果其实基本上就是把一个像素分成了四个像素,颗粒感已经大大下降了。规则简单,性能也好:

图片隐藏,注册或登陆后显示

其它Scale系列同理,主要都是在放大之后根据原图像周围像素颜色通过一定规则决定子像素颜色,但算法从简单到复杂差异很大。比如相对简单的Eagel、2xSal,考虑的周围像素范围较少,而比较复合的Super2xSal考虑的像素范围就要更大一些,涉及周围11个像素的值,并且也设置了相似的判定规则,效果如下:

图片隐藏,注册或登陆后显示

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

HQx和xBR滤镜系列

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

HQx系列:(high-quality scale)

这一系列滤镜会根据周围像素颜色与自己的不同关系(周围8个像素根据阈值分为相似或者不相似两类,因此共256种可能),通过查找表的方式确定放大之后的像素颜色如何定义。而这一查找表本身的定义比较复杂。用C写几千行也很不容易(

),当然用GLSL要简单不少。其目的主要是为了放大之后的线条能够更加顺滑。

图片隐藏,注册或登陆后显示

xBR滤镜系列

xBR滤镜系列,包含 xBR , xBRZ, xBR-Hybrid, Super xBR, xBR+3D 和Super xBR+3D等等。同样的,这些滤镜也主要是用来游玩像素游戏时消除像素颗粒感使用。总有人认为这种圆滑感看起来比颗粒感的像素更舒服一些。

这类滤镜比HQx更强大的地方在于通过多个pass解决了许多HQx的单次查找表索无法解决的问题,让还原的线条更加锐利。

具体原理可以参考:

图片隐藏,注册或登陆后显示

虽然这里可怜的马里奥看起来有点不堪,但一般情况下这个滤镜没有那么惨。xBR滤镜对边缘的处理远比HQx更加强大,非常善于消除像素的颗粒感并且保留色块和边缘的锐利。

其他

其他大多数像素增强也都是采用了各种不同的自定规则对子像素进行插值。效果有好有坏。游戏之间的图像特征也有很大的区别,适用不同滤镜,大家使用时可以根据自己的视觉体验进行选择。

比如NEDI(New Edge-Directed Interpolation)就是一个相对比较著名的方法,原理和实现参考这里:

比如专门为GB/GBA设计的OmniScale:

还有Kopf–Lischinski方法,来自于SIGGRAPH 2011年的

,介绍了将像素绘制转换成轮廓曲线并自定义色块的方式。其效果如下:

图片隐藏,注册或登陆后显示

而深度学习方面尤其跟GAN有关的方法则包含一些AI将图片库中特征结合进行的创作,不符合高还原度retro gaming的主题,一般也不推荐使用。如果你有兴趣也可以研究一下~

(UP个人是不使用这类滤镜的,原生像素很可爱呀……)

抗锯齿滤镜

对模拟器常见的2D游戏来说,抗锯齿滤镜基本没什么用,所以只是简单介绍一下吧。

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

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

常用的屏幕空间AA就是FXAA了,其具体原理太过繁琐,可参考此贴:

一般来说,2D游戏,尤其16位机器以下的游戏不要使用Anti-aliasing shader。像素图像本身甚至可以说就是由锯齿构成的,如果强行进行AA会使图像看起来非常诡异:

图片隐藏,注册或登陆后显示

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

效果型滤镜

顾名思义,效果型滤镜主要是用来产生一些有趣效果的,一般用不着,想体验一下也行。这里随便介绍几种,除此之外当然还有许多丰富的效果型滤镜可以使用。

Dithering:dithering

Dithering:dithering是早期PC、针式打印机等等用点阵表示密度来展现色彩的。最近很火的独立游戏《Obra Dinn》也是这种风格。

但单纯基于图像的dithering其实很消耗时间,采用一些近似的化效果也不好。用在16位机的游戏上也并不合适,凑合看看吧:

bayer-matrix-dithering:

图片隐藏,注册或登陆后显示

Cel-shading

对所谓“二次元”或“卡通渲染”感兴趣的话就应当了解cel-shading,游戏中这类shader是经常使用的。但卡通渲染用在16位机上当然是个灾难,并且,不要指望单纯的屏幕空间的滤镜能搞出什么花来,有意义的cel-shading还是要获取游戏几何信息以后才能有较好的发挥:

图片隐藏,注册或登陆后显示

老电影滤镜:technicolor

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

图片隐藏,注册或登陆后显示

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

硬件仿真型滤镜

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

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

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

图片隐藏,注册或登陆后显示

图片隐藏,注册或登陆后显示

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

对比一下就知道加滤镜和不加滤镜的天壤之别。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的色彩映射的效果如下:

图片隐藏,注册或登陆后显示

再传几个其他游戏的图,还是那句话,要在自己的屏幕(4K)上运行模拟器动态才能比较明显看到效果。如果你就是CRT时代的过来人,应该能一眼看出真正的童年和虚伪的童年吧。

图片隐藏,注册或登陆后显示
图片隐藏,注册或登陆后显示
图片隐藏,注册或登陆后显示

图片隐藏,注册或登陆后显示
图片隐藏,注册或登陆后显示

图片隐藏,注册或登陆后显示

以上基本介绍了常见的几种Filter和它们的大体效果。那么如何使用这些filter?哪些模拟器支持shader语言写的filter呢?

这里:

介绍了一些常见模拟器支持的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会降低游戏性能,或者因为需要帧信息从而略微增加游戏延时,有性能需求时应当关闭所有滤镜。

一些其他参考:

一些Q&A

Q:我在用xxx模拟器(比如PS2……),这个模拟器好像不支持CRT_Royale,怎么办呢?或我不喜欢RetroArch,不用这个的话怎么自由使用滤镜?

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

如果RetroArch不支持,或者不喜欢使用这个前端,另一个办法是用ReShade,但需要改写一下Shader的源文件。只能有志者去改了。其他一些可用的滤镜见这里:

再有就是通过OBS之类录屏软件间接执行shader,可以参考这里: 具体我就没时间研究了,有愿意尝试的可以试着跳坑。

一个典型例子是PS2,现在只能采取上面这些间接的办法。要直接使用,要么改一下CRT_Royale让PCSX2能编译(应该不算特别难但暂时没人去做),要么等PCSX2的Core做出来,或者看Play!的Core什么时候发布。 制作PCSX2的Libretro Core的悬赏:

libretro近期会发布Play!的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显示器质量还行的话,效果也不赖,具体可以自行实验一下。

TAGS

最后于 7月前 被 Mr.C 编辑
本站内容均为会员发表,并不代表本站立场!
请诸君在讨论时务必遵守中华人民共和国中华人民共和国相关法律!
良言一句三冬暖,恶语伤人六月寒,请诸位换位思考,理性讨论。
如果你觉得帖子不错,请点赞、收藏、投币支持楼主(投币每人每天能投三次哦)

最新回复 ( 2 )
  • VIP PECO
    0 沙发

    很好,不用自己一个一个去试了。不过毕竟是19年的文,有些内容可能已经有更新了。风格上个人倾向于还原硬件,但是也不想无限调参追求极致还原效果,最好是一键能实现个七七八八就可以了。

  • 管理员 Mr.C
    0 藤椅

    原帖由 PECO 于 2023-8-18 02:43 发表 BackTrack

    很好,不用自己一个一个去试了。不过毕竟是19年的文,有些内容可能已经有更新了。风格上个人倾向于还原硬件,但是也不想无限调参追求极致还原效果,最好是一键能实现个七七八八就可以了。 ...

    看喜好吧,RA模拟器打开游戏以后直接用RetroArch\shaders\shaders_slang\crt里面的挨个试试

  • 游客
    藤椅

    您需要登录后才可以回帖

    立即登录 立即注册