【技术美术图形部分】简述主流及新的抗锯齿技术

news/2024/4/26 11:32:10/文章来源:https://blog.csdn.net/qq_41835314/article/details/129238947

电脑的世界里没有曲线,都是三角面组成一个个模型的,因此一定会出现走样(锯齿)的情况,只是严重与否的问题,而AA也是实时渲染最难解决的问题之一。

Sampling&Artifacts

Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering),这里采用101里老师介绍采样和走样的方式:

采样有两种,

  • 图片——离散成像素
  • 视频——采样时间

因此采样不只发生在不同的位置,还发生在不同的时间,意味着采样能发生在空间上,也能发生在时域上,时间上我理解的是采样动态,如下图:

采样会产生一些列问题(Sampling Artifacts),这些Artifacts可能是,

  • 空间上的——锯齿、摩尔纹等失真现象
  • 时域上的——车轮效应(wagon wheel effect)、运动闪烁等动态的失真现象
摩尔纹
人眼时间上的采样跟不上运动速度

把产生这一系列Artifacts的现象叫做走样(Aliasing),而走样的根本原因是:信号变化太快(高频),以至于采样跟不上。

更加详细地从信号采样来分析走样原因可以直接看101第6节后面的内容,这里就直接进入反走样的部分了。

Anti-Aliasing

走样影响呈现效果,要保证画面质量我们就要反走样。游戏中画面设置就会有反走样(抗锯齿)的选项设置,例如大表哥里的:

上往下对应的是TAA、FXAA和MSAA。

反走样是有三种思路的:

  • 多次采样——MSAA、TAA等
  • 后处理寻找边界,插值以平滑边缘——FXAA、SMAA等
  • 基于深度学习的——DLSS

其中DLSS,基于深度学习的抗锯齿,是由英伟达训练模型,以驱动更新的形式推送给用户。 

接下来那就顺着简单介绍一下。首先是最简单粗暴的方法:

1 多次采样

SSAA*

Super Sampling Anti-Aliasing,超级采样。它思路非常简单,提高信号采样频率,使用低通滤波降采样,实时渲染中就是先提高图像采样分辨率(规则采样、旋转采样各种采样都可),把画面渲染到一张较大纹理上,然后再低通滤波(box、Gauss等)降采样,缩小纹理,呈现出来的纹理边缘平滑且清晰。

如下图,对于当前像素我们分为了4个采样当前像素的子像素点,拿shader来讲,SSAA相当于per-sampling-shading,fragment shader要被调用4次才能得到当前像素点的颜色值。

图片截取自参考文章
图片截取自参考文章

很显然,SSAA性能消耗很大——需要渲染画面到高分辨率的rt,还需要降采样。一般也不会被应用于游戏中。

1.1 MSAA

Multi Sampling Anti-Aliasing,多重采样,是一种比较古老的游戏中采用的抗锯齿技术。MSAA是SSAA的衍生,但与SSAA相比,MSAA是per-pixel-shading,MSAA并不是通过提升分辨率的方式达到抗锯齿,它的那么多个子像素点仅仅是为了在光栅化阶段去计算覆盖情况(一些子像素点可能会被重复利用),在fragment shader阶段才会去计算最终的像素颜色,即只计算一次,如下图:

截图自水印

你会发现游戏中开MSAA需要设定倍数:X2/X4/X8,这个倍数表示着渲染像素被分配的采样点个数。倍数越大,当然采样分辨率放的越大,意味着效果更好,也很吃显卡性能,例如下图的对比:

图源参考文章

再次应证了,8倍MSAA并不会让帧数直线下降到原来的1/8,会有很多的子像素点被重复利用。

liasing表现在实时渲染更多的是“锯齿”这一失真现象。MipMap解决的就是缩小纹理产生锯齿的aliasing,

TAA,即Temporal Anti-Aliasing,在图形学中TAA是通过对多个时间点的采样进行加权平均来模糊图像,以减少图像或者动画的锯齿、失真。

1.2 TAA

主流抗锯齿方案详解(二)TAA

Temporal Anti-Aliasing,是基于时间的抗锯齿,基于SSAA的FSAA、MSAA等等都是在空间上做手脚——在一帧内完成所有子像素渲染,而TAA是在时间上做优化——把这个过程分散在多帧完成,在不同时刻进行少量采样,即综合历史帧数据达到抗锯齿。

一些基于采样的后处理效果,例如体积光、SSAO、SSR、体积雾、Raymarching云等等,也可以跟TAA帧混合,通过降低每帧采样次数达到很好渲染效果的同时,开销也不至于太大,例如下图:

图截取自参考文章

这里就有疑问了:

  • TAA会让画面变得不清晰吗?

首先结论是当然会,如下图,TAA性能明显优于8倍MSAA,但画面会模糊。

图源参考文章
  • 如果是动态场景那如何去获得历史帧的数据?

这个问题就是TAA复杂的点了,TAA分为采样和合成(Sampling&Resolve)两个过程,对于静态画面TAA很简单,直接把N个次像素点分为几份,每帧来一份,最后叠加取均值即可。但对于视角发生变化的动态画面,直接混合是不可能的,会有残影。

关于TAA如何进行,后面会单独出一个SRP管线下实现TAA的文章,这里就不过多的进行描述。

另外,PO一下别的地方看到对TAA的评价吧,

NVIDA TXAA*

TXAA | 技术 | GeForce (nvidia.cn)

一种电影风格的抗锯齿技术,结合了MSAA和CG中类似电影的解算过滤器——以牺牲性能来换取最高画质,让游戏视效达到接近逼真的水平。 

2 后处理

大部分情况我们想要抗锯齿的地方都是物体边缘、亮度变化较大的地方,可以通过后处理的方式找到边缘进行针对性处理。

2.1 FXAA

主流抗锯齿方案详解(三)FXAA

Fast Approximate Anti-Aliasing,快速近似抗锯齿。FXAA就是一种屏幕后处理算法,提取边缘像素,与周围像素插值以达到平滑边缘的效果。

提取边缘像素(通过亮度) --> 计算边缘像素法线 --> 计算整个边缘的法线方向 --> 混合颜色(这是大概的过程,有机会其实是想手写一次FXAA试试的,这里没时间了只想后面实现TAA,具体的话可以直接看参考文章)。

FXAA几乎不吃性能,只需要一个PASS实现,集成方便,因此也多用于手游,但会模糊画面,由于是基于亮度进行的边缘检测,对于亮度变化快的地方会很不稳定,出现画面闪烁的情况。因此FXAA只是一种粗糙的模糊处理方法。

2.2 SMAA

主流抗锯齿方案详解(四)SMAA

Enhanced Subpixel Morphological,增强次像素?SMAA建立在MLAA之上,比FXAA更清晰,需要3个PASS,性能略大,过程的话主要是看上面文章里罗列的源码,过程了解的会更清楚一点:

有机会会代码走一遍,现在就先过一遍。

3 最近的技术

2023了,盘点抗锯齿技术如果到SMAA就戛然而止那可太古老了,再说说一些新兴的、最近出现的一些抗锯齿技术,虽然没有强到扒源码的程度。。但是知道一点总比不知道强。

3.1 FSR

AMD FidelityFX Super Resolution | AMD Partner Hub

AMD FidelityFX Super Resolution,超强分辨率技术。2021年推出了FSR1.0,2022推出了FSR2.0(maybe对标NVIDA DLSS)时域上实现抗锯齿,未来似乎可以替换掉TAA()

3.2 DLSS

DLSS 2.0 - 重新定义AI渲染

DLSS 2.0 - 基于深度学习的实时渲染图像重建

DLSS1.0和2.0原理是有区别的:

没看这两篇文章之前我以为DLSS只是加上了深度学习的SSAA类别,结果不是的,学到了。太有启发了,保持学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_75196.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MAML算法详解(元学习)

文章目录回顾元学习MAML算法MAML和预训练模型的区别数学推导MAML实施细节总结回顾元学习 元学习的基本知识参考这篇博客元学习和机器学习的对比 MAML算法 学习初始化参数,所有任务的初始化的参数都是一样的 MAML和预训练模型的区别 MAML使用的是ϕ\phiϕ…

阶段十:总结专题(第六章:缓存篇)

阶段十:总结专题(第六章:缓存篇)Day-第六章:缓存篇1. Redis 数据类型**String****List****Hash****Sorted Set**2. keys 命令问题3. 过期 key 的删除策略4. Redis 持久化**AOF 持久化****AOF 重写****RDB 持久化****混…

Python 中 openpyxl 模块封装,读写 Excel 文件中自动化测试用例数据

只有测试数据和错误提示信息不同,其他代码都是一样的,不这样不易修改数据和维护,会有两点痛点 1.代码冗余极其严重, 程序可读性不佳 2.程序拓展性很差 往往我们在自动化测试汇总,会将数据放在 Excel 文件、CSV文件、数据库 Py…

Python-scatter散点图及颜色大全

# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as pltplt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False #matplotlib画图中中文显示会有问题,需要这两行设置默认字体plt.xlabel(X) plt.ylabel(Y) plt.xlim…

【IP技术】ipv4和ipv6是什么?

IPv4和IPv6是两种互联网协议,用于在互联网上标识和寻址设备。IPv4(Internet Protocol version 4)是互联网协议的第四个版本,是当前广泛使用的互联网协议。IPv4地址由32位二进制数构成,通常表示为4个十进制数&#xff0…

大数据技术之Hive(四)分区表和分桶表、文件格式和压缩

一、分区表和分桶表1.1 分区表partitionhive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择式选择查询所需要的分区,这样的查询效率辉提高很多。1.1.1 分区表基本语…

2023年蜂巢科技最新面试题

2023年蜂巢科技最新面试题 bio与nio的区别 bio同步阻塞io:在此种⽅式下,⽤户进程在发起⼀个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,⽤户进程才能运⾏。JAVA传统的IO模型属于此种⽅式&#xff0…

flink常用算子介绍

flink任务中【Transformation 数据转换】是对数据进行操作,有 Map、FlatMap、Filter、KeyBy 、Reduce 、Fold 、Aggregations、Window 、WindowAll 、Union 、Window join 、Split 、Select 、Project 等,通过对数据的操作,转换成想要的数据&…

HttpRunnerManager部署

基于HttpRunner的接口自动化测试平台: HttpRunner, djcelery and Django_. HttpRunner手册: http://cn.httprunner.org/git地址:httprunner/HttpRunnerManager: 基于 HttpRunner 的 Web 测试平台,已停止维护。 (github.com)部署机器:linux部署…

vue3+rust个人博客建站日记4-Vditor搞定MarkDown

即然是个人博客,那么绝对不能丢给自己一个大大的输入框敷衍了事。如果真是这样,现在就可以宣布项目到此结束了。如今没人享受用输入框写博客。作为一个有追求的程序员,作品就要紧跟潮流。 后来,Markdown 的崛起逐步改变了大家的排…

华为OD机试题,用 Java 解【火星文计算 2】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

跑步戴哪种蓝牙耳机比较好,五款适合跑步的蓝牙耳机推荐

跑步当中佩戴的蓝牙耳机,佩戴舒适度以及牢固度是我们首要关注的,耳机的材质还有耳机的防水能力,都是十分需要注意的方面。那具体在挑选运动耳机当中需要如何选择呢?下面收集的一些在运动当中比较好用的运动蓝牙耳机分享给大家。1、…

华为OD机试题,用 Java 解【机器人走迷宫】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

力扣每日一题(2023年2月)

2023年2月期每日一题第一天 (2325. 解密消息)第十六天(2341. 数组能形成多少数对)第十七天 (1139. 最大的以 1 为边界的正方形)第十八天 (1237. 找出给定方程的正整数解)第十九天 &a…

【再临数据结构】Day1. 稀疏数组

前言 这不单单是稀疏数组的开始,也是我重学数据结构的开始。因此,在开始说稀疏数组的具体内容之前,我想先说一下作为一个有着十余年“学龄”的学生,所一直沿用的一个学习方法:3W法。我认为,只有掌握了正确的…

Apache Hive入门

文章目录一、Apache Hive概述1.1、什么是Hive1.2、使用Hive原因1.3、Hive和Hadoop关系二、Hive功能思想2.1、映射信息记录2.2、SQL语法解析、编译三、Hive架构、组件3.1、Hive架构图3.2Hive组件四、Hive常用操作4.1、数据类型4.1.1、基本数据类型4.1.2、集合数据类型4.2、数据库…

本地新项目上传到git的详细步骤

前提:你本地的项目目录里要记得添加.gitignore忽略文件,免得把一些无用的文件提交,内容如下,可直接粘贴: # Created by .ignore support plugin (hsz.mobi) ### Java template # Compiled class file *.class# Log fi…

2023-02-28 mmap的原理及使用-思考

摘要: 最近在使用mmap解决数据库内存占用损耗过高导致OOM的问题, 不得不说在有些场景下mmap是非常有用. 本文主要涉及一些对mmap的思考. mmap本身的思考: mmap和文件系统的交互规则是什么mmap中给进程虚拟内存映射的文件上的部分,是什么? 为什么是页缓存? 有没有文件缓存?…

华为OD机试题,用 Java 解【连续字母长度】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

百度CTO王海峰:深度学习平台+大模型,夯实产业智能化基座

2月27日,中国人工智能学会首届智能融合产业论坛在成都顺利举办。本届论坛由中国人工智能学会(CAAI)主办,中国人工智能学会智能融合专委会、百度公司、深度学习技术及应用国家工程研究中心和电子科技大学联合承办。中国工程院多名院…