翻译:赵晶晶(于璇宣远)
修订:李晓达(DDBC4747)
锯齿问题
在我提出超级采样之前,让我们回顾一下锯齿是什么。
锯齿波是信号理论中一个非常明显的问题。根据一般的采样定理,我们需要使信号频谱只包含低于奈奎斯特频率的频率。如果我们不这样做(我们在栅格化三角形时总是这样做,因为三角形的边是无限谱的,类似阶跃响应),最终信号(由样本重构)中会出现一些频率,这些频率在原始信号中是不存在的。视觉锯齿具有不同的外观,可能以规则的模式(所谓的莫尔条纹)、噪声或闪烁出现。
经典超采样
经典超采样是CGI行业广泛使用的技术。我们以更高的频率对每个目标图像片段进行多次采样(例如,通过跟踪多条射线的每个简单像素,或者在不同位置对覆盖相同屏幕像素的片段进行着色),然后执行信号采样和滤波(例如,去平均)。方法有很多种,甚至是最简单的超采样(我在之前的一篇博文里讲过),但主要问题是相关的成本——n个超采样通常意味着n个基本着色成本(至少对于某些流水线阶段来说),有时是n个基本存储成本。像MSAA这样简单的硬件加速技术,只能以较高的频率来估计流水线的某些部分(像素覆盖),效果不是很好。甚至这项技术在控制台上也有相当大的成本。
即使超级采样通常不切实际,但它会随着时间而变化,成本几乎为零。
随机超采样理论
那么什么是随机超采样呢?随机超级采样技术基于一个简单的观察——从一帧到另一帧,大多数屏幕上的内容保持不变。我们发现,即使是复杂的动画,几个片段只是改变了位置,但除此之外,它们通常至少对应于之前和未来的一些其他片段。
基于这个观察,如果我们知道上一帧中确切的纹理元素位置(我们经常这么做!例如使用用于每个对象运动模糊的运动矢量等。),我们可以在多个帧之间分配超采样的多个片段评估分量。
更令人兴奋的是,这项技术可以应用于任何通道——最终图像、AO、屏幕间反射空等——以过滤信号或增加样本数量。我将首先描述如何将这种技术用于最终图像的超采样以实现更好的AA,然后给出使用这种技术的例子,它可以将样本数量和效果质量像SSAO一样提高两到三倍。
随机抗锯齿
不知道哪个游戏第一次使用随机超采样AA,但是来自Crytek的Tiago Sousa在SIGGRAPH2011的《孤岛危机2》中展示了这个话题和这个技术的应用。Crytek建议对最终的MVP变换矩阵使用亚像素抖动,该矩阵改变每一帧——同时在后处理风格通道中组合两帧。通过这种方式,他们几乎可以免费将采样分辨率提高一倍!
太好了,是真的吗?
当然,这个简单实现的结果在静态截图上是完美的(而且你可以在几个小时内实现!* *),但在运动过程中被打断。对应于当前帧的前一帧的像素位于不同的位置。这个问题很好解决:使用向量,但有时候你寻找的信息被遮挡或占用。要解决这个问题,不能仅仅依靠深度(因为这种技术的整个重点是从当前帧丢失的样本中获取额外的覆盖和边缘信息),所以Cryteck提出通过比较运动矢量的大小来剔除不匹配的像素。
* * *可以,如果有友好的3D开发引擎,我觉得最多一个工作日就能完成。用一个简单的平移矩阵乘以你的MVP矩阵,这个矩阵以(-0.5W,-0.5/h)和(0.5W,0.5/h)抖动。每隔一帧写一个独立的通道,合并帧(n)和帧(n-1),输出结果。
《刺客信条4》中的用法——动机
长期以来,我们一直依赖FXAA(通过基于深度的边缘检测)作为游戏开发中的简单AA技术。这种简单的技术在静态图像中通常是“可以”的,可以提高图像质量,但在运动中会被破坏——因为边缘估计和模糊因子会因帧而异。虽然我们的运动模糊(简单而有效的实现,对每个有皮肤的运动对象使用实际的运动矢量)有助于平滑边缘,以找到移动非常快的对象(小的运动矢量扩展更有帮助),但它不会对平静的动画和亚像素细节做任何事情。我们的游戏充满了运动模糊——看看绑着帆的绳子、拼花板和茂密的丛林!不幸的是,运动模糊无助于这些缓慢移动的对象的抗锯齿。FXAA在运动中增加了一些烦人的噪音,尤其是在草地上。我们真的没有时间尝试所谓的“wireAA”,因为MSAA不在我们的预算之内,所以我们决定尝试随机抗锯齿技术。
我要特别感谢我们的技术领导人本杰明·戈尔茨坦。我很乐意在制作后期和他一起尝试各种随机AA技术,为他们搭建原型。
刺客信条4》 XboxOne/PlayStation 4 AA
在第一次迭代中,我们从希门尼斯等人的形态SMAA的单帧变化开始,在刺客信条4最基本的设定中,清晰地展现了质量更好的FXAA的替代品(代价更高,但由于下一代控制台的计算能力更大,类似于当代控制台下FXAA的预算)。形态学边缘重建在噪声和伪影较少的情况下效果更好,但显然不能重建所有子像素的细节。
所以下一步就是尝试嵌入随机AA成分。经过几个小时的工作,看——我们有了更好的AA。请看下图。
没有AA
FxAA-好,但是字符上的AA是模糊的,并且在子像素上有不好的噪声
单一样品更锋利,但许多锯齿不受影响
随机AA
很神奇吧?
当然可以,但这只是一开始静态图像的结果——这是AA问题的开始(不是结束)!)。
正确的运动矢量
好吧,我们有一些我们认为“精确”的微妙运动模糊,那么运动矢量是否应该容易允许运动对象的适当二次投影?
嗯...不。对于大多数对象,我们做了正确的事情,运动模糊是可以的——在一些特定的对象上,您不能真正注意到运动模糊的缺乏或轻微的运动模糊错误。但是对于随机AA,你需要让所有对象都有正确的运动模糊,像素完美!
在其他方面,你会得到一个巨大的双重形象。如果试图掩盖这些物体,不对其施加随机的AA,就会从亚像素相机位置的变化中得到明显的抖动和振动。
我列出了我们面临的所有关于运动矢量的问题,以及一些关于我们是否解决了这些问题的评论。
布料和柔软的实物。一些物理模拟在游戏(人物、船帆)中使用得非常迅速和广泛。从我们对布料和软物体的物理模拟中,我们得到了世界上完整的顶点信息空。对象矩阵被设置为一致,因此这样的对象具有零运动矢量(只有相机的运动被应用到这些矢量)。我们需要从引擎和物理中提取这样的信息——幸运的是,这相对容易,因为它已经被用于边界框计算。我们修正了软物体和布物体的重影,但是运动本身没有运动矢量——我们不想把流水线完全改成GPU间接寻址,也不想从两个顶点缓冲区中减去位置。这是可能的,因为他们不会移动来期待意想不到的,我们也没有看到任何神器。
有些“自定义”对象类型带有自定义矩阵,我们曲解了数据的事实。其他动态对象也存在同样的情况。在总共只有几天的时间里,我们让一些自定义的运动矢量调试渲染模式工作,并修复了所有这些bug。
海洋。没有写到g缓冲区。我们看不到海洋表面的运动矢量,但是我们有适当的信息——海底或者“天空空”后面的信息(当有非常深的海洋时,根本没有底部)。这里的修复是覆盖一些G缓冲区,比如深度和运动矢量。但是我们还是没有存储之前帧的模拟结果,也没有尝试使用这些结果,所以理论上你可以在风暴中大而快的波浪上看到一些重影。这对于我们来说不是什么大问题,测试人员也没有报道过。
有计划地移动植被。我们有一些由艺术家基于顶点噪声创建的植被运动,我们没有计算两个帧的顶点位置值之间的差异来生成适当的运动向量。这是游戏中最大的来自随机AA技术的可见神器。我们根本没有时间修改我们的材质着色器编译器/生成器,也不能在补丁中应用任何重大的数据更改(我们在第一个补丁中改进了AA)。如果局部顶点位置依赖于任何在帧间变化的输入数据,比如“时间”,或者依赖于最近的人实体位置(可以用来模拟植被之间的碰撞),这里合适的解决方案可以是:自动复制这些美工创建的所有着色器代码来计算输出局部顶点位置,通过插值传递值(透视校正!),减去它,就会得到合适的运动矢量。像非常模糊的树叶这样的人工产物有时在最终的游戏中是可见的,我对此并不感到骄傲——尽管这可能是程序员的一个常见问题。
在蒙皮中,对象瞬间移动。我们对实体和网格的瞬时移动进行了一些验证,但是在一些单一情况和自定义情况下,蒙皮用于瞬时移动对象-分析整个骨架以寻找时间不连续性是不切实际的。我们要求游戏和动画程序员在这样的框架中标记,并快速修复所有剩余的bug。
基于拒绝算法的运动矢量问题
好了,我们花1-2周时间修正我们的运动矢量(运动模糊好多了!),但同时我们也意识到,Crytek提出的方法对于SMAA的体育排外来说还远远不够完善。我把问题分成两类。
边界条件
这不是我们真正想发生的,但是如果菜单快速弹出,随机AA就会崩溃,你暂停游戏,你退出控制台仪表盘(但游戏仍然可见),相机瞬间移动或者立即开始一些后处理。你会看到一些奇怪的过渡帧。我们必须分别解决每个问题——通过禁用抖动和在这样的框架上组合帧。你本来打算用随机AA来发现,测试,修复所有这些问题,再加一两个星期。
错误拒绝技术
这是我在简单的SMAA相似方法中最大的实际问题,该方法通过比较物体的运动来抑制混合。
首先,我们很难调整拒绝阈值的“魔值”,8位运动矢量帮不上忙。物体会被幻影化或晃动。
其次,样本地面和阴影有一个很大的问题——阴影本身是重影的——嗯,阴影或任何其他动画纹理都没有运动矢量,对吗?爆炸、粒子或慢慢落下的树叶也不会(我们模拟粒子系统)。
对于这些问题,我们提出了一个简单的解决方案——我们不仅要比较运动物体的相似度,还要在它们上面加一个阈值——如果物体的运动速度比当前或上一帧快2个像素左右,就不能混用!我们发现这样的价值观更容易调整和发挥作用。解决了阴影和可见鬼的问题。
我们还增加了运动模糊,以减少任何潜在的可见振动。
不幸的是,它对透明或动画的纹理变化没有任何作用,这些变化是混合的,非常模糊——但作为一个酷的副作用,我们得到了雨滴和雨水波纹的柔和的“梦幻”结果,这是由我们的艺术总监更新的。
最近,TiagoSouse在他的SIGGRAPH 2013演讲中提出了一个解决这个问题的方案:通过将测量标准改为基于颜色,我们将在不久的将来进行探索。
具有不同效果的随机超级采样-SSAO
我想介绍随机超采样的另一个用途,会出现在下一代主机的最终游戏中,我真的很喜欢。我的灵感来源于马特·斯沃博达的演讲,以及他提到的在多个帧之间分配AO计算采样模式。我们有三种不同的SSAO采样方法(螺旋),每帧都改变(旋转)。在模糊SSAO效应之前,我们结合了这些方法。这样,我们有效地将样本数量增加了3倍,需要的模糊更少,获得了更好的AO质量和性能。存储成本只包括两个额外的历史纹理。可惜我没有截图证明你要接受我说的话,不过我以后会尽量更新帖子。
对于抑制技术,我依赖于一个简单的深度比较——我们不关心几何前景对象边缘的SSAO和AO定义的深度不连续性,并且应该几乎没有。唯一可见的问题是,当SSAO施法者沿着静止的SSAO接收器快速移动时——有可见的时间滞后痕迹——但我研究过,这种情况更多的是一个手动问题,而不是游戏中的一个严重问题/情况。与随机抗锯齿不同,将这项技术应用于游戏(使用正确的运动矢量)和测试只花了不到一天的时间,没有真正的问题,所以我真的建议使用这项技术——对于SSAO来说,在屏幕之间思考空等等。
总结
随机超采样是一个很棒的技术,会大大增强游戏的最终外观,但是不要指望你几天就能完成。不要拖到项目最后阶段,“因为只是后期处理,应该很容易添加”——不是这样的!测试人员需要花费几周甚至几个月的时间来报告所有的问题用例,然后反复适当地解决所有的问题。有适当的优化运动矢量。想想如何为艺术家创作的素材写出这些运动矢量。如果不需要写(静态对象和相机的运动矢量),如何在通道中批量对象,避免使用额外的MRT。看16位和8位运动矢量的质量差异(也可能是R11G11B10格式和B通道的一些其他G缓冲属性),测试所有用例,在制作前期简单的花时间在正确完成上,比如改变一点骨架计算或者缓存顶点皮肤信息(一点“顶点历史”)还是可以接受的选择。
今日推荐
添加边肖微信,享受双倍优惠
1.加入嘉德成徐苑交流基地
获取行业干货信息,观看丹尼尔分享的直播
2.直接接收60G独家节目数据库,地址在边肖朋友圈
包括腾讯内部分享,文章教程,视频教程等全套信息
↓龙出版社加GAD苏苏↓
1.《抗锯齿 程序丨如何使画面更逼真?随机超级取样和抗锯齿解析》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《抗锯齿 程序丨如何使画面更逼真?随机超级取样和抗锯齿解析》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/821028.html