翘首以盼的抗锯齿

2024-06-06 23:12
文章标签 抗锯齿 翘首以盼

本文主要是介绍翘首以盼的抗锯齿,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Antialiasing

实际的图形学中是怎么实现反走样的呢?

我们不希望实际产出的图形有锯齿效果,那怎么办呢?

06fdde0120ff4b10b8382294479640bc.png

从采样的理论开始谈起吧 

Simpling theory

照片也是一种采样,把景象打散成像素放到屏幕上的过程:

9952d87c436040e4ac2145087fd29437.png

还可以在不同的时间(视频):

272da95e35814a6c97b3e1f3bf009cfc.png

 动画是定义在帧数上的

一个专业术语:Artifacts(瑕疵)

采样会产生很多问题,一个是锯齿:

b50e8204e72241589ddf39bd76711e93.png

还有问题比如说摩尔纹:

dc1451b6590e4724ae9dc31f87a8d43c.png

它怎么产生的呢?

 比如说把左边的奇数行奇数列都去掉变成小图,显示成和大图一样大,就能看到摩尔纹了(拿手机拍电脑显示器)

还有一种有意思的叫车轮效应,也是采样中出现的问题,比如人肉眼的采样速度跟不上高速旋转的物体:

6b3c2dc4fdd54addaa0c21deb03de848.png

我们如何反走样呢?

在采样之前做一个模糊(滤波),做一个模糊再采样就可以反走样:

 2b257c213daf49a287aa0bdef6a6e06a.png

d6d6b0f41c144d05adb178c102df534c.png

注意顺序是不能颠倒的,要先模糊再采样,如果先采样再模糊就变成了Blurred Aliasing:

9cd27af2f07e497696799203b1013178.png 那为什么采样的速度跟不上信号变换的速度就会走样?

Antialiasing in practice

Frequency Domain

先来看看频率吧:

f9c0fb9ce108460cb893a0a58b975e2c.png

调整前面的系数会得到不同的余弦波(频率不同) 

介绍正余弦波:

d3920e2a7baf465596ee1c2fcff63bda.png

为了介绍傅里叶级数展开(任何周期函数可以将其写成正余弦函数的线性组合)

还有个东西叫傅里叶变换:

c99a0ff7c92a414c8ed2b777bca86891.png

傅里叶变换:把函数变成不同频率的段并且显示出来:

64b12b35bb8d49e09c9f9bcfd6df205a.png 采样还原出的函数在不同频率下有出入,走样本质是信号变化的太快导致采样跟不上

 时域相乘,频域卷积,必须要到达两倍才不会走样

b0a8b08442f54108a4acebe365c71520.png

上面的结果就是采样两种频率完全不同的信号但是采样结果完全一样!

 这就是走样。

Filtering

把某个特定的频率给抹掉,说出对应信号如何变化

傅里叶变换就是从时域变到频域:

27c5158195f94a93ba1afc3a4fb6dcf0.png

 中心把其定义成低频的区域,周围全都是高频的区域,在不同频率的信息多少通过亮度表示

信息多集中在低频段

水平和竖直方向有道,我们在分析信号的时候我们会认为它是周期性重复的信号,那么对于不周期性重复的信号怎么办呢?

比如上图哪里重复了,并不重复对吧,我们通过右边界在重复左边界的内容,在边界会产生剧烈的变化从而产生极其高的高频,头顶位置和衣服下边缘位置的图像变化剧烈,导致高频区域为白色

滤波是去掉一些频率的内容,把低频信号抹掉,高频信号有意义:图像内容的边界

687f916495fc4d32a48906e67ab82b10.png

这种滤波叫高通滤波 (通过滤波器使只有高频的滤波可通过)

为什么高频信息就对应边界呢?

是不是变化很剧烈的才叫边界?

那就是高频信息呀,我们如果过滤掉高频只留下低频呢?

a416f17a78e34218a99add2139b4cddb.png

会发现边界模糊勒 

还可以做另外的实验:去掉高频。去掉低频,留下中庸之道,就可以提取到一些不是很明显的边界特征(中通滤波):

5bc40c182eed4e97bc4f64ee136d0255.png

卷积(Convolution)和滤波有关系,本质是一种点乘:

4fd0d143595e4a59935ee9e013badac8.png

这是要做一个卷积操作(加权平均):

7e46c9f66c2e48ea8a2408679e65e135.png

卷积定理: 时域卷积等于频域相乘,在时域上的乘积相当于在频域上的卷积:

29bd8929930c46a7b94e535ed931c9dc.png

1d14176bfb8242308d5cb929ddcbfa41.png

 卷积操作进行均值模糊,时域的卷积等于频域的乘积

滤波器本身是一个3×3的盒子,再×eq?%5Cfrac%7B1%7D%7B9%7D是为了不让图像整体的颜色值发生变化:

9b8904cab66a459cb8e8d9a423023f8b.png

 上面的例子显示出的结果是这个盒子是一个低通滤波器

bba02e0dc5b3421994d157bc40680891.png

时域上的一个小格子转换成频域,如果盒子在时域上变大了,那在频域上该如何变化呢?

盒子在时域上变大,反而在频域上变小:

9702e794d2634d618f186698dd1c44c3.png

 用越大的box做卷积会越来越模糊,如果用一个超级小的box就相当于根本没有做滤波,也就是说所有东西都被留了下来

采样是什么?是在重复频域上的内容(×另外一个函数):

d81836510fa24e6eb20e99457a07a78d.png

根据卷积定理,时域上的乘积对应到频域上为卷积,时域卷积等于频域乘积

采样就是在重复原始信号的频谱

1、左侧一列的中间是一个周期冲激序列,它在t=nT上纵坐标为无穷大,且频域(右中)仍是一个冲激序列,若用其与原信号相乘进行采样,采样的过程就不是让左边上中两图简单相乘就行了,它需要再进行一个过程将其转化为离散时间序列

2、实际采样时一个常用的办法是用一个在t=nT上纵坐标为1的采样序列乘信号源,这样可以直接得到采样信号

3、右上和右中卷积得到右下是可证的

为什么会产生走样就很显然了:采样的不同间隔会引起频谱以另外一个不同的间隔移动:

9bd0dc2fbb574112a7505f961fe3dcdc.png

 采样不够快,冲击函数频率低,卷积结果频率低(原始信号和复制粘贴的信号重合在一起了:发生走样,频谱搬移发生混合)

提升分辨率走样就会好很多(进行多的采样)

Reduce Alising

怎么改善走样呢?

052ab591386845a6a3458c8b175432f1.png

1.提高分辨率

2.先去模糊再去采样(模糊:低通滤波):

d1efd7ed0bb74310ae4a4a6b2beb6cb4.png

e4f54afed9644ba3a245dc940106d311.png 那么在实际的操作中,我们采用什么样的滤波器来进行卷积操作呢?

用一定大小的低通滤波器对其进行卷积:

07b7215b996146199b75bf29815c1954.png

 对像素覆盖的面积求平均:

27b2b40d0f3a44dd9a40a9bdc27b4d24.png

MSAA 

对更多采样点进行反走样(对反走样的近似,不能严格意义上解决反走样的问题),对大覆盖的点的近似:

18dc03b1cd43479095ffe36b7e87f78b.png

cc12082c4a31447eadeb2c30359a6d9d.png 

028ba31ba6304e08b10fb8a03bbccfca.png 

d09aa9ffb07049a89b0ae46935f0276f.png 

通过更多的样本进行反走样的第一步:模糊

 676864ff15fc47598a13ce2f1ee2020b.png

 MSAA是采样时提升了计算精度:

df2c91dd8fc449c68941c55ae88b1cd8.png

05a5a744f48c49f1a8a180ae2618a084.png 

通过增大计算量抗锯齿,还有其他抗锯齿的方法:FXAA(Fast Approximate AA:替换成没有锯齿的边界)、TAA(Temporal AA:找上一帧的信息)

Tips:Super resolution,超分辨率,把小图放大看到的全是锯齿,怎样把采样不够的图变得没有锯齿呢?可以通过深度学习的方法:DLSS(猜测)

Visibility/occlusion

首先需要谈的问题就是关于可见性,很直观的一种想法是先画远处的物体,再画近处的物体(把远处的物体遮挡住),由远到近做光栅化:(Painter's Algorithm)画家算法:

555ac0251ef74c2ab944998019f9a944.png

但是想要定义深度并不简单,需要光栅化排序:

da204d864e344033ac52f835b911a1b7.png

上面这种复杂的情况在深度上存在互相遮挡的关系,也就没办法用亲爱的画家算法,为了解决这个问题,在图形学中引入了一个概念:Z-Buffering

Z-Buffering

深度缓冲84144df9616640509bd52144d7ada7e6.png

 对三角形的覆盖关系不好判断,但是可以面向像素排序,记录像素离我们比较近的距离

最后得到的结果是要渲染出一幅画面:

cd2f42a7ce4f4a2b909567eabae90c14.png

这两幅图永远都是同时生成的,那算法在一开始的时候该如何进行呢?

看像素的具体情况,更新最浅深度:

ac623824a9b94441a2f66c1d5443adb1.png

深度缓存工作实例:

cec161338af1479eababbeafbf69b4a7.png 

涂新颜色、更新最小深度值 

深度缓存算法有一个好处:与顺序无关,不会有两个浮点数的值完全一样(出现深度完全一样的情况),深度缓存算法被广泛的应用于图形学

f68362e6eebb49b7bddfc6f794100c21.png

 

这篇关于翘首以盼的抗锯齿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037501

相关文章

抗锯齿技术简介

虽然3D图形渲染技术的飞速进步给我们带来了一次次的视觉震撼,电影级的画面早已经不是遥远的梦想,但电脑在计算3D画面时所出现的锯齿效果仍是不可避免的,这种效果在物体边缘最为明显。画面上那些跳牙咧嘴的锯齿每每令我们如蟹在喉,不吐不快。为了消除这些碍眼的锯齿,抗锯齿技术应运而生,并在图形处理技术不断发展的推动下日趋成熟和完善。 1. FSAA抗锯齿技术 最早的抗锯齿技术来自于3DFX,名为FSA

Threejs学习-Stats 性能监控器、抗锯齿

stats性能监控器 import Stats from 'three/addons/libs/stats.module.js' //引入包//添加性能监视器,查看帧率const stats = new Stats();document.body.appendChild(stats.domElement);// //渲染function animate() {requestAnimat

抗锯齿技术在AI去衣应用中的关键作用

引言 随着人工智能技术的飞速发展,图像处理领域涌现出许多令人惊叹的应用,其中AI去衣技术便是一个颇具争议却技术要求极高的分支。这项技术涉及将图片中的衣物以逼真的方式去除,同时尽可能保持原有图片的质感和细节。在实现这一过程中,抗锯齿技术(Anti-Aliasing, AA)发挥了至关重要的作用。本文将深入探讨抗锯齿技术在AI去衣中的应用及其重要性。 AI去衣技术概述 AI去衣技术通常依赖于深度

现代计算机图形学笔记(四)——反走样、抗锯齿

上节课我们判像素点是否在三角形内得到了三角形光栅化的结果,但是这样得到的三角形会产生严重的锯齿现象(走样Aliasing),这节课我们就来讨论抗锯齿(反走样Anti-Aliasing) 产生这样瑕疵(Artifacts)的原因是由于我们对三角形进行了采样(Sampling)。而采样会造成Artifacts的原因是图像或信号变化的太快了,而采样的速度太慢。 针对采样造成的走样问题,我们可以先

翘首以盼的Docker他迈着优美的步伐向我们走来啦(Docker基本管理)

Docker基本管理 一、Docker概述1、Docker是什么2、Docker与虚拟机的区别3、Docker的使用场景 二、Docker的核心概念及安装方式1、Docker核心概念(1)镜像(2)容器(3)仓库 2、CentOS安装Docker的两种方式3、安装部署docker(1)安装依赖包(2)设置阿里云镜像源(3)安装Docker-CE镜像容器仓库Docker数据卷数据卷容器端口映射

使用PorterDuff解决clipPath无法抗锯齿问题

一、简述 前段时间公司史无前例的接了一个大数据外包项目(哇~我们又不是外包公司(╯°Д°)╯︵ ┻━┻),要求搞很多图表方便观察运营的数据情况,图表当然要用到MPAndroidChart啦,但并不是所有的图表都可以用它用实现,这时就需要自定义View了,其中有一个要求,如下图所示,这就是本篇要实现的效果: 本篇全文适合像我一样的小白细细观看,如果你很赶时间,就只是进来看看标题上的解决方案,

OpenGL--抗锯齿

理论基础 1,锯齿:在图元边缘处我们能相当清楚地看到两种颜色的分界,我们把这种称之为锯齿。为什么会产生?这是因为我们的图像是由一个个像素组成的,而每个像素近似一个很小的正方形,这样由正方形组成的图像边缘肯定会产生锯齿。示意图如下: 2,抗锯齿:常见的抗锯齿方法有两种:混合和多重采样。使用混合消除锯齿的原理是,在边缘处降低alpha值再做混合操作从而达到欺骗眼睛的目的。然而混合操作受绘制顺序

单片机系统中的一种文字平滑(抗锯齿)显示方法

这是之前一个项目中已实现的方法,现在整理后拿出来分享。 单片机系统中文字显示部分一般用的是用取模软件取出字模后输出到屏幕上显示,这种方式显示的字体有锯齿,在DPI低的显示屏上锯齿效果非常明显。对于单色屏来说,这种情况无解。但是对于彩屏来说,如果还是用这种方式就显得有点落伍了,由于屏幕可显示的颜色丰富了许多,完全可以把显示效果做得更好,至少去掉字体边缘的锯齿。 一、思路 1、自制字体取模软件,

17.1 OpenGL将片段和样本写入帧缓冲区:抗锯齿应用

抗锯齿应用 Antialiasing Application 启用抗锯齿功能时,在图形渲染过程中,每个片元会计算出一个覆盖值来反映边缘平滑度。这个覆盖值在与片元本身的透明度(alpha 值)相乘后,产生一个更精确的最终 alpha 值,并用于混合 颜色。这一过程对帧缓冲区中支持固定点或浮点格式的颜色缓冲区有效,旨在消除锯齿并生成更为平滑和高质量的图像效果。

(自用)learnOpenGL学习总结-高级OpenGL-抗锯齿

MSAA 光栅器会将一个图元的所有顶点作为输入,并将它转换为一系列的片段。顶点坐标理论上可以取任意值,但片段不行,因为它们受限于你窗口的分辨率。顶点坐标与片段之间几乎永远也不会有一对一的映射,所以光栅器必须以某种方式来决定每个顶点最终所在的片段/屏幕坐标。 每个像素的中心包含有一个采样点(Sample Point),它会被用来决定这个三角形是否遮盖了某个像素。图中红色的采样点被三角形所遮盖