原理公式
光栅化:把三角形投影到屏幕后,判断每个像素是否落在三角形内 (重心坐标判断),落在则填充该像素。
Z-Buffer 深度测试:为每个像素维护一个最近深度,逐三角形比较:
$$\text{if } z_{pixel} < z_{buffer}[x][y]: \quad z_{buffer}[x][y] = z_{pixel};\quad color[x][y] = c$$
推导要点:Z-Buffer 用每个像素记录最近深度的方式解决遮挡—— 这是 GPU 渲染的基石,也是「近处物体盖住远处物体」的算法实现。
重难点核心代码(code/demo14_rasterizer.py)
Python
def point_in_triangle(p, tri): # 重心坐标法
(x, y) = p; (x1,y1),(x2,y2),(x3,y3) = tri
det = (y2-y3)*(x1-x3) + (x3-x2)*(y1-y3)
a = ((y2-y3)*(x-x3) + (x3-x2)*(y-y3)) / det
b = ((y3-y1)*(x-x3) + (x1-x3)*(y-y3)) / det
return a >= 0 and b >= 0 and 1-a-b >= 0
if z < depth[y, x]: # 深度测试
depth[y, x] = z
color[y, x] = col
