rasterization 光栅化

after MVP: canonical cube to screen

Screen: an array of pixels,

Resolution: size of the array

Rasterize=drawing onto the screen

是因为[-1, 1]的长度为 2,中心移动到 pixel 的实际中心;———视口变换

之后就是需要把得到的结果打散成 pixel

rasterize triangles to pixels

隔行扫描识别输入可以利用视觉暂留,但会出现画面撕裂的问题,特别是高速运动如体育运动。

triangles 是最基础的形状基元,fundamental shape primitives;

判断一个像素中心点和三角形的关系;

sampling 是最简单的光栅化的方法;对屏幕空间进行采样;

使用叉积来判断点是否在三角形内;

边界情况:自己定义,部分如 OpenGL 有一套自己的定义。

通过轴向包围盒 AABB,剔除掉外围的像素,提高遍历效率;

实际的屏幕光栅化:

bayer pattern,此外绿色较多,因为人眼对绿色敏感,这个是三星手机上的像素排布;

一个 pixel 包括了红绿蓝三条,iPhone 的像素排布;

光栅化会出现的问题:jaggies锯齿,走样了 aliasing;要考虑采样率

反走样 antialiasing

sampling theory

jaggies 的学名就是 aliasing

sampling artifacts in computer graphics

实现反走样的方式:blurring(pre-filtering) before sampling 先模糊后采样

频域

filtering=getting rid of certain frequency contents

傅立叶变换,可以将图像从时域变换到频域(中间低频,周围高频)

blur = filter out high frequencies

filtering=averaging 平均 = convolution 卷积

sampling = repeating frequency contents: 时域上的乘积等于频域上的卷积

采样点之间的距离很大,对应到频域上彼此之间复制的太多了,混在了一块儿

反走样:

  1. 增加采样率 sampling rate
  2. 先模糊再采样,先把高频信息拿掉,再进行复制粘贴
  3. 用更多的采样点来模糊,然后再采样 MSAA

引入 MSAA 牺牲了什么?增大了计算量 no free lunch

其他方法,FXAA,TAA

super resolution/super sampling 超分辨率

想把采样 512512 的 1k1k 的图片采样回来
使用猜测的技术:深度学习

visibility/occlusion 可见性/遮挡

画家算法:从远到近画画

无法按照远近深度来进行排序:解决方法——深度缓存,z-buffering

各个像素到相机的距离:深度

数值表示深度,R 表示无穷大,越小说明越近,越会显示出来

z-buffer 处理不了透明物体

O(n)的复杂度, 只是对像素做最小值,而不是对像素的排序,所以是线性复杂度

和顺序无关

浮点型数据类型下无绝对相等

Shading 着色

The process of applying a material to an object 给对象贴图

Diffuse reflection 漫反射

Blinn-Phong reflectance model

布林-冯反射模型

diffuse 漫反射

反射存在负数的时候,没有意义,所以取了 Max

第一个 kd 表示这个点的吸收的系数,漫反射系数,如果是 1,说明完全不吸收被反射出去

和观察到的方向毫无关系

specular 高光

与观察方向有关;

通过 p 来减小容忍度,在 100-200 这样

ambient 环境光照

是一个常数

shading frequency

逐顶点:Gouraud shading

逐像素:Phong shading

逐三角面:flat shading

graphics pipeline 图形管线,实时渲染管线

real-time rendering

img

可编程的过程,称为写 shader

可以用 OpenGL 来写 shader

一个网页上可以执行的渲染代码

纹理映射 texture mapping

U,v 纹理上的坐标,纹理的范围都定义在 0-1 之间,不管分辨率和长宽比

interpolation across triangles: barycentric coordinates

重心坐标,实现三角形内插值

在投影中,重心坐标前后会发生变化。所以可以在三维的时候求重心坐标,然后一起投影到二维上面去

applying texture

简单纹理贴图:

栅格化的屏幕点(x,y) ➡️ 使用重心坐标插值得到纹理坐标(u,v) ➡️ 查询纹理颜色texcolor ➡️ 把这个作为布林冯的漫反射参数Kd

纹理放大 texture magnification

高清的墙上贴着低分辨率的照片
一种方式是给 pixel 上的 texel 四舍五入,最近邻插值 nearest
通过 bilinear 双线性插值(水平和竖直方向进行插值,一共两次)
bicubic 双立方,取周围十六个进行插值

纹理缩小

纹理大了的话,远处有摩尔纹 moire,近处锯齿 jaggies,就是走样问题
屏幕上的像素覆盖的区域不同,有的里面覆盖了纹理上的好多 texel
msaa 来做,很耗时间
可以避免采样,pixel 里进行 texel 的平均,属于范围查询里的平均
Mipmap,可以进行范围查询(fast,approximate,square 方形的范围查询
存储量只是多了三分之一,就是对不同 level 的 mipmap 存储
求解处于哪一层
采用不同的层数,得到的结果不连续,要实现 1.8 层这种内部的层。采用层与层之间的插值来实现 trilinear 三线性插值,做一次查询就能得到该区域覆盖的 texel 平均。得到了非常广泛的应用
mipmap 出现了 overblur(远处地板过曝,然后都糊在了一起),因为只能进行正方形内的插值
部分解决该问题的方法,anisotropic filtering 各向异性过滤,ripmap,针对矩形这种可以快速范围查询,但针对斜着的区域还是不行。之后提出了 EWA 过滤
2X 就是得到二乘二的各向异性 ripmap 结果,同理其他的

application of textures

环境光照 environment lighting

可以把环境光记录在球面上,后续拉开即可。spherical environment map,会出现扭曲问题(就类似世界地图投影展开),可以使用 cube map 来记录。但这种不太好根据方向和角度来找对应的物体

凹凸贴图 bump/normal mapping,法线贴图

纹理不止可以表示颜色,也能够存储相对高度信息。在不修改几何形体的条件上,修改贴图来呈现出凹凸的效果。

位移贴图 displacement mapping

directX 在 windows 上会有根据需求动态区分细粒度还是粗一点的粒度

3D procedural noise, solid modeling

阴影贴图

比较$d_{map}$上的深度值与投影回光源的点的实际深度值