当前位置: 首页 > news >正文

GAME101-Lecture06学习

前言

上节课主要讲的是三角形的光栅化。重要的思想是要利用像素的中心对三角形可见性的函数进行采样。

这节课主要就是反走样。

课程链接:Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)_哔哩哔哩_bilibili

反走样引入

image-20240508211643655

通过采样,得到的这个三角形和实际的三角形有很大的区别。这种效果叫做锯齿,学名叫走样(aliasing)

采样产生的问题

artifacts:表示图形学中一切看上去不太对的东西。

采样会产生一系列问题,其本质都是信号(或者说采样的函数)变得太快了,以至于采样的速度跟不上它变化的速度。

  • 锯齿(aliasing)

  • 摩尔纹:将图像的奇数行和奇数列就可以产生

  • 车轮效应:生活中高速行驶的汽车,在视频中看上去的效果可能是倒着转的。人眼在时间中的采样出了问题。

防走样的做法

image-20240508214247976

在采样之前做一个模糊(滤波),可以进行反走样。(而先走样在模糊的话,无法达到效果。)

如图在三角形采样前,做一遍模糊,然后再对这些像素点进行采样。

傅里叶

傅里叶级数展开

image-20240508214953961

任何一个周期函数都可以写成一系列正弦和余弦函数他们的线性组合以及他们的常数项,这就叫做傅里叶级数展开。

傅里叶变换

傅里叶变换和傅里叶级数展开并不是一个东西。

image-20240508215229531

给定任意一个函数f(x),经过一系列操作变成另外一个函数F(x),这个变换过程叫做傅里叶变换。

F(x)通过逆变换也可以变回f(x),叫做逆傅里叶变换。

走样探究

频率

image-20240508214705389

定义f为频率。

用f即可定义波变化有多快,从而也能定义周期T。

傅里叶变换的应用

傅里叶变换可以把一个函数(图形学中将一幅图像看作一个二维函数),从时域(空间和时间都称为时域)变为频域。

image-20240508220729848

我们对左边的图进行一次傅里叶变换,从时域变为频域,就会得到右边的图。

将右边图的中心定义为低频的区域,那么从中心到四周频率会越来越高。不同频率表示的信息多少,我们通过亮度来表示。

右图中,图像的中心是最亮的,而前面我们定义了中心是低频,这就意味着左边的图像中,信息都集中在低频区域。

右图中有一个十字的线。这是做傅里叶变换时会出现的现象。因为在分析一个信号时,会认为它是周期性重复的信号,但是大多数图都是不周期性重复的信号。

  • 可以将左图当作是一个周期,那么这个图的周期性重复就是类似桌面平铺的样子。左图在左右上下边界后就没有画像了,分析的时候看作将这张图左右上下叠了无数个,这就是无数个周期。

  • 此时有了一个问题,大多数图的左右边界是不一样的(即图左右的边缘不一样)。当我们让这幅图和左边重复的图衔接时,衔接处的像素会产生一个剧烈的变化(可以想象成右边界是黑的,但是用来衔接的旁边的左边界是白的,黑到白直接是一个突变),就会产生一个极高的高频。

傅里叶变换能够让我们看到,左边的图像在不同频率长什么样子(即信号在不同频率长什么样,叫做频谱)。

频率中的采样

傅里叶变换就是把函数变成不同的频率的段,然后把不同频率的段显示出来。

image-20240508215406543

  • 更高的频率需要更快的采样

  • 低频信号:充分采样以进行合理的重构

  • 高频信号采样不足:重建错误地似乎是从一个低频信号

如图,绿色曲线表示频率,黑色点表示采样点,蓝色虚线是通过采样点还原的频率。

,如果我们用同样的采样方法来对不同的波进行采样,采样的效果是不一样的。因此,我们需要让函数变化的频率和采样的频率匹配,才能让所有的采样都达到一个想要的效果。

频率中的走样

image-20240508220013124

  • 高频信号采样不足:采样错误地表现为来自低频信号

  • 在给定的采样率下难以区分的两个频率称为“aliases”(走样)

如图,首先让蓝色的函数根据图中白色点的方式进行采样。根据采样的点还原,可以得到黑色的这个函数。

接着假设黑色线是待采样的函数,如果也用白色点的方式进行采样。还原后得到的依旧是这个黑色的这个函数。

同样的一个采样方法,采用两种不同的频率的函数得到的结果,我们无法区分它们,这就叫做走样

滤波

滤波(filtering):把某个特定频段(就是一个规定的范围内的频率)给删除,这个对应的信号是如何变化的,叫做滤波(即去掉一系列频率)

高通滤波

将低频信号全部抹去,只剩下高频的信号的滤波叫高通滤波。

image-20240508223154054

在傅里叶变换的基础上,将低频信号全部抹去,只剩下高频的信号,就是右图。将剩余的高频信号逆处理回去,就是左图。

可以发现,高频的东西其实就是表示图像内容的边界(比如图中的袖口等)。

边界可以理解成是突变比较大的“分水岭”,这个边界左右(或上下)发生了非常剧烈的变化,而图像信息变化快的地方频率就高。

进一步可以认为,高频的地方图片信息变化非常大。

低通滤波

将所有高频信息抹掉,只剩下低频信息的滤波叫低通滤波。

image-20240508224502926

在傅里叶变换的基础上,将所有高频信息抹掉,只剩下低频信息,可以发现所有的“边界”都去掉了,整个图像是一个模糊的样子。

特定频段滤波

image-20240508224613677

将高频和低频的信息都去掉,留下某一段特定频率的信息,此时提取到的是一些不那么明显的“边界”特征。

image-20240508224809092

同样,如果左侧留下的光圈更加外边(更接近高频),那么这个“边界”特征会越明显。

卷积、平均

平均(averag)操作:可以想象成低通滤波,造成模糊的效果。

卷积操作

image-20240508225213647

image-20240508225457436

假设滤波器(filter)是一个窗口,窗口中有若干个各自。将信号与滤波窗口进行点乘操作(第三行的式子),点乘的结果写回窗口的中心值。

其实就是将某个原始的信号取其周围的信号进行加权求和,得到一个新的信号。任意一个数都是周围若干数的平均。

将某一种滤波作用在一个信号上,进行卷积操作(点乘加权平均),得到一个新的信号。这是图形学简化后的定义,不是数学上的定义

(这就是卷积能够提取特征的原因)

卷积定理

image-20240508232754543

对一个图像进行卷积操作,得到新的图像。对应的就是将原本图像对应的信号,乘以一个信号,就会得到一个新的信号,被乘数的那个信号就是卷积,新的信号就是新的图像。

时域的卷积 = 频域的乘积,反之亦然

卷积盒

image-20240510145425636

卷积盒可以看作是一个滤波器,卷积操作就是一个低通滤波器,让图像更加模糊。

写成图中数字加盒子的形式,相当于是一个归一化的操作。

image-20240510150252559

卷积盒的范围变大,对应的频率是变小的,结果更加模糊。

原因个人是这么理解的:

  • 假设在这个box变得超级大,大到以任意一个像素为中心,都能覆盖得了所有得像素。

  • 看前面的卷积操作的计算方式,其实就是以每一个像素为中心,box覆盖到的像素一起取平均。每个像素取平均的值,在box超级大时,就可以认为是同一批数据。

  • 那么卷积操作后,无限大的box导致每个像素长得一摸一样。这就是模糊到了一个程度,整张图看不出任何信息。相当于边界全部没有了。卷积盒box越大,边界越少,图像信息越来越少,图像越来越模糊。

  • 在频域中,如上图box变大后,频域图中间的亮点们变小变淡了。前面我们将亮度高的当作高频,这里就相当于高频越来越少。卷积盒box越大,高频信息越来越少。

频域中的采样

image-20240510153725359

左图是在时域中的三个函数。我们用函数c(冲激函数)乘以函数a,就可以得到函数a上离散的点(函数e)。函数e就是采样结果。

右图是各个函数对应在频域上的函数。时域上函数相乘变成一系列的点,对于到频域上,就是把原始的函数的频谱复制粘贴。(时域的乘积等于频域上的卷积。)

在频域中,采样就是在重复频率或者频率上的内容。

频域中的走样

image-20240510154055787

采样在频域中就是将频谱复制粘贴。

正常情况下,依次的复制粘贴如图中第一个函数的样子。但是如果采样的过快,一段没有复制粘贴完,另一段就又要复制粘贴上来,就会导致频谱之间的间隔越小,信号混在了一起,就是走样。

这里时域和频率的解释是相反的关系,采样的越稀疏(采样的频率越小),对应频谱上就越密集(时域上的信号就会叠在一起),这种情况下就是走样。

防止走样的措施

image-20240510154629224

  • 如何减少混叠误差(走样)?

  • 方案1:提高采样率本质上增加了傅立叶域中样本之间的距离

  • 比如:更高分辨率的显示器、传感器、帧缓冲器..

  • 但是:成本高&可能需要非常高的分辨率

  • 选项2:抗锯齿(防走样)

  • 在重复之前使傅里叶的内容“变窄”

  • 比如:在采样前滤除高频

反走样探究

原理

image-20240510154956339

先做一个模糊,去掉高频,让频谱覆盖的面小一些,这样就能防止频谱重叠。

模糊方法

严格意义上来说,MSAA这些抗锯齿技术都是对反走样的近似,不能完全解决放走样。

MSAA

image-20240510160327658

  • 通过对一个像素内的多个位置进行采样并取其值的平均值,来近似模拟1像素箱形滤波器的效果。

例子展示

image-20240510160909144

假设有一个三角形覆盖了一些像素。

  1. image-20240510160945511

    在每个像素中取NxN样本。

    假如像素内部多一些采样点,比如用2*2的点

  2. image-20240510161049424

    在像素内部取采样点后,查看采样点在三角形内外的情况。

    为方便显示,我们可以让像素内部的采样点在三角形内的越多,颜色越深。

  3. image-20240510161422802

    最终的结果,我们将得到每个实际像素在三角形中的覆盖率。

MSAA是对反走样的第一步模糊进行操作,而下一步的采样操作是隐含在这个过程中的。

注意

MSAA不是通过提高分辨率直接解决走样问题。(增加采样点是近似合理的覆盖率,并没有真的提高分辨率)

在实际运用时,对像素处理的方法并不是像例子取像素中心然后规则的矩形的增加采样点。实际中人们会用其他更加有效的图案,并且有些点会被临近的像素复用。

FXAA

FXAA (Fast Approximate AA)快速近似抗锯齿

图像的后期处理,先得出一张图。通过图像匹配的方式找到图中的锯齿,然后把他换成模糊。(但是注意前面有说过,不能先得到一张有锯齿的图再做模糊)

这个技术中没有涉及到采样,是在图像层面上做的抗锯齿。

TAA

TAA (Temporal AA)

假如场景是静止的,相邻两帧显示的一样,但是相邻两帧一个像素内部不同位置上的点来感知是否在三角形内。

在时间范围内得到的静态的场景图的边界会各不相同。TAA复用上一帧的感知结果,相当于将MSAA的样本分布在时间上。

如果是动态的,就是光线追踪(TAA和光线追踪用的是同一个思想)

超分辨率

一张图将其大小变大(比如512*512变成1024*1024),单纯的拉大会看上去图全都是锯齿。如果不想看到锯齿,就需要一个超分辨率的过程。

本质上是高分辨率的图采样率不够。

DLSS

通过深度学习的方法实现超分辨率的过程(就是猜)

总结

前提:图形学中将一幅图像看成一个二维函数。

频率、频谱

频率用来表示波变化的快慢。

一个函数(图像)经过傅里叶变换后,能够得到其频谱。

  • 函数f通过变换能够变成另一个函数F,f通过逆变换也能够变回F。变换过程就叫做傅里叶变换或逆傅里叶变换。

  • 频谱是图像(信号)在不同频率的样子,是频率的分布曲线。

  • 在频谱中,每间隔一段就取一个数据点,这个取点的过程叫做采样

  • 同样的一个采样方法,采用两种不同的频率的函数得到的结果,我们无法区分它们,这叫做走样

滤波

将某一范围内的特定频率去掉的过程称为滤波

个人理解滤波其实就是一个函数,将图像(信号、函数)与这个滤波函数叠加,就能实现实现滤波的效果。

高通滤波就是能够去掉低频频段的函数(信号)。图像增加高频滤波后,图像边界将变得明显。

同理,低通滤波就是去掉高频频段的函数(信号)。

除此之外还有一些特定频段的滤波。图像增加低频滤波后,图像将变得模糊。

卷积

卷积在图形学中就是加权求平均。

卷积操作就是一个低通滤波器

  • 将某一种滤波作用在一个信号上,进行卷积操作(点乘加权平均),得到一个新的信号。

  • 这是图形学简化后的定义,不是数学上的定义

卷积定理主要是证明了时域的卷积 = 频域的乘积,反之亦然。

  • 从例子上看,就是一个图像进行卷积操作后得到新的图像,在频域中就是一个频谱乘以卷积操作的频域得到一个新的频谱。

卷积盒可以看作是一个滤波器

  • 卷积盒box越大,边界越少,图像信息越来越少,图像越来越模糊。

频域中的定义

采样在频域中就是将频谱复制粘贴。

  • 时域上函数相乘变成一系列的点。

  • 对应到频域上,就是把原始的函数的频谱复制粘贴。

复制粘贴的频谱之间的间隔越小,频谱重叠在了一起(信号混在了一起)就是走样。

采样的越稀疏,采样的频率越小,对应频谱上就越密集(时域上的信号就会叠在一起)。

反走样

在采样之前做一个模糊(滤波)可以达到反走样的效果。

  • 需要模糊的话需要做低通滤波。去掉高频,在频域的体现就是频谱覆盖的面会小,防止频谱重叠。

MSAA、FXAA和TAA都是做模糊一些技术。

  • MSAA是增加像素的采样点,近似合理的覆盖率,从而达到模糊的效果。

  • FXAA则是先采样,形成图像后,再利用图像匹配找到锯齿的部分,模糊处理后替换锯齿部分(但是会违背采样之前做一个模糊的理论,这样达不到很好的效果,优点是很快)

  • TAA则是会复用上一帧的感知结果,相当于将MSAA的样本分布在时间上。

后记

这节课的知识真的多且难,分了两天看才看完。。。

感觉开始慢慢接触专业的知识了,闫老师的课确实很厉害,讲的真的很好。

相关文章:

GAME101-Lecture06学习

前言 上节课主要讲的是三角形的光栅化。重要的思想是要利用像素的中心对三角形可见性的函数进行采样。 这节课主要就是反走样。 课程链接:Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)_哔哩哔哩_bilibili 反走样引入 ​ 通过采样,得到…...

202203青少年软件编程(Python)等级考试试卷(二级)

第 1 题 【单选题】 关于Python中的列表,下列描述错误的是?( ) A :列表是Python中内置可变序列,是若干元素的有序集合; B :列表中的每一个数据称为“元素”; C :在Python中,一个列表中的数据类型可以各不相同; D :可以使用s[1]来获取列表s的第一个元素。 正确答案…...

带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败了

问题: 我已经成功地使用以下 sed 命令在Linux中搜索/替换文本: sed -i s/old_string/new_string/g /path/to/file然而,当我在Mac OS X上尝试时,我得到: command i expects \ followed by text我以为我的Mac运行的是…...

[Linux_IMX6ULL驱动开发]-GPIO子系统和Pinctrl子系统

目录 Pinctrl子系统的概念 GPIO子系统的概念 定义自己的GPIO节点 GPIO子系统的函数 引脚号的确定 基于GPIO子系统的驱动程序 驱动程序 设备树修改 之前我们进行驱动开发的时候,对于硬件的操作是依赖于ioremap对寄存器的物理地址进行映射,以此来达…...

Elasticsearch:理解人工智能相似性搜索

理解相似性搜索(也称为语义搜索)的指南,这是人工智能最新阶段的关键发现之一。 最新阶段人工智能的关键发现之一是根据相似性搜索和查找文档的能力。相似性搜索是一种比较信息的方法,其基于含义而非关键字。 相似性搜索也被称为语…...

Mac YOLO V9推理测试(基于ultralytics)

环境: Mac M1 (MacOS Sonoma 14.3.1) Python 3.11PyTorch 2.1.2 一、准备工作 使用YOLO一般都会接触ultralytics这个框架,今天来试试用该框架进行YOLO V9模型的推理。 YOLOv9目前提供了四种模型下载:yolov9-c.pt、yolov9-e.pt、gelan-c.p…...

OuterClass.this cannot be referenced from a static context

目标,定义了一个内部类,然后把这个内部类设置为单例 一 使用非静态内部类 public class OuterClass {public class InnerClass {} } 直接定义单例: .OuterClass.this cannot be referenced from a static context public class OuterClass …...

CAP与BASE分布式理论

一、分布式理论 1.CAP理论 CAP理论是说对于分布式数据存储,最多只能同时满足一致性(C,Consistency)、可用性(A, Availability)、分区容忍性(P,Partition Tolerance&…...

JavaScript性能优化策略

JavaScript性能优化策略可以分为以下几个方面: 减少内存使用:避免创建不必要的对象和数组,使用对象池或数组缓存来重复利用已有的对象和数组。此外,及时释放不再需要的对象和数组,避免内存泄漏。 减少重绘和回流&…...

curl访问流式非流式大模型openai api接口

参考:https://platform.openai.com/docs/api-reference/making-requests 命令行访问: 直接是vllm的openai api接口 curl http://192.168.***:10860/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: EMPTY" -d {"mod…...

Go 使用 MongoDB

MongoDB 安装(Docker)安装 MongoDB Go 驱动使用 Go Driver 连接到 MongoDB在 Go 里面使用 BSON 对象CRUD 操作 插入文档更新文档查询文档删除文档 下一步 MongoDB 安装(Docker) 先装个 mongo,为了省事就用 docker 了。 docker 的 daemon.json 加一个国内的源地址…...

什么是g++-arm-linux-gnueabihf

2024年5月3日,周五晚上 g-arm-linux-gnueabihf 是针对 ARM 架构(ARMv7 和 ARMv8)的 Linux 系统开发的 GNU C 编译器套件,可以在 x86 或 x86_64 架构的主机上使用,用于交叉编译 ARM Linux 应用程序和库。 与 gcc-arm-l…...

Unity延时触发的几种常规方法

目录 1、使用协程Coroutine2、使用Invoke、InvokeRepeating函数3、使用Time.time4、使用Time.deltaTime5、使用DOTween。6、使用Vision Timer。 1、使用协程Coroutine public class Test : MonoBehaviour {// Start is called before the first frame updatevoid Start(){ …...

CSS文字描边,文字间隔,div自定义形状切割

clip-path: polygon( 0 0, 68% 0, 100% 32%, 100% 100%, 0 100% );//这里切割出来是少一角的正方形 letter-spacing: 1vw; //文字间隔 -webkit-text-stroke: 1px #fff; //文字描边1px uniapp微信小程序顶部导航栏设置透明,下拉改变透明度 onP…...

XWiki 服务没有正确部署在tomcat中,如何尝试手动重新部署?

1. 停止 Tomcat 服务 首先,您需要停止正在运行的 Tomcat 服务器,以确保在操作文件时不会发生冲突或数据损坏: sudo systemctl stop tomcat2. 清空 webapps 下的 xwiki 目录和 work 目录中相关的缓存 删除 webapps 下的 xwiki 目录和 work …...

【退役之重学Java】关于 Redis

一、Redis 都有哪些数据类型 String 最基本的类型,普通的set和get,做简单的kv缓存hash 这是一个类似map 的一种结构,这个一般可以将结构化的数据,比如一个对象(前提是这个对象没有嵌套其他的对象)给缓存在…...

DateKit

目录 1、 DateKit 1.1、 DaysBetween 1.2、 compareDate 1.3、 dateFormat 1.4、 birthdayFormat 1.5、 getYesterday...

百度智能云数据仓库 Palo 实战课程

通过本课程,您将学习如何使用 Palo 构建高性能、低延迟的分布式数仓服务,掌握数据建模、数据导入、查询优化和系统调优等技能,掌握如何管理和运维 Palo 集群,提高数据处理和分析的效率。同时,我们将进一步向您介绍 Pal…...

服务端JavaScript(Node.js)与去IO编程:Node.js的事件驱动和非阻塞IO模型,它是如何使JavaScript走向后端的

在Node.js中,JavaScript代码运行在V8引擎上。由于JavaScript是单线程语言,一次只能处理一个事件。为了解决这个问题,Node.js引入了事件驱动模型。每个进行IO操作的函数都是异步的,当这个函数被调用的时候,它不会立即执…...

一键局域网共享工具

一键局域网共享工具:实现文件快速共享的新选择 在数字化时代,文件共享已成为我们日常工作和生活中的重要需求。无论是在家庭还是在办公环境中,我们经常需要在不同的设备之间传输文件。为了满足这一需求,一键局域网共享工具应运而…...

python实现把doc文件批量转化为docx

python实现把doc文件批量转化为docx import os from win32com import client as wcdef doSaveAas(doc_path,docx_path):#该函数参考https://blog.csdn.net/m0_38074612/article/details/128985384word wc.Dispatch(Word.Application)doc word.Documents.Open(doc_path) # 目…...

WEB基础---反射

什么是反射 相对官方解释 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力; 在运行时期,动态地去获取类中的信息(类的信息,方法信息,构造器信息,字段等信息); 在运行的时候获取到的类信息 封装一个字节码对象…...

impdp恢复表后发现比原表多了100多行

因客户删除数据,恢复表时发现恢复表后发现比原表多了100多行,啥原因暂不清楚,继续学习 [oraclehydb ~]$ more expdp_orcl_20240406_2100.log |grep "USR_HY"."T_COPIES". . exported "USR_HY"."T_COPIES…...

Jupyter配置远程访问的密码

安装 下载Anaconda的.sh文件后,上传到服务器,然后进行安装: chmod x anaconda.sh ./anaconda.sh创建虚拟环境 可以指定Python版本创建虚拟环境: conda create --name langchain python3.11.7 conda activate langchain conda …...

Windows下通过MySQL Installer安装MySQL服务

在Windows下,使用MySQL Installer来安装MySQL服务是一个相对简单的过程。以下是一步一步的详细指南: 下载MySQL Installer: 访问MySQL官方网站(https://www.mysql.com/downloads/),在下载页面选择合适的MyS…...

C语言 [力扣]详解环形链表和环形链表II

各位友友们,好久不见呀!又到了我们相遇的时候,每次相遇都是一种缘分。但我更加希望我的文章可以帮助到大家。下面就来具体看看今天所要讲的题目。 文章目录 1.环形链表2.环形链表II 1.环形链表 题目描述:https://leetcode.cn/problems/link…...

Threejs 学习笔记 | 灯光与阴影

文章目录 Threejs 学习笔记 | 灯光与阴影如何让灯光照射在物体上有阴影LightShadow - 阴影类的基类平行光的shadow计算投影属性 - DirectionalLightShadow类平行光的投射相机 聚光灯的shadow计算投影属性- SpotLightShadow类聚光灯的投射相机 平行光 DirectionalLight聚光灯 Sp…...

SSH:安全远程访问的基石

SSH:安全远程访问的基石 一、引言 在当今这个数字化、网络化的时代,远程访问和管理计算机资源已成为日常工作的重要组成部分。然而,如何在不安全的网络环境中确保数据传输的机密性、完整性和可靠性,成为了一个亟待解决的问题。S…...

杰发科技AC7801——ADC之Bandgap和内部温度计算

0. 参考 电流模架构Bandgap设计与仿真 bandgap的理解(内部带隙电压基准) ​ ​ 虽然看不懂这些公式,但是比较重要的一句应该是这个:因为传统带隙基准的输出值为1.2V ​ 1. 使用 参考示例代码。 40002000是falsh控制器寄…...

了解 macOS 中的系统完整性保护 (SIP):开启与关闭

在 macOS 系统中,有一个名为系统完整性保护 (System Integrity Protection,SIP) 的重要功能。SIP 旨在保护系统文件和进程免受未经授权的访问和修改,从而提高系统的安全性和稳定性。然而,在某些情况下,用户可能需要临时…...