图形学中的抗锯齿讨论以及在unity中的应用

news2025/1/19 16:57:23

抗锯齿(Anti-Aliasing)是图形学中,很重要的一个部分。本文旨在做一些分析总结,并对平时不理解的细节,做了调研总结,但毕竟不是做GPU行家,所以有不对的地方,欢迎拍砖^^。

1 什么是锯齿

下图,是一个在unity中,不开启抗锯齿的情况下的渲染效果,可以看到,边沿区域,例如黄色块的边沿,有非常明显的锯齿效果。
锯齿指的是徐

接着, 我启用了抗锯齿功能(URP设置里,有个Anti Aliasing),渲染效果如下,边沿区域,有一些过度颜色,不会那么生硬的,要么黄,要么灰了!
在这里插入图片描述

2 锯齿原因

原因是:光栅化阶段,执行片元着色器时,采色要么采A色,要么采B色。例如上面的黄色区域,采样时,要么就黄色,要么就某种灰色了。所以边界区域,颜色变化比较剧烈,看起来像锯齿。

再回溯一下,光栅化阶段,最重要2个部分(更多请参考 GPU 渲染管线与着色器 大白话总结):
三角形设置与遍历 + 片元着色器

三角形设置与遍历,简单的说,是找出所有三角形都覆盖哪些像素,然后生成对应的片元。 具体而言,是判断像素的中心点,是否在三角形内。判断方法,请参考叉乘在图形学中的几何意义 ---- 判断一个点是否在三角形内。如果在三角形内,就生成一个片元。

当然了,肯定存在不同三角形对应同一个屏幕像素,那对应的2个片元,其深度值z不一样。z值最小的,在最上面,z值大的片元,在下面,如果上面没有透明色,那下面的片元,就不需要执行片元着色器了。

anyway,有效的片元,总归要执行片元着色器(fragment shader,又叫pixel shader),对该片元着色。着色后,对于一些边界区域,颜色变化如果很大,就会看起来有锯齿。

例如下图,根据像素中心是否在三角形内的原则,采样后的三角形,如下,锯齿非常明显。
在这里插入图片描述

3 抗锯齿的方法

抗锯齿的目标,就是让颜色剧烈变化的像素区域,有一些过度色,不那么生硬!

在图形学中,有几种主流的抗锯齿方法,常用的包括:

  1. 超级采样抗锯齿(Super-Sample Anti-Aliasing,SSAA):

    • 渲染管线阶段:光栅化阶段。
    • 简要介绍:SSAA在渲染过程中使用比实际屏幕分辨率更高的分辨率进行渲染,然后再将图像缩小到目标分辨率。这样做会导致在渲染过程中对于每个像素执行更多次的片元着色器,从而获得更平滑的图像。
    • 特点:消耗性能。
  2. 多重采样抗锯齿(Multisample Anti-Aliasing,MSAA):

    • 渲染管线阶段:光栅化阶段。
    • 简要介绍:对SSAA的优化,在每个像素位置进行多次采样,然后根据采样结果进行平均。
    • 特点:比SSAA好一些。
  3. 快速近似抗锯齿(Fast Approximate Anti-Aliasing,FXAA):

    • 渲染管线阶段:后期处理阶段。
    • 简要介绍:不管什么三角形了,只关心最终图像。通过对图像进行分析,检测锯齿和边缘走样,并应用特定的滤波器来减少锯齿效果。FXAA是一种快速而低成本的抗锯齿技术,但可能会导致细节损失和模糊。 优点:节约性能。
    • 特点:最节约性能。
  4. 子像素采样抗锯齿(Subpixel Morphological AA, SMAA):

    • 渲染管线阶段:后期处理阶段。
    • 简要介绍:都是对像素左侧和上侧的边进行边缘检测,但又考虑了局部的像素对比,提取更多几何信息,保留不该模糊的边缘。
  5. 帧间抗锯齿(Temporal AA, TAA)

    • 渲染管线阶段:后期处理阶段。
    • 简要介绍:通过加权混合相邻多帧达到抗锯齿效果,从理论上解释就是将计算量分摊(Amortized)至多帧的超采样

下文对一些抗锯齿方法做一些详细介绍。

3.1 SSAA简介

既然叫超采样,顾名思义,就是增加采样点了。
一个像素本来采1个中心点,现在采N个:
在这里插入图片描述

例如上面的最左边像素,本来像素中心不在三角形内,就没颜色。现在像素内取4个点采,就有1个子采样点,在三角形内了。

实际落地办法,先弄个虚拟的输出画面buffer,分辨率是最终输出画面的N倍,例如4个采样点,就提高2倍。然后渲染到该buffer上。然后,再同比缩小到实际输出画面上。
在这里插入图片描述
缩小后,一个实际像素的颜色,会取4个子采样点的像素的平均值。
所以,实际效果会这样:
在这里插入图片描述
在边沿区域,有了较好的过度色。例如最左下方,本来没颜色,现在color = 1/4 * yellow_color,有了一些过度了。

好了,问题是解决了,但是增加了计算量,具体而言,是增加了片元数量。

例如,没有SSAA,上面的三角形,需要12个片元,执行12次fragment shader。但如果用了SSAA,需要49个片元,意味着要执行49次fragment shader了。真实游戏中,三角形数量成千上万个,计算量增加就很恐怖了!

3.2 MSAA简介

MSAA是对SSAA的改良,减少计算量。
怎么减少呢?

前面说的,光栅化阶段,最重要2个部分:
三角形设置与遍历 + 片元着色器。

三角形设置与遍历,简单的说,是找出一个三角形都覆盖哪几个像素,然后生成对应的片元。
接着,片元着色器,对该片元配色。

MSAA的方法,第一步还是会做,即,找到三角形都覆盖哪些子采样点。但片元着色器,合并到一次计算了!4个子采样点,采到2个,那么,片元着色器,颜色取50%。

所以,MSAA基本没有增加fragement shader的计算,节约了性能。

3.3 FXAA简介

注意,这个抗锯齿就跟三角形无关了,只对最终图像做进一步处理,所以是在后处理完成的。
怎么实现呢?其实也简单:

  1. 找到边沿。
  2. 对边沿的像素色做处理。例如,将该像素点周围最近的四个像素点进行双线性插值,计算得到目标颜色。

FXAA通过在屏幕空间进行像素级别的处理,以一种相对简单和快速的方式提供了一定程度的抗锯齿效果。它的主要优点是在保持较高性能的同时提供了一定程度的图像平滑和锯齿消除。然而,由于其近似性质,FXAA可能会导致一些细节损失和模糊效果,尤其在高对比度和细节丰富的场景中。

简单展开一下,更多细节请参考附录贴的文章。
在这里插入图片描述
(a) 提取与检测点相邻的四个像素点的颜色值(亮度值),并找出其中的最大,最小值,作差得到该像素点的局部对比度值。和一个阈值做差,看是否判断为边沿像素。
(b) 确定边沿方向(垂直 or 水平) 。对当前像素为中心的九宫格内的另外八个邻近像素颜色值进行计算
水平的: |(upleft - left) - (left - downleft)| + 2 * |(up - center) - (center - down)| + |(upright - right) - (right - downright)|
垂直的: |(upright - up) - (up - upleft)| + 2 * |(right - center) - (center - left)| + |(downright - down) - (down - downleft)|
这两个量中最大的一个将给出边缘的主要方向。
(c ) 计算边沿长度。
(d) 确定坐标偏移量,读取新的颜色。

4 在unity中的应用

在unity中,可以对Camera设置抗锯齿。
在这里插入图片描述
注意,camera相当于是最终输出画面,所以这个是设置,只针对最终画面做抗锯齿处理。所以没有MSAA的选项哦!!!

还有个地方设置抗锯齿,是在URP的设置选项里:在这里插入图片描述
这个就只有一个设置,是MSAA,可以配置要几个子采样点。 注意,这里影响的是光栅化阶段哦。

注意注意,这两种地方的抗锯齿,一般设置1个就行了。如果2个都设置,可能有一个会无效,或者出现,配置了抗锯齿,最终图像反而有锯齿的现象。

参考

图形学基础 - 着色 - 空间抗锯齿技术
图形学中的抗锯齿方法简谈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 防火墙 Firewalld

firewalld概述 firewalld防火墙是Centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。 firewalld和iptables都是用来管理防火墙的工具(属于用户态)来定义防火墙的各种规…

《C++primer》5~6章总结

《CPrimer》 语句函数 语句 if else 就C而言,规定else与离它最近的尚未匹配的if匹配,从而消除程序的二义性,所以最好的处理方法就是养成习惯在if else 后面加一个花括号swirch搭配case关键字使用,case关键字和它对应的值一起被称…

PCB~地平面

地平面的特征 • 在同一块板子上,无线数字信号经常会有较高的数字逻辑,例如高增益的RF电路 • 屏蔽和接地对于接收端的设计是非常有效的 – 辐射在源端就应该被屏蔽掉 – 地平面电流应该回到源端 – 电源电流会通过最小电阻和电感路径回到源端 • 至少有…

Git的项目管理工具的使用

Git的项目管理工具的使用 为什么学习Git软件? 主流开发中,基于互联网的开发项目都会使用git进行资源管理 资源管理:人力资源 ​ 代码资源 : .java .c . js 等 ​ 文档资源 : doc.md ,pdf 等 git是最常用的scm软件(Soft…

Vivado综合属性系列之九 CLOCK_BUFFER_TYPE

目录 一、前言 二、CLOCK_BUFFER_TYPE ​ ​2.1 属性说明 ​ ​2.2 工程代码 ​ ​2.3 结果 一、前言 ​ ​在设计中,对于时钟端口驱动时钟单元时,工具会自动综合出全局时钟BUFG连接时钟源和时钟负载。当存在全局时钟BUFG不足或者因为某些…

3512. 最短距离总和

Powered by:NEFU AB-IN Link 文章目录 3512. 最短距离总和题意思路代码 3512. 最短距离总和 题意 给定一张带权无向完全图,设点的编号为 1,2,3,4,5…n(以邻接矩阵的形式给出)。 计算依次拿走第 i个点后,剩余所有点到其他点的最短…

从零开始Vue3+Element Plus后台管理系统(十二)——封装Axios,取消重复请求

在过往的项目中,大部分Axios在项目搭建时就直接二次封装好了,拿来即用。满足通用需求是没有问题的,但碰到一些特别的接口返回,弱网场景,特别的产品需求,就觉得简单的封装不够用了。 实际上Axios非常强大&a…

在Windows上安装Docker与k8s,完美亲测!

一、软件准备 1、去Docker官网下载Docker Desktop,并一键安装 2、下载k8s-for-docker-desktop包 git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git二、镜像源配置 配置docker的国内镜像,国外的网络下载可能比较慢 { …

在线考试系统设计

一.项目概述 使⽤⽬前较为流⾏的技术栈开发的⼀款界⾯设计友好、部署操作简单、代码层次结构清晰、⼆次开发上⼿便捷的在线考试平台。系统分为管理端和考⽣端,管理端集成了用户管理、⻆⾊管理、部⻔管理、菜单管理、数据字典、系统⽇志、定时任务、中间件…

软件设计师 试题三

问题一:补充用例图,他就是参与者(左边文章里的)与用例(用户的行为)之间的关系,比如用户执行某些事情 一个句号一个功能 。找参与者做的事行为 。或者就是根据参与者对面提供的信息去文中找相关…

【Linux初阶】进程替换的应用 - 简易命令行解释器的实现

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:使用代码手段实现一个简易的命令行解释器,其中功能包括:打印输出提示符、获取用户输入…

实验11 人工神经网络(2)

1. 实验目的 ①掌握梯度下降法的优化算法; ②能够使用tf.keras构建Sequential模型,完成多分类任务。 2. 实验内容 ①下载MNIST数据集,建立神经网络模型,实现对MNIST手写数字数据集的识别,调整超参数和训练参数&…

wps js宏编辑器案例3-工作簿和工作表操作

本文通过一个连锁门店每天营业额按门店名称进行拆分的案例,讲述wps js宏编辑器中工作簿、工作表和Range的相关操作,比如:工作表的复制,工作簿另存&关闭,Range.findNext使用注意实现等,案例已上传到gite…

Android学习专题】java基本概念及日常问题处理(学习记录)

java程序的入口函数 java入口函数只有一种,而且必须以main命名,且以public static进行修饰。 入口(Entry of Program):指程序运行的起点。 只有main方法可以作为程序的入口。 main方法结构:public static void main(String[] arg…

Meaning of life: The patch of life

这世界上每一个人都不是完美的,生活也是如此,一场电影、一次旅行、一把游戏、一次畅谈都是生命的"补丁", 生活总有不顺心的时候,但我们也要继续前行。 The patch of life Not long ago, My daughters frosting shoes w…

chatgpt赋能Python-python_bold

Python Bold:强劲的SEO工具 在当今数字化的时代,搜索引擎优化(SEO)基本上是每个企业成功的重要因素之一。然而SEO并不是一项易于处理的任务。面对越来越激烈的竞争,只有使用最好的工具才能真正成功。而Python Bold就是…

即时通讯(IM)开源项目OpenIM对WebAssembly支持,提升web端体验

WebAssembly 是什么? 2019 年 12 月,W3C 标准批准了第四种官方语言:WebAssembly (Wasm)。这种语言在结构、使用和功能方面与以前的语言有很大不同。 WebAssembly 是一种新的编码方式,可以在现代的Web浏览器中运行 - …

[CTF/网络安全] 攻防世界 Web_php_include 解题详析(php伪协议、data伪协议、file伪协议)

[CTF/网络安全] 攻防世界 Web_php_include 解题详析 代码审计PHP_include文件包含漏洞及伪协议PayloadPHP伪协议恶意 PHP 伪协议data伪协议恶意 data 伪协议file伪协议恶意 file 伪协议 知识点及姿势读取目录路径dirname(FILE)读取目录路径实例读取目录文件glob读取目录文件实例…

chatgpt赋能Python-python_check_module

Python Check Module简介 Python是一个非常流行的编程语言,具有易学、易用的特点,因此在算法、数据分析等领域广泛使用。Python Check Module是Python的一个模块,可以用于对Python代码进行静态分析,检测代码中的潜在问题&#xf…

chatgpt赋能Python-python_canal

Python Canal: 让你的代码流畅无阻 Python Canal 是一个简单易用的Python 并行工具,可以帮助你提高应用程序的性能。它使用了现代操作系统的资源管理能力来有效地管理你的多进程和多线程应用程序,这可以使你的应用程序更轻松地处理大规模数据和异步任务…