目录
1. 透视投影
一般需要定义fovY(垂直的可视角度,即两个红线中间的角度);aspect ratio长宽比。(通过长宽比、垂直可视角度可以推出水平的可视角度)
1.1 计算l,r,b,t
上一节中,
2. 光栅化 (将立方体画在平面上)
MVP之后,立方体画在平面上
光栅化 == 将立方体画在屏幕上。
这里理解为像素代表最小单位,每个像素只有一个颜色。
2.1 像素
2.2 立方体画在屏幕上
忽略 z;把 [-1, 1] 转到屏幕大小。
-1 ~ 1 一共是2,所以除以 2 再乘以 width 或者 height;
缩放之后,-1 变成 -width / 2,把他变成 0, 需要平移 width / 2;
得到上图矩阵。(即 [-1, 1]平方变到屏幕空间)
至此,可以把frustnum通过正交投影or透视投影变到屏幕上的图片。
2.3 介绍显示设备
-
CRT(比如示波器),隔行扫描,第一帧画1.3.5奇数行,第二帧画2.4.6偶数行,利用人眼暂留效应。目前在视频压缩中仍有应用。
在高速运动中,隔行扫描会出现鬼影现象。 -
显示器:
将显卡的内存(显存),映射到屏幕上。要显示的图像存在内存中的一块区域,想要显示哪张图就映射哪块内存。 -
LCD 液晶显示器:
液晶通过自己i的不同排布,影响光的极化(偏振方向)。
光的波动性,光经过一个光栅,只会留下光栅规定的方向的震动能量。
液晶显示器原理:通过一个个液晶扭曲,逐渐把光的振动方向一点点调过来(右上角图) -
LED 发光二极管:
-
电子墨水屏幕:
有黑/白墨水,通过不同的电压,控制黑色在上面还是白色在上面。
存在问题:刷新率低。
2.4 为什么用三角形光栅化?
- 三角形是最基础的多边形;
- 任何多边形可以拆成三角形;
- 三角形内部一定是个平面;
- 通过向量叉积可以判断是否在三角形内(不存在多边形里面有洞等问题);
- 定义三角形三个顶点具有不同属性,在三角形内部可以通过插值,从一个顶点的属性渐变变化到另一个顶点的属性(重心坐标插值方法)。
2.5 用采样做光栅化
采样:函数离散化过程
这里用像素中心进行采样;判断像素中心是否在三角形内。
2.6 如何判断是否在三角形内?
P1P2叉乘P1Q : 结果为正,Q在P1P2左侧;
P0P1叉乘P0Q:结果为正,Q在P0P1左侧;
P2P0叉乘P2Q:结果为负,Q 在P2P0右侧。
叉乘,只有判断出全部是在左侧,或者在右侧,才在三角形内。
落在三角形边上的情况:自己定义(可以定义在那条边上算,或者都不算)。
opengl: 左边和上边认为在三角形内,右边和下边认为不在三角形内。
2.7 三角形光栅化加速1:使用bounding box避免遍历屏幕内的所有像素
已知P0 P1 P2三个点的x y,所有的x y都取最小和最大,得到bounding box区域。只有在box区域内的,做循环,判断是否在三角形内部。
2.8 三角形光栅化加速2:
每一行都找三角形的最左和最右(但这个最左和最右不太好找)。比如三角形是很窄长,又旋转45度,这个时候bounding box会很大,就适合用该种方法,
2.9 锯齿
原因:1.像素本身有一定大小; 2.采样率对信号来说不够高,产生信号走样问题(aliasing)。接下来,抗锯齿(反走样)。