AntiAliasing学习笔记
简介
MSAA是直接硬件支持的,使用pattern在一个像素上做多次fragment计算,最后对去结果做平均的方式,这是在输出之前对结果做滤波,但是这个方法的缺点是占用的显存会变成原来的pattern采样点的倍数。当然这个MSAA多重采样的性质也可以用到别的需要这个这特特性的地方,比如Voxel化
FXAA和SMAA都是形态学方法抗锯齿,简单而言就是找到边界,在边界位置做低通滤波,即采样求平均值,就可以做到抗锯齿
TAA则是采用Temporal的方法,做时间上的滤波,需要注意上一帧的数据在当前帧是否被遮挡住了
FXAA
FXAA的核心思路就是查找当前边界并做滤波,通常称为形态学方法,实现参考FXAA3.11
边缘检测用灰度值,或者要效率高点直接使用Green通道也行,虽然效果会差一点(其实可以看颜色频谱分布,绿色在中间,而且所占的频谱范围更广)
Local Contrast Check: 采样上下左右的点的灰度值,计算出最大contrast,如果对比度不大,就可以直接判断当前像素点不在边缘上
l.contrast < max(_ContrastThreshold, _RelativeThreshold * l.highest);
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;}
边缘检测
- Vertical/Horizontal Edge Test:用类似于Sobel算子的核计算水平和竖直方向的梯度,梯度更大的方向作为边缘的方向
- End-of-edge Search:因为边缘有可能是曲线,所以我们需要找到真正需要Blend的侧面,而且求出blend的权重,需要把uv朝着真正的边界偏移半个像素,并朝着两边分别查找边 End-of-edge ,最后权重为
0.5 - shortestDistance / (pDistance + nDistance)
比较 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主要包含:
- MotionVector 计算
- 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学习笔记相关推荐
- Qt 学习笔记(5)绘图 五子棋游戏
在上一篇博客C++ Qt学习笔记(4)绘图中介绍了Qt中的绘图方法,基于上一篇的博客的知识,使用QPainter设计一个五子棋的棋盘,后续会完成五子棋的游戏设计. 1. 棋盘的设计 首先需要绘制棋盘的 ...
- 【QT 5 学习笔记-学习绘图相关+画线图形等+绘图事件+基础学习(1)】
[QT 5 学习笔记-学习绘图相关+画线图形等+绘图事件+基础学习(1)] 1.说明 2.实验环境 3.参照学习链接 4.自己的学习与理解 5.学习与实践代码. (1)建立基础工程. (2)加入绘图事 ...
- GAMES101-现代计算机图形学学习笔记(作业02)
GAMES101-现代计算机图形学学习笔记(作业02) Assignment 02 GAMES101-现代计算机图形学学习笔记(作业02) 作业 作业描述 需要补充的函数 思路 结果 原课程视频链接以 ...
- DX11龙书学习笔记---准备工作
DX11龙书学习笔记---准备工作 1.交换链和页面翻转 深度缓冲区 多重采样 1.交换链和页面翻转 为了避免在动画中出现闪烁,最好的做法是在一个离屏(off-screen)纹理中执行所有的动画帧绘制 ...
- 【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】
[QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结] 1.概述 2.实验环境 3.参考资料-致谢 4.自我提升+实验效果 5.代码练习-学习后拆解 (1)头文件部分 (2)绘制事件+绘制表 ...
- GAMES101 学习笔记 Lecture 1~6
目录 GAMES101 学习笔记 Lecture 1~6 往期作业汇总帖 Lecture 01 Overview of Computer Graphics 笔记参考 其他教程 怎么判断一个画面是否优秀 ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
最新文章
- 剑指offer:面试题34. 二叉树中和为某一值的路径
- (C++)1040 有几个PAT
- android 设置按钮高度,如何在本机android中设置按钮的高度
- python基础30个常用代码大全-Python基础小题汇总
- CPython对象模型:string(留坑待填)
- boost::regex模块实现将 C++ 文件转换为语法突出显示的 HTML的测试程序
- 本地Git关联远程Git时遇到的一些问题
- jsp文件上传_猿蜕变系列7——也说说springMVC上传姿势
- android放在上个元素的左边代码,控件悬浮在某个控件之上 Android五大布局方式——相对布局(RelativeLayout)属性详解...
- linux 根分区分的太大了,linux根分区满了如何处理,查找大文件方法
- php asort,PHP asort() 函数
- 利用UrlRewrite,asp.net动态生成htm页面
- CMY和CMYK彩色模型
- 为啥E进制计算机的效率最高?
- ubuntu下听ape音乐
- 【光模块专题】最常见的几种光模块光纤接口类型
- 数据数值转换factorize和dummy
- Windows软件清单
- 网易我的世界服务器配置文件翻译,精致存储的配置文件翻译 - [RS]精致存储 (Refined Storage) - MC百科|最大的Minecraft中文MOD百科...
- 【手游项目4】过滤特殊字符,游戏账号名,玩家游戏名,数据库特殊字符检测
热门文章
- Python中自定义函数参数类型
- 你需要来自XX的权限才能对此文件夹进行更改”的解决方法
- 山东大学软件学院计算机组织与结构实验一
- 事件修饰符@(stop, prevent, self, once, capture, passive)
- Maya中英切换的两种方法
- python倒序输出数组_python如何逆序输出数组
- 学好日语两年之内到日本去挣钱
- 排序算法-O(n^2)-优化后的冒泡、简单选择、直接插入 代码实践、解释等
- python保存类对象到文件_python存储对象到文件
- C/C++中一个int型指针占几个字节?