简介

MSAA是直接硬件支持的,使用pattern在一个像素上做多次fragment计算,最后对去结果做平均的方式,这是在输出之前对结果做滤波,但是这个方法的缺点是占用的显存会变成原来的pattern采样点的倍数。当然这个MSAA多重采样的性质也可以用到别的需要这个这特特性的地方,比如Voxel化

FXAA和SMAA都是形态学方法抗锯齿,简单而言就是找到边界,在边界位置做低通滤波,即采样求平均值,就可以做到抗锯齿

TAA则是采用Temporal的方法,做时间上的滤波,需要注意上一帧的数据在当前帧是否被遮挡住了

FXAA

FXAA的核心思路就是查找当前边界并做滤波,通常称为形态学方法,实现参考FXAA3.11

  1. 边缘检测用灰度值,或者要效率高点直接使用Green通道也行,虽然效果会差一点(其实可以看颜色频谱分布,绿色在中间,而且所占的频谱范围更广)

  2. Local Contrast Check: 采样上下左右的点的灰度值,计算出最大contrast,如果对比度不大,就可以直接判断当前像素点不在边缘上

    l.contrast < max(_ContrastThreshold, _RelativeThreshold * l.highest);
    
  3. Sub-pixel Aliasing Test: 对当前像素周围所有像素,计算当前的Sub-pixel混合权重,让blend更平滑一点

     float DeterminePixelBlendFactor (LuminanceData l) {float filter = 2 * (l.n + l.e + l.s + l.w);filter += l.ne + l.nw + l.se + l.sw;filter *= 1.0 / 12;filter = abs(filter - l.m);filter = saturate(filter / l.contrast);float blendFactor = smoothstep(0, 1, filter);return blendFactor * blendFactor * _SubpixelBlending;}
    
  4. 边缘检测

    1. Vertical/Horizontal Edge Test:用类似于Sobel算子的核计算水平和竖直方向的梯度,梯度更大的方向作为边缘的方向
    2. End-of-edge Search:因为边缘有可能是曲线,所以我们需要找到真正需要Blend的侧面,而且求出blend的权重,需要把uv朝着真正的边界偏移半个像素,并朝着两边分别查找边 End-of-edge ,最后权重为 0.5 - shortestDistance / (pDistance + nDistance)
  5. 比较 Sub-pixel Aliasing Test 计算出的Blend系数与边缘检测得到的Blend系数,选择更大的那个作为混合的权重

     float pixelBlend = DeterminePixelBlendFactor(l);EdgeData e = DetermineEdge(l);float edgeBlend = DetermineEdgeBlendFactor(l, e, uv);float finalBlend = max(pixelBlend, edgeBlend);
    

SMAA

SMAA在paper给的代码里面已经实现的很好了,所以unity也基本是拿了原来paper的代码直接用的

SMAA流程

TAA

TAA主要包含:

  1. MotionVector 计算
  2. Temporal Reprojection 对输出纹理滤波

TAA流程

  • jittering view frustum

    • 16 first samples of halton(2,3)
  • generating velocity buffer
    • camera motion + dynamics (manual tagging, eurgh)
  • reprojection using velocity
    • based on closest (depth) fragment
  • neighbourhood clipping
    • center clip to RGB min max of “rounded” 3x3 region
  • motion blur fallback
    • kicks in when || v || > 2, and full effect at 15
    • does not apply to history

参考PlayerDead的Inside实现的TAA,效果对比如下图
在Unity上的实现代码 https://gitee.com/alienity/SRPTAA2,有兴趣的同学可以下载下来学习参考

引用

[1] https://catlikecoding.com/unity/tutorials/advanced-rendering/fxaa/

[2] https://developer.download.nvidia.cn/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf

[3] https://docs.nvidia.com/gameworks/content/gameworkslibrary/graphicssamples/d3d_samples/fxaa311sample.htm

[4] https://github.com/playdeadgames/temporal

AntiAliasing学习笔记相关推荐

  1. Qt 学习笔记(5)绘图 五子棋游戏

    在上一篇博客C++ Qt学习笔记(4)绘图中介绍了Qt中的绘图方法,基于上一篇的博客的知识,使用QPainter设计一个五子棋的棋盘,后续会完成五子棋的游戏设计. 1. 棋盘的设计 首先需要绘制棋盘的 ...

  2. 【QT 5 学习笔记-学习绘图相关+画线图形等+绘图事件+基础学习(1)】

    [QT 5 学习笔记-学习绘图相关+画线图形等+绘图事件+基础学习(1)] 1.说明 2.实验环境 3.参照学习链接 4.自己的学习与理解 5.学习与实践代码. (1)建立基础工程. (2)加入绘图事 ...

  3. GAMES101-现代计算机图形学学习笔记(作业02)

    GAMES101-现代计算机图形学学习笔记(作业02) Assignment 02 GAMES101-现代计算机图形学学习笔记(作业02) 作业 作业描述 需要补充的函数 思路 结果 原课程视频链接以 ...

  4. DX11龙书学习笔记---准备工作

    DX11龙书学习笔记---准备工作 1.交换链和页面翻转 深度缓冲区 多重采样 1.交换链和页面翻转 为了避免在动画中出现闪烁,最好的做法是在一个离屏(off-screen)纹理中执行所有的动画帧绘制 ...

  5. 【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】

    [QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结] 1.概述 2.实验环境 3.参考资料-致谢 4.自我提升+实验效果 5.代码练习-学习后拆解 (1)头文件部分 (2)绘制事件+绘制表 ...

  6. GAMES101 学习笔记 Lecture 1~6

    目录 GAMES101 学习笔记 Lecture 1~6 往期作业汇总帖 Lecture 01 Overview of Computer Graphics 笔记参考 其他教程 怎么判断一个画面是否优秀 ...

  7. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  8. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  9. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

最新文章

  1. 剑指offer:面试题34. 二叉树中和为某一值的路径
  2. (C++)1040 有几个PAT
  3. android 设置按钮高度,如何在本机android中设置按钮的高度
  4. python基础30个常用代码大全-Python基础小题汇总
  5. CPython对象模型:string(留坑待填)
  6. boost::regex模块实现将 C++ 文件转换为语法突出显示的 HTML的测试程序
  7. 本地Git关联远程Git时遇到的一些问题
  8. jsp文件上传_猿蜕变系列7——也说说springMVC上传姿势
  9. android放在上个元素的左边代码,控件悬浮在某个控件之上 Android五大布局方式——相对布局(RelativeLayout)属性详解...
  10. linux 根分区分的太大了,linux根分区满了如何处理,查找大文件方法
  11. php asort,PHP asort() 函数
  12. 利用UrlRewrite,asp.net动态生成htm页面
  13. CMY和CMYK彩色模型
  14. 为啥E进制计算机的效率最高?
  15. ubuntu下听ape音乐
  16. 【光模块专题】最常见的几种光模块光纤接口类型
  17. 数据数值转换factorize和dummy
  18. Windows软件清单
  19. 网易我的世界服务器配置文件翻译,精致存储的配置文件翻译 - [RS]精致存储 (Refined Storage) - MC百科|最大的Minecraft中文MOD百科...
  20. 【手游项目4】过滤特殊字符,游戏账号名,玩家游戏名,数据库特殊字符检测

热门文章

  1. Python中自定义函数参数类型
  2. 你需要来自XX的权限才能对此文件夹进行更改”的解决方法
  3. 山东大学软件学院计算机组织与结构实验一
  4. 事件修饰符@(stop, prevent, self, once, capture, passive)
  5. Maya中英切换的两种方法
  6. python倒序输出数组_python如何逆序输出数组
  7. 学好日语两年之内到日本去挣钱
  8. 排序算法-O(n^2)-优化后的冒泡、简单选择、直接插入 代码实践、解释等
  9. python保存类对象到文件_python存储对象到文件
  10. C/C++中一个int型指针占几个字节?