计算机图形学入门07:光栅化中的采样与走样

1.什么是光栅化?

        在前面的章节里提过,光栅化(Rasterization)就是将物体投影在屏幕上的图形,依据像素打散,每一个像素中填充不同的颜色。

        如下图中的老虎,可以看到屏幕上有各种多边形,这些多边形经过各种变换和操作后,会形成屏幕空间的多边形。这样还不够,还需要进一步将多边形打散成像素,告诉每个像素的值应该是什么,这一步的过程就是光栅化

2.三角形网格

        在图形学中,三角形网格(Triangle Meshes)构成了物体表面结构,如下图所示为三维物体和二维物体,都是用三角形构成而来。

        那么为什么使用三角形作为基本形状单元(Fundamental Shape Primitives)呢?因为有如下优点:

        1.因为三角形是最基础的多边形:

                任何多边形都可以用三角形组成,任何多边形都可以拆成三角形。

        2.三角形独特的性质:

                三角形内部一定是个平面,在三角形内部给定三个点连成一个三角形一定是一个平面。

                三角形内外定义非常清晰,可以通过向量叉乘来判断点是否在三角形内部。

                定义良好的三角形顶点插值方法,实现颜色的平滑过渡。

3.采样

        那么如何将三角形填充到屏幕像素中呢?如下图所示:

        这里就用到了采样(Sampling)。所谓采样就是一个连续的函数f(x)在不同x值拿到这个函数的值是多少,相当于把一个函数给离散化的过程。采样在图形学说是非常重要的概念,会有各种各样的采样,这里说的采样是指利用像素的中心对屏幕空间进行一个采样。还可以采样时间、位置、法线,反射光等。

3.1三角形采样

        利用像素的中心对屏幕空间进行采样,就是判断每个像素的中心是否在三角形内部。如下图所示:

        定义一个二进制函数inside(t,x,y),这个函数的作用是给一个屏幕空间中的任意一个点Point(x,y),判断这个点是否在三角形内部,如果在三角形内返回1,否则返回0。

        那么使用这个函数对屏幕空间上所有点进行计算,如下示意代码:

        判断点是否在三角形内部则是通过向量叉乘的方法实现,在前面线性代数的章节中有解释。那么,如果一个像素点中心刚好在三角形边缘怎么处理?有规范参照规范,没有规范自己决定是否在三角形内部或外部。如下图所示:

3.2采样过程优化

        上述对一个三角形进行采样的时候,把屏幕上所有的像素都进行了遍历,如果改三角形只是占屏幕中很小的范围,那么就会造成极大的浪费。这时,就需要进行优化。

3.2.1 AABB包围盒

        如下图所示,左侧白色部分肯定不在三角形内部,右侧蓝色区域为三角形覆盖的最大区域,给定一个包围盒,指轴向包围盒,称为AABB包围盒(Axis-Aligned Bounding Box)。而在包围盒之外区域的像素点自然不需要去判断了。

3.2.2逐行检测

        当一个三角形本身覆盖不了多少像素,但是使用AABB包围盒覆盖了很多像素,比如很窄长又旋转的三角形。对于这种情况,使用AABB包围盒检测方式有些浪费,这时候可以进行逐行检测,就是从三角形左下角开始往右检测,检测完一行再检测上一行,直到检测完最上一行。如下图所示:

3.3采样分类

3.3.1位置上的采样

        对于任何一个拍出来的照片,如果放大都可以看到一个个格子,也就是在分辨率上的像素。图像信息到达感光元件时,把他们离散为屏幕上一个一个的像素,这么一个过程的采样,就是位置上的采样。如下图所示:

3.3.2时间上的采样

        采样不仅发生在不同位置,也可以发生在不同的时间。在不同时间段采样就是时间上的采样。比如视频、动画都是一帧一帧播放的,每一帧就是一张图,将每一张图片叠加在一起就是如下图所示:

4.走样

        走样(Aliasing),表示失去原来的样子。在图形学中表示在光栅化三角形的时候,得到的结果与原本变样了。常见的走样有锯齿(Jaggies)、摩尔纹(Moire)、车轮效应(Wagon wheel effect)

4.1锯齿

        上述采样过程中,得到判断后在三角形内部像素的中心点。如下图所示:

        然后给对应的像素点填充上红色的颜色,就得到下面的左侧图,而实际上的三角形应该是右侧的样子。这种情况称为锯齿。注意:这里是每个像素代表一个小方块,但是实际上的成像屏幕像素并不这么简单,只是方便理解。

        如下图所示,可以明显看到放大后三角形产生了锯齿。

4.2摩尔纹

        如上图所示,把左边图所有奇数行和奇数列像素都去掉,然后把剩下的图像拼接到一起(相当于缩小了照片),然后依旧按照原始大小进行显示,就会出现左边所示的摩尔纹。在日常生活中用手机去拍屏幕也会产生一系列的条纹。

4.3车轮效应   

        在生活中,有些高速行驶的汽车,但是我们的眼睛看他的车轮却反而像是在倒着转,这也是采样所导致的,我们称之为车轮效应。造成这个问题的原因是人眼在时间上的采样,跟不上运动的速度,时间上采样慢也就是采样频率低。

4.4产生走样的原因

        上述三种情况也被称为Sampling Artifacts,当然还有其他情况。锯齿和摩尔纹都是在空间或者位置上采样产生的问题,而车轮效应是在时间上采样产生的问题。总结就是,信号(函数)变换太快,采样速度太慢。采样速度也就是采样频率

4.2.1采样频率

        采样频率可以理解为抽取样本的间隔。应用到光栅化里面,我们可以把三角形当做无数的点组成,而我们屏幕又是由一个个的像素组成,这些像素的中心点对应到三角形中的某些点,等同于所有点中抽取出的样本。那么采样的间隔自然是我们像素的实际物理大小。因此若屏幕大小不变,分辨率变高(即像素越多,像素的中心点物理间隔越小),采样频率越高。

        那么,产生了走样如何解决?将会在下一章说明。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-06 23:04:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-06 23:04:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-06 23:04:01       82 阅读
  4. Python语言-面向对象

    2024-06-06 23:04:01       91 阅读

热门阅读

  1. 赶紧收藏!2024 年最常见 20道 Kafka面试题(九)

    2024-06-06 23:04:01       32 阅读
  2. 【2024.06.06 晴-周四】

    2024-06-06 23:04:01       27 阅读
  3. IDEA 2022

    IDEA 2022

    2024-06-06 23:04:01      33 阅读
  4. 力扣linkedlist

    2024-06-06 23:04:01       30 阅读
  5. 【高频】如何保证缓存和数据库一致

    2024-06-06 23:04:01       32 阅读
  6. git本地仓库与远程仓库关联

    2024-06-06 23:04:01       28 阅读
  7. 如何重新设置路由器密码

    2024-06-06 23:04:01       34 阅读
  8. 华为防火墙基础配置

    2024-06-06 23:04:01       28 阅读
  9. 整理好了!2024年最常见 20 道 Kafka面试题(九)

    2024-06-06 23:04:01       39 阅读
  10. git随记

    git随记

    2024-06-06 23:04:01      24 阅读