3.Rasterization光栅化(三角形光栅化)
前情提要
- 模型变换
- 视图变换
- 投影变换(正交投影、透视投影)
- 物体会缩放到
的立方体内
接下来,我们需要把物体放画到屏幕上,即光栅化
屏幕
- 有一组像素
- 像素的多少(分辨率)
- 一种光栅成像设备
Raster在德语中就表示屏幕
所以光栅化就是把物体画在屏幕上的意思
像素
-
Pixel是”picture element“的缩写
-
最小颜色单位
-
一个正方形内部颜色均匀,这整个正方形只能有一种颜色(红、绿、蓝)。
屏幕空间

- 像素的索引为形式为(x,y),其中x和y都是整数
- 像素的索引从(0,0)到(宽度-1,高度-1)
- 像素(x,y)在(x+0.5,y+0.5)的中心
- 屏幕覆盖范围(0,0)到(宽度,高度)
视口变换
-
与z无关
-
把前面视图变换后获得的
缩放到 和 的屏幕空间中去

视口变换矩阵
光栅化
我们已经把图像缩放到了屏幕大小,接下来呢?
接下来,我们需要把图像打散成像素,使其真正在屏幕上显示
光栅显示设备
- 示波器
- CRT显示器(控制电子打到屏幕成像)
- LCD(液晶显示器,根据液晶的原理,控制一个像素显示什么颜色)
- LED(发光二极管)

- 上图是CRT的显示设备
- 控制一行电子一行电子成像
- 引申出隔行扫描(上一帧显示1、3、5..行,下一帧显示2、4、6..行),但容易造成画面撕裂
三角形光栅化
- 三角形是最基础的最小的面
- 其他所有多边形都能拆解成三角形
- 根据三角形内部任意一个点与三个顶点的关系,可以插值出渐变效果

如何判断一个点与三角形的关系?
1.采样法
定义:将一个函数离散化的过程。

- 判断这个像素的中心点是否在三角形内部。在这里采样表示遍历所有的像素点。
- 遍历所有的像素点与三角形的位置关系(是否在三角形内部,是则1,否则0)
- 要是某个像素点正好在三角形的边界上,这种情况一般是特殊处理或者不做处理,这些可以是自己定义的。
for(let i=0;i<xMax;i++){
for(let j=0;j<yMax;j++){
image[x][y]=inside(tri,x+0.5,y+0.5)
}
}
2.叉乘法
优化采样流程
包围盒

- 是对采样法的一个优化
- 包围盒的范围是三角形的最大范围(AABB)
- 不用遍历每一个像素点,利用包围盒缩小检测的范围。
增量三角形遍历

- 每一行找出三角形的边界,相当于每一行找到一个包围盒
- 然后再在每一个包围盒内进行检测点是否在内
实际屏幕光栅化

- 实际屏幕的像素不一定是正方形
- 学习过程中假设为1平方大小的,内部颜色均匀的小方块
光栅化后的效果以及问题
- 现在我们已经完成了光栅化,判断好了,点是否在三角形内,三角形内的像素变成了红色

- 屏幕上的效果如下

- 这是我们期望的效果

- 这是怎么回事呢?
- 引入”反走样“
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了