# SRP_FXAA **Repository Path**: alienity/SRP_FXAA ## Basic Information - **Project Name**: SRP_FXAA - **Description**: 在Unity上实现的FXAA - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-04 - **Last Updated**: 2022-05-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SRPAntiAliasing MSAA是直接硬件支持的,使用pattern在一个像素上做多次fragment计算,最后对去结果做平均的方式,这是在输出之前对结果做滤波,但是这个方法的缺点是占用的显存会变成原来的pattern采样点的倍数。当然这个MSAA多重采样的性质也可以用到别的需要这个这特特性的地方,比如Voxel化 FXAA和SMAA都是形态学方法抗锯齿,简单而言就是找到边界,在边界位置做低通滤波,即采样求平均值,就可以做到抗锯齿 TAA则是采用Temporal的方法,做时间上的滤波,需要注意上一帧的数据在当前帧是否被遮挡住了 ## FXAA FXAA的核心思路就是查找当前边界并做滤波,通常称为形态学方法,实现参考FXAA3.11 1. 边缘检测用灰度值,或者要效率高点直接使用Green通道也行,虽然效果会差一点(其实可以看颜色频谱分布,绿色在中间,而且所占的频谱范围更广) 2. **Local Contrast Check**: 采样上下左右的点的灰度值,计算出最大contrast,如果对比度不大,就可以直接判断当前像素点不在边缘上 ![NESW cross plus middle pixel.](https://img-blog.csdnimg.cn/img_convert/c2c002c07e3a3b852c073ccebe60c6ab.png#pic_center) ```c l.contrast < max(_ContrastThreshold, _RelativeThreshold * l.highest); ``` 3. **Sub-pixel Aliasing Test**: 对当前像素周围所有像素,计算当前的Sub-pixel混合权重,让blend更平滑一点 ![Linear vs. squared smoothstep.](https://img-blog.csdnimg.cn/img_convert/b2b49fed6a11df177785801f6b962dd2.png#pic_center) ```c 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)``` ![No, current, and desired edge blending.](https://img-blog.csdnimg.cn/img_convert/8634496227289c0ee50f5110382128b0.png#pic_center) 5. 比较 Sub-pixel Aliasing Test 计算出的Blend系数与边缘检测得到的Blend系数,选择更大的那个作为混合的权重 ```c float pixelBlend = DeterminePixelBlendFactor(l); EdgeData e = DetermineEdge(l); float edgeBlend = DetermineEdgeBlendFactor(l, e, uv); float finalBlend = max(pixelBlend, edgeBlend); ``` ![未做AA](https://img-blog.csdnimg.cn/20210408030009375.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rlbmd5aWJpbmc=,size_16,color_FFFFFF,t_70#pic_center)![在这里插入图片描述](https://img-blog.csdnimg.cn/20210408030355833.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rlbmd5aWJpbmc=,size_16,color_FFFFFF,t_70#pic_center) #### 引用 [1] [https://catlikecoding.com/unity/tutorials/advanced-rendering/fxaa/](https://catlikecoding.com/unity/tutorials/advanced-rendering/fxaa/) [2] [https://developer.download.nvidia.cn/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf](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](https://docs.nvidia.com/gameworks/content/gameworkslibrary/graphicssamples/d3d_samples/fxaa311sample.htm)