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

这篇具有很好参考价值的文章主要介绍了图形学中的抗锯齿讨论以及在unity中的应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1 什么是锯齿

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

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

2 锯齿原因

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

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

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

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

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

例如下图,根据像素中心是否在三角形内的原则,采样后的三角形,如下,锯齿非常明显。
unity 抗锯齿,图像处理,Unity,unity,抗锯齿

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个:
unity 抗锯齿,图像处理,Unity,unity,抗锯齿

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

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

注意,4个子采样点,都是独立运算的,那就可能发生4个子采样点,得到的颜色值不一样。
unity 抗锯齿,图像处理,Unity,unity,抗锯齿
最终像素的颜色,也是根据多种颜色的平均值哦。

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

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

所以一般这种抗锯齿,不会真实采用。

3.2 MSAA简介

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

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

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

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

上面的说法比较粗糙,不考虑细节,如深度信息的判断,实际GPU如何操作,这里不做展开啦!

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

3.3 FXAA简介

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

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

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

简单展开一下,更多细节请参考附录贴的文章。
unity 抗锯齿,图像处理,Unity,unity,抗锯齿
(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设置抗锯齿。
unity 抗锯齿,图像处理,Unity,unity,抗锯齿
注意,camera相当于是最终输出画面,所以这个是设置,只针对最终画面做抗锯齿处理。所以没有MSAA的选项哦!!!

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

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

参考

图形学基础 - 着色 - 空间抗锯齿技术
图形学中的抗锯齿方法简谈文章来源地址https://www.toymoban.com/news/detail-555016.html

到了这里,关于图形学中的抗锯齿讨论以及在unity中的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 有关TAA抗锯齿的简单介绍和在UE4中解决一些简单的抗锯齿问题

    在计算机图形学中,锯齿是由于图像中的几何形状或颜色值变化在像素层面上表现不充分,导致图像边缘或细节处出现明显的阶梯状或锯齿状现象。这是由于计算机图形学是基于离散化的表示方法,将连续的几何形状或颜色值转换为离散的像素值,导致图像的细节表现不充分

    2024年02月07日
    浏览(34)
  • 线性代数在生物信息学中的应用

    生物信息学是一门研究生物学信息的科学,它涉及到生物数据的收集、存储、处理、分析和挖掘。生物信息学的应用范围广泛,包括基因组学、蛋白质结构和功能、生物网络、生物信息数据库等方面。线性代数是一门数学分支,它研究的是向量和矩阵之间的关系和运算。线性

    2024年04月28日
    浏览(41)
  • FPGA加速技术在生物信息学中的应用

    作者:禅与计算机程序设计艺术 随着近年来生物信息学领域的发展,人们越来越关注复杂系统的模式构建、网络分析、数据挖掘等问题。由于生物信息学领域涉及的数据规模、计算量、分布式、实时性要求高,传统CPU计算资源难以满足需求,同时还有对成本的限制。因此,采

    2024年02月14日
    浏览(37)
  • 齐次矩阵的理解深入和在图形学、Unity中的应用

    在探讨图形学和Unity中的3D编程时,我们经常会遇到一个非常核心的数学工具—— 齐次矩阵 。这篇文章将一步步深入地探讨齐次矩阵的基本概念、它在图形学中的应用,以及如何在Unity中利用这一概念来创建令人震撼的3D场景。 首先,我们来聊聊什么是齐次坐标。在二维空间

    2024年01月22日
    浏览(42)
  • Python在生物信息学中的应用:让你的程序运行得更快

    程序运行太慢,想要提速,但不使用复杂的技术如 C 扩展或 JIT 编译器。 解决方案 程序优化的 第一准则是“不要优化” , 第二准则是“不要优化那些不重要的部分” 。基于这两个原则,如果你的程序运行得很慢,你得先找出影响性能的问题所在。 多数时候我们发现程序把

    2024年02月20日
    浏览(48)
  • 图形学中那些你需要知道的变换概念

    在前面的OpenGL ES 教程中,随着教程的进展,我们介绍并使用过很多变换矩阵,但没有系统总结过图形学涉及到的种种变换,因此这篇文章再次回顾“变换”这个主题。 通俗来讲,所谓的变换就像编程中调用一个函数,向这个函数传入一个点的坐标 ( x , y ) (x,y) ( x , y ) ,函数

    2024年02月14日
    浏览(40)
  • Hugging News #0414: Attention 在多模态情景中的应用、Unity API 以及 Gradio 主题构建器

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「Hugging News」,本期 Hugging News 有哪些有趣的消息,快来看看吧! 注意力机制改变了许多学科

    2023年04月16日
    浏览(32)
  • SRAM型FPGA空间应用的抗单粒子翻转

            目前,SRAM 型 FPGA 在星载电子产品中应用较多的是Xilinx公司的FPGA。 图1所示为Xilinx系列FPGA器件的内部结构。从图中可以看出,FPGA内部由3 部分组成,分别为: 1 )用于实现用户逻辑的可编程阵列(Configurable Logic Block,CLB); 2 )用于存储用户数据的左右两列存储器(

    2024年04月12日
    浏览(28)
  • 供应链安全和第三方风险管理:讨论如何应对供应链中的安全风险,以及评估和管理第三方合作伙伴可能带来的威胁

      在当今数字化时代,供应链的安全性越来越受到重视。企业的成功不仅仅依赖于产品和服务的质量,还取决于供应链中的安全性。然而,随着供应链越来越复杂,第三方合作伙伴的参与也带来了一系列安全风险。本文将探讨供应链安全和第三方风险管理的关键问题,并通过

    2024年02月12日
    浏览(42)
  • 奇异值分解在图形压缩中的应用

    在研究奇异值分解的工程应用之前,我们得明白什么是奇异值?什么是奇异向量? 奇异值与奇异向量 概念:奇异值描述了矩阵在一组特定向量上的行为,奇异向量描述了其最大的作用方向。 矩阵A的分解涉及一个 m × n m times n m × n 的矩阵 Σ Sigma Σ ,其中 Σ Sigma Σ = [ D 0 0

    2024年02月02日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包