我是靠谱客的博主 积极西装,最近开发中收集的这篇文章主要介绍计算机图形学(光栅化)Rasterization(光栅化)抗锯齿与反走样Z-buffering(深度缓存),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

笔记:光栅化

  • Rasterization(光栅化)
    • 光栅化基础知识
    • 视口变换
  • 抗锯齿与反走样
    • 模糊(Blurring)与滤波(Pre-Filtering)
      • 傅里叶变换
      • 走样
        • 滤波
        • 滤波器
        • 时域和频域上的采样
      • 反走样(Antialiasing)
      • 模糊化
        • 多重采样抗锯齿MSAA(multi-sample anti-aliasing)
        • 其它抗锯齿方法
      • (超分辨率)Super resolution / super sampling(了解)
  • Z-buffering(深度缓存)
    • 画家算法(Painter’s Algorithm)
    • Z-buffering(深度缓存)
    • 深度缓存算法相关事项

闫令琪教授计算机图形学

Rasterization(光栅化)

光栅化基础知识

Raster(德语中意为屏幕) :光栅化通俗理解就是将物体画在屏幕上。
Pixel(像素) :在此先简单理解为一个方块中颜色是不会改变的,0代表完全黑色,255代表完全白色;同样也可以用一个三位数组[red,green,blue]来表示。
屏幕空间 :将电脑屏幕理解为一个二维坐标系,以左下角为原点,建立一个坐标系
在这里插入图片描述

视口变换

(即进行放缩之后实际的物体并不全在屏幕上,而是物体最左上角的地方位于屏幕中心,因此需要对其进行
下图z方向是没有经过任何的改变的,而原先的小正方体-1到1的范围是2,可以先除2再乘对应的width和height,然后移动原点位置中心:
在这里插入图片描述

抗锯齿与反走样

在这里插入图片描述

根据方块的中心是否位于三角形之中,确定此区域是否染色,可以得到下图效果,而这里明显可以看出有锯齿状的模样和我们原本的三角形是有很大区别的,这就是锯齿(jaggies)和走样(aliasing)
在这里插入图片描述
采样(Sampling) 即在这里可以理解成将物体画到屏幕上的行为;视频也是一种采样(对时间的采样)
失真(Artifacts ) 采样时可能导致的(Errors / Mistakes / Inaccuracies) 等统称为失真(Artifacts ),比如:锯齿,摩尔纹(将图片压缩以后,即删去奇数行或者偶数行,车轮效应(即高速运动的车轮在人眼看起来有时候可能呈现逆时针旋转)
失真的原因 信号变化太快同时采样过慢

模糊(Blurring)与滤波(Pre-Filtering)

对需要采样的物体先模糊化再进行采样,可以明显消除锯齿现象。 注意 :一定要先模糊再采样,否则无法达到反走样的效果
在这里插入图片描述
不进行模糊处理:
在这里插入图片描述
进行模糊处理后:
在这里插入图片描述

傅里叶变换

实质就是将函数变为不同频率的段,并且把这个不同频率的段显示出来。
下图展现的是同样的采样点,频率越高下进行采样,能恢复函数(通过蓝色虚线连接)的效果越差。因此对于频率变换越高的物体,我们采样频率也应该越高,以提高对物体状态的恢复度
在这里插入图片描述

走样

概念 :因此,对于不同的函数,以相同的方式进行采样,可能导致采样结果并不是我们需要的内容(例如下图对蓝线和黑线都以相同的方式进行了采样操作,其结果都是相同的,都展现出为黑线这个效果,我们无法区分它们):
在这里插入图片描述

滤波

右图中按照箭头方向频率逐渐升高,即中心点为低频信号,往外拓展的为高频信号。
在这里插入图片描述
高通滤波 下图将中心点遮挡(即屏蔽了低频率信号),然后再进行逆傅里叶变换(即恢复屏蔽了低频率信号之后的图片),实质上得到的图片相当于是获取到原图片边界点的操作:
在这里插入图片描述
低通滤波 屏蔽高频率信号之后,只留下低频率信号,即我们只能大体看出来这是什么物体,物体边界基本都模糊化了
在这里插入图片描述
带通滤波 留下高频信息和低频信息中间位置,即某一段的信息
在这里插入图片描述
在这里插入图片描述

滤波器

例如:对于一维数组来说,以一维的滤波器(可以理解为滑动窗口),对信号进行卷积,重新获得结果。
在这里插入图片描述
而拓展到图片上来说,对于一张图片,在时域层面上,可以设置3X3的滤波器(卷积核),对其进行各个点数值的改变达到模糊化的效果,但是原图在颜色层面上并不会有太大改变;而从频域层面来看,滤波器基本都是低频率的信息,在和原图相乘之后,得到最右下角的图片,即只剩下低频率信息,逆傅里叶变换后恢复到的即是模糊化后的图片。
在这里插入图片描述

时域和频域上的采样

注意 :时域上的乘积等于频域上的卷积
下图中c和d是 冲激函数 ,在这里可以理解为乘积以后只取样冲激函数上有的点。

时域上乘积以后获得的是对应冲激函数上有值的点;频域上卷积之后相当于是对原图的拷贝粘贴在冲激函数上有值的位置:
在这里插入图片描述
如果频谱上的内容(b图)长度大于频率(d图中的fs)会怎么样?
实际上fs的大小就是由采样频率来决定,如果频率过低,会导致采样数据发生混合(混叠),此时就会引起 走样 现象的发生:
在这里插入图片描述

反走样(Antialiasing)

方法一:提高采样率
通俗理解即增加显示内容的小方块(原先显示屏640X480升级为1080X1080),像素点越小,像素之间间隔越小,采样率频率就越高
方法二:先模糊,再采样
先模糊化后相当于砍掉了高频信号(可能重叠的部分),然后再以原来的采样率进行采样
在这里插入图片描述

模糊化

方法:用一定大小的滤波器对原图片进行卷积,对于上述图片(以三角形为例)进行对每个经过的像素块所占面积进行取平均值:
在这里插入图片描述
但是如何才能对每个像素块计算出它所占的面积?

多重采样抗锯齿MSAA(multi-sample anti-aliasing)

具体操作就是对每个经过的像素块在进行进一步的划分:
在这里插入图片描述
按照其经过的点以不同比例的颜色覆盖(如100%的红色,75%的红色…)
在这里插入图片描述
注意 :MSAA实际上只是解决对信号进行模糊化的操作,采样操作是隐藏在MSAA之后的。并且MSAA操作需要耗费更多的时间和性能

其它抗锯齿方法

快速近似抗锯齿FXAA (Fast Approximate AA)
图像的后期处理,不增加样本数。先得到有锯齿的图,然后通过图像匹配的方法得到这些边界,并且把边界替换成没用锯齿的边界。FXAA和采样无关,是在图像层面上进行的抗锯齿,优势是比MSAA速度快很多。

与时间相关的抗锯齿TAA (Temporal AA)
通过寻找上一帧的信息,相当于将MSAA得到的对应的样本分布在时间上,而在当前这一帧没有引入额外的操作。注意,这个技术是应用再静止图片上的

(超分辨率)Super resolution / super sampling(了解)

和MSAA需要解决的问题是相同的(即:例如需要放大某张图片,但是采样率不够时的解决方法)
• (深度学习)DLSS (Deep Learning Super Sampling)

Z-buffering(深度缓存)

画家算法(Painter’s Algorithm)

从远到近依次画出对应的物体,从而使得近处的物体可以覆盖远处物体的一部分。时间复杂度(nlogn)
(e.g.先画山,然后草地【覆盖了山的一部分】,最后画树【覆盖了一部分草地和山】):
在这里插入图片描述
但是在图形学中画家算法看你会有不能使用的情况,例如在下图中,无法体现三个三角形的相互之间的关系:
在这里插入图片描述

Z-buffering(深度缓存)

简单理解就是,对于空间中的图形,无法很好的表示它们的空间关系,但是这个方法就是用表示这些图形的像素点的空间关系来体现他们之间某块部分的前后关系:
思路:
1、对于每一个像素点来说缓存当前像素点最小Z轴的值(离我们最近的点);
2、使用额外的缓存保存深度信息和值信息:
frame buffer:保存颜色值信息
depth buffer:保存深度信息
3、每次更新插入图片时按深度值更新像素块

伪代码
在这里插入图片描述
在这里插入图片描述

深度缓存算法相关事项

时间复杂度 :n
优点 :相比画家算法来说,深度缓存算法可以不关心画图的顺序问题(画家算法必须先画偏后面的物体,否则前方物体看你会被覆盖)。
透明物体 Z-buffer不能处理透明物体的深度,需要特殊处理
几乎所有的GPU在绘制图像时都采用了深度缓存的算法。

最后

以上就是积极西装为你收集整理的计算机图形学(光栅化)Rasterization(光栅化)抗锯齿与反走样Z-buffering(深度缓存)的全部内容,希望文章能够帮你解决计算机图形学(光栅化)Rasterization(光栅化)抗锯齿与反走样Z-buffering(深度缓存)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部