GAMES101 学习5——光栅化(三角形的离散化)
参考资料:
- https://www.yuque.com/sugelameiyoudi-jadcc/okgm7e/7d79f2ac5a59f11721065370e5415070
- https://blog.csdn.net/qq_36242312/article/details/105695242
一、一些准备工作
术语说明:
Raster(光栅)
: 即德语中的Screen, 动词化Rasterize=drawing onto screenPixel(像素)
: Picture element的缩写
1.1 视锥定义(Define a fov)
只需要定义:垂直的可视视角
和 宽高比
(其他的正交变换之类都可推导出)
fovY表示视野角度,同时已知近平面深度为n,远平面深度为f,宽高比为aspect,所以可以通过相似三角形和角度关系求得:
即构建透视矩阵需要视野角度fov,宽高比,znear, zfar四个参数。
1.2 视口变换
在M(model)
,V(view)
,P(projection)
变换之后,我们已经得到了三维坐标在二维屏幕上的投影,同时也得到了投影区域(Canonical Cube)
。之后所需要的就是视口变换
。视口变换是把三维坐标与屏幕上指定的区域进行映射,简单来说就是我们在屏幕上规定了一块区域,然后将我们投影的坐标规定好,只能画在这块区域中,这就是视口变换所做的事情。
1.3 定义屏幕空间
既然要找到这个映射关系,那么屏幕自身也应该有自己的坐标系,也就是屏幕空间。我们可以把屏幕上的像素看成是像素的矩阵形式,认为屏幕左下角是原点,向右是x,向上是y,里面每一个坐标都可以看做包含了一个像素。
一些规定:
- Pixel’s indices(像素坐标)是(x,y)的形式;x,y都是整数(integers)
- 所有的像素的表示(0,0)to(width-1,height-1)
- 像素的中心:(x+0.5,y+0.5)
- 整个屏幕覆盖(0,0)to(width,height)
1.4 屏幕空间的标准化
这一步需要把Canonical Cube 变换到 ,width和height就是视口变换所需要规定的区域的长和宽。
这一步变换可以看成是二维平面上矩阵的平移和缩放,故有以下视口变换
公式:
二、光栅化
Rasterization -> Draw to Raster Displays
2.1 为什么选择三角形?
- 基础图元:三角形可以看成是基础图元,用它可以构建出不同的图元
- 平面:一个三角形必定是一个平面
- 内外定义:三角形是可以通过顶点环绕顺序来描述其内外性的,方便做面剔除等操作
- 便于插值:三角形内部插值十分方便
2.2 如何确定三角形在屏幕上的像素
当输入三角形顶点坐标时,如何判断对应屏幕上的像素区域?
答案: 采样
2.3 采样
采样
就是对方程离散化的一个过程,在这里我们通过对每一个像素进行判断,如果它的中心点在三角形内部,那么它就是属于三角形的,我们应该在屏幕上将其画出来,而判断方法之前也说过,可以通过叉乘
来实现
- 感性理解:给你一个连续函数,在不同的地方去问,它的值是多少
- 采样就是把函数离散化的过程
- 采样是图形学很重要的一个概念,此处是指利用像素中心对屏幕进行采样
2.4 如何判断像素中心是否在三角形内
-
定义一个inside函数
-
采样
-
具体的实现:叉积→全负/正即为三角形内
结果朝外
结果朝外
结果朝内
由此说明,Q点位于三角形外部
-
一个特殊情况:点在边上怎么办
- 不做处理(本课程)
- 特殊处理(OPenGL和DX)
-
Checking All Pixels on the Screen?
只需要找到边界包围盒即可。
3. Rasterization on Real Displays
4.锯齿
走样问题
- 点赞
- 收藏
- 关注作者
评论(0)