还记得什么是光栅化咩?
将三维空间的几何形体显现在屏幕上,这就是光栅化(游戏、实时图形学的应用)
Perspective Projection
在正交投影里如何定义三维空间中的立方体呢?
用x轴的覆盖(左、右),y轴的覆盖(上、下),z轴的覆盖(远、近)
远近用正交投影和透视投影都是一样的,在做透视投影的时候,是需要把视锥变成长方体
那我们如何定义这样一个视锥呢?
从摄像机出发,看向某一个区域,看到的近平面为其定义宽度和高度,就像是看显示器一样,定义一个宽高比,那什么是宽高比呢?
宽高比,顾名思义,它的宽度除以它的高度,即视图区域可看到的长宽比
我们还需要一个定义:视角(可看到的角度的范围,垂直可视角度,广角就是指垂直可视角度较大)
由长宽比和垂直可视角度可以推出水平可视角度
把摄像机摆放到某各个位置,向一个方向看,如果从侧面看可以看到这样的三角形,右面的线和摄像机距离是,我们已知垂直可视角度,可视角度是上下两条连线的夹角,垂直可视角度/2是三角形张开的角度,可得出两个公式:
定义视锥:定义垂直可视角度、定义宽高比
可以自动转化到定义正交投影的远近、左右、上下
根据前置内容,所有东西都可以转化到这样一个立方体上:
我们如何将这个立方体画到屏幕上呢?
既然要画到屏幕上那就先明确屏幕的定义,在计算机图形学中,屏幕被定义成一个二维的数组,数组中的每一个元素被定义成一个像素,像素的多少可以组成分辨率的概念
屏幕是典型的光栅成像设备,光栅即屏幕,把东西画在屏幕上就是光栅化的过程
像素:picture element(居然真的是像素。。。),像素是最小的单位,在里面不会有变化
透视投影转化成正交投影需要保证近和远两个平面是不变的,大小是近远两平面都会变得和近平面一样大
Canonical Cube to Screen
定义像素坐标,均写成形式,用整数坐标描述,比如现在的蓝色像素可以用表示(从0开始数),屏幕的分辨率从开始一直到,像素的中心是,从三维空间到屏幕变换(立方体映射到屏幕空间):
有z怎么办呢?
z先不用管,后面有它的用途,至于x和y,将这个拉成宽度是width,高度是height,因为-1~1是2,所以需要先/2再×对应的高度或者宽度,我们要把屏幕空间的左下角定义到原点上,也就是说原来的中心是那需要把它移到该在的位置上,这个变换被称为视口变换
下一步我们要把空间中描述的信息变成真正的图,即打散成像素
在《少年派的奇幻漂流》中的老虎栩栩如生,这是图形学的贡献,老虎身上有很多多边形,经历了变换操作后会形成在屏幕中的多边形,要进一步把多边形打碎成像素显示在屏幕上,知晓每一个像素的值都是什么,这个过程叫做光栅化
图像不止可以显现到屏幕上,还有一些其他的绘画工具
Drawing Machine
机器人的机械臂?:
激光切割:
Different Raster Displays
示波器:示波器本身也是成像的设备,它成像的原理和早期的显示器基本相同,电子经过阴极射线管加速打到屏幕上(CRT屏幕)
采用扫描的方式控制打印的位置,(隔行扫描,画每张图工作量减少一半,但对高速运动的画面容易造成画面撕裂)隔一行一条线,当足够密集的时候就足以覆盖整个屏幕:
显示器🖥通过显卡(内存中的一块区域映射到屏幕上):
高分辨率显示器,有些甚至分辨率超过了人的视网膜的分辨率(视网膜屏幕):
LCD(液晶显示器)利用液晶的原理控制显示
液晶通过自己的排布影响光的偏振方向(极化),两个光栅不同方向排布
LED发光二极管:
墨水屏刷新有点慢,但是挺自然
三角形表示能力很强,可以表示很多二维三维中的图形:
为什么三角形在图形学中得到了如此广泛的应用呢?
首先三角形很简单,任何东西多可以拆分成三角形,内部一定是平面的,内外很清晰,只要定义了三角形的三个顶点,可以明确的知道差值:
判断像素和三角形的位置关系是光栅化中很重要的一环,像素内部是不能有颜色变化的,那盖住一半的像素该怎么办?
那就考虑像素中心点与三角形的位置关系呗:
最简单的光栅化方法:采样,那么我们如何进行这样的采样呢?
可以这样遍历一个二维数组:
inside是定义的一个函数,判断点是否在三角形内(可以做叉积):
那如果给定点恰好在三角形的边界怎么办?
那就要么不做处理,要么特殊处理(计上不计下,计左不计右)
通过采样进行光栅化:
有的点不可能触碰到三角形,三角形根本不可能填充到这些像素上,蓝色区域:三角形的包围盒
每一行都找最左和最右(包围盒较大时比较适用):
实际屏幕效果:
绿色像素多一点(人眼对绿色更为敏感,红:蓝:绿=1:1:2)
我们仍然认为像素是一个内部颜色均匀的小方块:
采样后对应像素发现不太对:
可是我们想要的不是这个吗?
这锯齿太明显了吧?造成这个的结果呢就是因为锯齿,锯齿是图形学中致力解决的一个问题,采样率对于信号来说不够高:走样
抗锯齿、反走样是图形学中的一个重要技术