视频 &图片来源:【B站】GAMES101-现代计算机图形学入门-闫令琪
1. 正交投影-续
1.1 宽高比与垂直可视角
- 宽高比 aspect ratio
- 垂直可视角度 vertical field of view:与上沿重心连线,和与下沿中心连线之间的夹角(图里两条红色虚线的夹角)。影响视锥(frustum)的开口(角度越小,越趋近于正交投影)。
一个例子:上图为从侧面观察
引出:通常情况下,我们定义一个视锥,只需要定义①垂直可视角度;②宽高比,其他的参数可以自动转化到定义正交投影的概念上。
1.2 显示
什么是屏幕(screen)?
- (图形学上说是)像素的数组
- 分辨率:定义数组的大小
- 一种典型的光栅显示
什么是光栅(raster)?
- 把图像画在屏幕上的过程
什么是像素(pixel)?
- 一个颜色统一的小方块(方块内颜色没变化)
- 一个像素内的颜色可以由RGB表示
什么是屏幕空间?
- 像素的坐标(index)由 ( x , y ) (x,y) (x,y)表示
- 每个像素由一个整数坐标来描述
- 像素的下标范围: ( 0 , 0 ) → (0,0)\to (0,0)→ ( w i d t h − 1 , h e i g h t − 1 ) (width-1,height-1) (width−1,height−1)
- 虽然用整数描述,像素中心在 ( x + 0.5 , y + 0.5 ) (x+0.5,y+0.5) (x+0.5,y+0.5)
- 整个屏幕的范围: ( 0 , 0 ) → ( w i d t h , h e i g h t ) (0,0)\to(width,height) (0,0)→(width,height)
视口转换矩阵:
M
v
i
e
w
p
o
i
n
t
=
(
w
i
d
t
h
2
0
0
w
i
d
t
h
2
0
h
e
i
g
h
t
2
0
h
e
i
g
h
t
2
0
0
1
0
0
0
0
1
)
M_{viewpoint}=\left(\begin{matrix}\frac{width}{2}&0&0&\frac{width}{2}\\0&\frac{height}{2}&0&\frac{height}{2}\\0&0&1&0\\0&0&0&1\end{matrix}\right)
Mviewpoint=⎝⎜⎜⎛2width00002height0000102width2height01⎠⎟⎟⎞
核心:先缩放再移动。
3
×
3
3\times3
3×3对角阵-缩放。
2. 光栅化
2.1 三角形
为什么要用三角形?
- 三角形是最基础的多边形
- 任何多边形都可以拆成三角形
- 三角形内部一定是平面的
- 三角形内外定义的非常清晰
- 定义三角形三个顶点不同的属性,能够得到一个渐变的效果(在三角形内部插值)
2.2 采样
采样:离散化函数的过程。
定义二元函数:
i
n
s
i
d
e
(
t
,
x
,
y
)
=
{
1
点(x,y)在三角形t内
0
其他
inside(t,x,y)=\begin{cases}1& \text{点(x,y)在三角形t内}\\0&\text{其他}\end{cases}
inside(t,x,y)={10点(x,y)在三角形t内其他
//采样
//遍历整个屏幕
for(int x=0;x<xmax;++x)
for(int y=0;y<ymax;++y)
image[x][y]=inside(tri,
x+0.5,
y+0.5);
蓝色区域:包围盒(Bounding Box),光栅化只考虑区域内的像素。
另一种加速方法:找每一行的最左像素和最右像素。适用于窄长的三角形。
2.3 实际屏幕的光栅化
实际LCD屏幕上的像素
三星的钻石排列(bayer pattern)使用了更多的绿色像素→人眼对绿色更敏感