图形学基础 (四) 光栅化

一些定义

屏幕
  • 二维数组, 每个元素是像素 像素可以用RGB三个来表示, 每个像素默认是一致的, 不会变化
光栅
  • Roster == screen 德语里含义是一致的, 所以光栅化就是把物体弄到屏幕的过程
屏幕空间
  • 在屏幕建立一个坐标系,左下角为原点

image-20211205163125861

每个像素都可以用一个整数坐标来表示, 范围是(0, 0) 到(width -1, height -1)

像素中心在坐标 +0.5的位置上

image-20211205163311683

正交投影到屏幕
  • 之前正交投影的时候会把它映射到一个[-1 1] 范围内的正方体, 现在把它变到屏幕范围内

image-20211205163831160

image-20211205163948349

  • 先将其拉伸到height, width, 然后平移, 注意这里z方向没有任何改变, 因为和z没有关系

三角形光栅化

  • 三角形是怎么得到的呢? 这个还不太清楚

image-20211205164838467

  • 三角形有很多好处, 比如它是最基本的多边形, 三角形内部一定是平面的, 三角形内外很清晰
  • 三角形内部容易插值
判断像素和三角形的位置关系

image-20211205165733509

  • 更确切来说是考虑像素中心点和三角形的位置关系, 通过 采样 的方法解决

  • 采样就可以简单理解说现在有一个函数它是连续的, 然后在不同的离散位置询问函数的值, 下面这个小循环就是采样:

image-20211205170002752

  • 这里说的采样主要是利用像素中心对屏幕进行采样, 也就是输入是离散的像素中心, 得到对应像素中心位置的像素值
问题定义

现在就是给定三角形, 判断像素中心是否在三角形内

image-20211205170521568

假如在的话我的像素值就会改变, 不在就不变, 就可以在屏幕上显示一个三角形了

  • 用1表示在, 0表示不在, 简单表达如下:

image-20211205170636412

image-20211205170700813

inside 函数是什么
  • 之前的时候提到其实叉乘就可以判断一个点是不是在三角形内

image-20211205171927707

比如现在有一点Q, P1P2和P1Q叉乘, 可以知道Q是在P1P2的左侧还是右侧, 也可以判断 P0P1和P0Q 的关系

总结一下

考虑一个三角形, 把它的三个点规定顺序, 比如ABC 或者 P0 P1 P2, 按顺序重复判断与点的关系, 比如AB与AQ, BC与BQ, CA与CQ, 得出的结果要么全是正的,要么全是负的, 在这种情况下才可以判断是在三角形内或者外

三角形边界的处理

  • 就是假如像素中心在三角形边界上, 那么不对其进行处理

三角形包围盒

就比如给你三个点, 取最小最大X, 最小最大Y可以得到一个方形的区域

image-20211205172940744

每一行也可以找个box

image-20211205173613707

目前存在问题(Aliasing 走样)

锯齿

image-20211205173728127

假如按现在的做法, 会出现严重的锯齿, jaggies! , 这是空间采样产生的问题

摩尔纹

比如一张图片你去掉奇数行和列, 会出现一些纹纹, 这是下采样造成的问题

image-20211205193134725

车轮效应

比如你盯着车看, 看着看着轮子方向不一样了, 时间采样的问题

### 一些解决方法

  • 预处理滤波使其模糊

image-20211205193909769

用这个模糊的三角形去处理, 得到的像素也有些渐变了, 但是先采样再模糊就不行

问题剖析
  1. 为什么下采样带来了aliasing? 为什么采样速度跟不上信号变化速度会有走样?
  2. 为什么模糊之后再采样效果就变好了呢?

为了解决这些问题需要一点傅里叶的知识

频域 (Frequency Domain)

image-20211205194847945

这里的频率是1和2 , 下面展示一下傅里叶的分解, 用正弦波近似代替一个正方形的波

image-20211205195140668

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a9hKKM2y-1639011814074)(typora_pic/image-20211205195156934.png)]

  • 首先有一个正方形的波, 然后把一个正弦波向上提A/2 , 就有些近似了

image-20211205195319381

可以越加越多

image-20211205195335506

  • 这里粗略的把从时域变到频域的变换叫做傅里叶变换 , 变回来叫傅里叶逆变换

image-20211205195846866

  • 因为信号可以变换成一系列频率的组合, 采样的时候采样频率过低就会丢失一些高频信息

image-20211205200117248

走样的比较正式的定义

image-20211205200542610

上图是两种不同的频率, 蓝色的频率高, 黑色的频率低, 假如你的采样频率对两种信号的采样都是一样的, 也就是说无法区分两者, 那应该就是走样 aliases, 好像是混叠吧比较正式的术语

滤波

image-20211205201128337

看下面这张图, 本身的图代表的是时域的信息, 然后变换到频率后中间的是低频信息, 周围的是高频信息, 越亮代表包含的信息越多. 可以看到这里低频的信息很多, 高频的信息比较稀疏

image-20211205201254994

  • 这个图中间有两条白线,这是啥呢, 就是说假设图片是周期信号, 也就是它到了右边界再从左边界重复, 这样摆在一起的时候左右会有截然不同的变化, 也就是一个阶跃信号,这个在不同的频域都有 (是阶跃信号还是高频信号不太懂) 所以有一条贯穿的白线

保留高频信息

  • 过滤低频信号, 可以看到低频的变成个黑的了, 右边的图再逆傅里叶变换, 就得到了左边的图, 会发现它的高频还是有些意义的, 像是人的边界, 这个滤波器也就是高通滤波

image-20211205204018567

  • 为啥高频信息会对应边界呢? 可以这样理解, 边界本身的像素和周围是有很大区别的, 是变化很剧烈的, 所以对应的频域就是很高的

保留低频信息

image-20211205204326517

会发现这张图变模糊了, 这是因为通过这个低通滤波器之后再没有边界的东西了

保留中频段的信息

image-20211205205644840

有一些类似边界的信息

留下的频率更高

在这里插入图片描述

滤波又等于平均又等于卷积

下面是滑动窗口的卷积

在这里插入图片描述

  • 时域的卷积对应频域的相乘, 时域上乘积对应频域上卷积

  • 下面用个例子理解卷积:

image-20211205221448330

比如每个像素让其变为周围9个像素的平均, 这个卷积的过程可以是下面的操作, 也就是先变换到频域, 然后频域相乘, 再逆变回去

这里乘1/9是为了防止图像亮度变化, 还发现滤波器基本是低频信息

  • 假如这样一个滤波器时域上变化对应的频域怎么变呢

image-20211205224430319

左边是一个滤波器, 右边是频域的表达, 假如时域变大了的话, 那么对应频域也变小了, 很好理解, 假如你取平均的卷积核越大, 那么相应丢失的信息越多

image-20211205225243943

采样

  • 图形中的采样其实就是屏幕上有很多像素, 正常来说显示应该是连续的, 但是我只要对应像素点的值, 所以是离散的采样

  • 下图是一个采样的过程, 原先我有一个信号 ,然后我用冲激函数去和它相乘采样, 对应是频域的卷积, 会发现所谓的采样其实就是频域的复制

image-20211205230759142

采样频率太低就会出现频谱的混叠

image-20211205230952195

反走样

  • 当然最根本的是提高采样频率, 在图像中来说就是把屏幕分辨率调大, 像素多了采样点密集自然采样频率就大了, 这是物理解决方法

  • 之前提出的方法是先做模糊后做采样

  • 模糊其实就是低通滤波, 把高频的信号过滤了, 然后再采样就会降低混叠的程度

image-20211205231427820

  • 为什么先采样再模糊不行呢? 因为采样完已经产生混叠了, 再模糊也没啥用了

  • 那么怎么把三角形变模糊呢?像是下图中的。 其实很简单,就是用一定大小的卷积操作就可以了, 等价于一个低通滤波器

在这里插入图片描述

其实这里的卷积核就是一个像素而已

在这里插入图片描述

看下面的图假如你的三角形覆盖了1/8的位置, 那么我这个像素的颜色就是你覆盖的加上没覆盖的平均

在这里插入图片描述

实际中的反走样操作

  • 现在是需要求一个像素覆盖或者没覆盖的平均
MSAA

用更多的采样点进行反走样

基本思想是认为一个像素被划分成了好多小的像素, 比如下面一个像素被分成了16份, 每个小的像素又有一个中心

在这里插入图片描述

再比如下面的例子:

在这里插入图片描述

在这里插入图片描述

你比如说看下面这个像素:

在这里插入图片描述

它有三个点在三角形内部所以可以估计三角形覆盖了这个像素75%的内容

这样最后会得到下面的结果, 也就是模糊操作完成并进行了采样:

在这里插入图片描述

当然实际过程中有很多复用, 不是完全这个样子的

介绍两种抗锯齿方法
  • FXAA (Fast Approximate AA) 先得到有锯齿的图,然后进行后处理, 具体是找到有锯齿的边界然后换成没有锯齿的

  • TAA (Temporal AA) 用上一帧的信息辅助处理

  • 还有一个很相似的是Super resolution (超分辨率), 把小图拉大, 使用DLSS (Deep Learning Super Sampling)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

live_for_myself

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值