抗锯齿算法和Z-Buffer算法

  • 1 锯齿 (走样,Aliasing)
    • 1.1 超采样反走样(Super Sampling AA)
    • 1.2 多采样反走样(Multi-Sampling AA)
  • 2 Z-Buffer算法
  • Reference

(本篇文章同步发表于知乎专栏:https://zhuanlan.zhihu.com/p/144331249 欢迎三连关注)

在通过上一节的讲解之后,我们已经能够成功的把带有几何意义的顶点信息从虚拟3维世界之中转换到用像素表示的2维屏幕之中,那这样真的已经足够了吗?本节我们看看还有哪些问题需要进一步解决,即抗锯齿和遮挡关系。

1 锯齿 (走样,Aliasing)

利用上一节的三角形光栅化算法之后,我们可以把该三角形表示成一个如下图所示的像素点集合

对!发现问题了没有?
三角形变的“歪歪扭扭”的,哪能说它是一个标准的三角形呢。这种问题本质是因为我们在采样的时候的频率过低无法跟上图像的频率,导致最后结果的失真,当然这是从信号处理的角度去看这个问题,在这里不会做过多的展开。
从简单的角度去解释这种问题出现的原因就是,我们用有限离散的像素点去逼近连续的三角形,那么自然会出现这种锯齿走样的现象,因为这种近似是不准确的。接下来会介绍两种解决走样的方法,具体来说第二种可以当成第一种的改良

1.1 超采样反走样(Super Sampling AA)

SSAA的想法其实是非常直观的,如果有限离散像素点逼近结果不好,那么我们用更多的采样点去逼近不就会得到更好的结果了吗?所以根据这个思想我们可以把原来的每个像素点进行细分,比如下例中,我们讲每个像素点细分成了4个采样点:


我们根据每个采样点来进行shading(该概念还未提及,可以理解为计算每个像素点的颜色的过程,当然这里是一个纯红色的三角形,如果该点在三角形内,它的颜色值可以直接得到为(1,0,0)),这样得到了每个采样点的颜色之后,我们讲每个像素点内部所细分的采样点的颜色值全部加起来再求均值,作为该像素点的抗走样之后的颜色值!结果如下:

当然读者可能还是觉得,这还不是有锯齿,咋就抗锯齿了呢?

仔细观察可以发现因为将4个采样点的颜色求均值的之后,靠近三角形边缘的像素点有的变淡了,从宏观角度来看的话,这个锯齿就会变得不那么明显了。我们可以看看这样一个具体例子。

怎么样,效果还是相当明显吧!

(tips:SSAA并不局限于分成4个,也可以分更多的,可以自己决定,如果喜欢玩游戏的读者一定知道游戏里面其实就有一个抗锯齿的选项,其中的 ×2,×3,×4\times2,\times3,\times4×2,×3,×4,分别代表的就是4个,9个,16个采样点,显然采样点越多抗锯齿效果越好,但计算负担也会随之增加)。

1.2 多采样反走样(Multi-Sampling AA)

MSAA其实是对SSAA的一个改进,显然SSAA的计算量是非常大的,每个像素点分成4个采样点,我们就要进行4次的shading来计算颜色,额外多了4倍的计算量,如何降低它呢?

MSAA的做法也很容易理解,我们依然同样会分采样点,但是只会去计算究竟有几个采样点会被三角形cover,计算颜色的时候只会利用像素中心坐标计算一次颜色(即所有的信息都会被插值到像素中心然后取计算颜色),如下图:


只有两个采样点被我们的三角形cover了,将该像素中心计算出来的颜色值乘以50%即可,这样大大减少了计算量,并且得到反走样效果也是很不错的。

2 Z-Buffer算法

解决了走样问题之后,还有一个仍需解决的问题,我们如何判断物体先后关系?更具体的说每个像素点所对应的可能不止一个三角形面上的点,我们该选择哪个三角形面上的点来显示呢?答案显然易见,离摄像头最近的像素点显示。这里便要利用到我们之前做model−view−projectionmodel-view-projectionmodel−view−projection变换之后所得到的深度值 zzz 了,这里定义z越大离摄像机越远!

以下我们介绍Z-Buffer算法,主要有2步。

1. Z-Buffer算法需要为每个像素点维持一个深度数组记为zbuffer,其每个位置初始值置为无穷大(即离摄像机无穷远)。
2. 随后我们遍历每个三角形面上的每一个像素点[x,y],如果该像素点的深度值z,小于zbuffer[x,y]中的值,则更新zbuffer[x,y]值为该点深度值z,并同时更新该像素点[x,y]的颜色为该三角形面上的该点的颜色。

没错,根据上述两个步骤,我们就已经能够成功得到正确遮挡顺序的结果了,伪代码如下:

一个计算实例如下:

如果一下子不能反应过来,建议利用该实例推一边应该就能明白了。

好了,整套笔记到目前位置,我们已经解决大部分光栅化的问题了,接下来就是如何真正的计算每个三角形面上点的颜色了(shading)!该部分内容会在之后的笔记中给出。

最后如果本文对你有帮助求点赞求收藏求一个大大的关注

计算机图形学四:抗锯齿SSAA及MSAA算法和遮挡剔除Z-Buffer算法相关推荐

  1. 图形学基础|抗锯齿(Anti-Aliasing)

    图形学基础|抗锯齿(Anti-Aliasing) 文章目录 图形学基础|抗锯齿(Anti-Aliasing) 一.前言 二.锯齿 2.1 采样理论 2.2 分类 三.抗锯齿概述 3.1 SSAA(Su ...

  2. 【计算机图形学】小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解

    小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解 引言 如何画圆 基本思想 中点画圆法 中点画圆基本思路 中点画圆改进 Bresenham画圆算法 Bre ...

  3. Anti-Aliasing抗锯齿 SSAA MSAA FXAA三维游戏抗锯齿技术浅谈

    今天组里同学询问关于抗锯齿的问题,我尽量简化成人话方便理解. 关于抗锯齿的技术有很多种,有的基于硬件,有的则完全依赖算法计算.总的来说,锯齿是软硬件沟通差异导致的问题,是开发者最常见的问题之一. 实际 ...

  4. 【图形学】抗锯齿方法总结

    文章目录 Super Sampling MSAA(MultiSampling AA) SSAA(SuperSampling AA) Post Processing AA TAA(Temporal AA ...

  5. 计算机图形学四:着色-Shading

    文章目录 什么是shading? Blinn-phong 反射模型(reflection model) 漫反射(Diffuse reflection) 镜面/高光反射(Specular highlig ...

  6. Games101计算机图形学入门基础之二:光栅化

    Games101计算机图形学入门基础之二:光栅化 引言 三角形的离散化 采样 走样 走样带来的瑕疵 反走样 先模糊再采样 傅里叶变换 低通滤波 卷积 多重采样抗锯齿(超采样) 深度缓存 可见性与遮挡( ...

  7. 【技术美术图形部分】简述主流及新的抗锯齿技术

    电脑的世界里没有曲线,都是三角面组成一个个模型的,因此一定会出现走样(锯齿)的情况,只是严重与否的问题,而AA也是实时渲染最难解决的问题之一. Sampling&Artifacts Lectu ...

  8. 计算机图形学【GAMES-101】2、光栅化(反走样、傅里叶变换、卷积)

    快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...

  9. 关于三角形重心坐标插值/锯齿/抗锯齿/延迟渲染中的抗锯齿问题

    我们都知道,在渲染流水线中,顶点着色器对输入的顶点数据进行处理(如顶点的坐标变换和光照计算)以后,GPU会进行进行齐次除法并将顶点从三维空间转换到二维的屏幕坐标,接着将这些所需要的着色数据发送到光栅化 ...

最新文章

  1. Java开发经典面试题分享,建议收藏
  2. C++ reference很全面
  3. Android之进程与线程的讲解
  4. Windows10安装TeXlive和TeXstudio
  5. 10 个非常有用的 SVG 动画的 JavaScript 库
  6. python代码-让你的Python代码实现类型提示功能
  7. 学习pytorch: 语义分割工具
  8. 吾是否有“受迫害妄想症”之反省
  9. 传入oracle中的日期类型,Oracle中的日期类型及相关函数
  10. python特性 property_Python中property属性实例解析
  11. html5图片高斯模糊,CSS实现图片高斯模糊但边界清楚的效果
  12. 搞机吧 | 利用magisk安装Xposed框架
  13. Java中String使用及分析(UTF-8简单编码/解码器实现)
  14. x3650服务器引导盘制作,IBM X System ServerGuide 8.41 服务器 系统安装 引导盘图文教程...
  15. 构建一个代号为1的聊天应用程序4
  16. Kotlin只是一个“网红,【面试必备】
  17. 与编程密切相关的数学——离散数学——代数系统篇
  18. 真心有用!神器 Jupyter 的可视化 Debug!
  19. 一个软件开发者的BPM之路
  20. 2个25Ge网口做bond(mode4)后,iperf2压测不到50Gb

热门文章

  1. 哈希算法--暴雪的mpq技术
  2. IT人需要了解的认证大全(持续补充)
  3. OPenGL 内部摄像机(Inside out:Camera)
  4. linux LAMP的作用和现状,lamp简介
  5. 从全国首日票房破百万看零售商家的线下营销
  6. 对linux系统4T硬盘分区
  7. 将sentinel.jar做成windows服务
  8. 【js课设】电子画板01
  9. TSDF算法原理及源码解析
  10. NLP_Python3——正则表达式