| 坐标系 | 说明 |
|---|
| 模型空间 | 物体局部坐标 |
| 世界空间 | 全局坐标 |
| 观察空间 | 相机坐标 |
| 裁剪空间 | 投影后坐标 |
| 屏幕空间 | 像素坐标 |
平移:
T=100001000010txtytz1
缩放:
S=sx0000sy0000sz00001
旋转(绕 Z 轴):
Rz=cosθsinθ00−sinθcosθ0000100001
pclip=Mprojection×Mview×Mmodel×plocal
近大远小,符合人眼视觉:
Mpersp=r−l2n0000t−b2n00r−lr+lt−bt+b−f−nf+n−100−f−n2fn0
其中 n 为近裁剪面距离,f 为远裁剪面距离。
平行投影,无近大远小:
Mortho=r−l20000t−b20000n−f20−r−lr+l−t−bt+b−n−fn+f1
将三角形覆盖的像素标记为”内部”。
判断点在三角形内:
使用叉积判断:
v0×v1>0∧v1×v2>0∧v2×v0>0
三角形内任意点 P 可表示为:
P=αA+βB+γC
α+β+γ=1,α,β,γ≥0
α=SABCSPBC,β=SABCSPCA,γ=SABCSPAB
维护深度缓冲区,解决遮挡问题:
for each triangle:
for each pixel in triangle:
if z < zbuffer[x][y]:
zbuffer[x][y] = z
framebuffer[x][y] = color
时间复杂度:O(n)(n 为三角形数 × 每个三角形的像素数)
空间复杂度:O(W×H)(帧缓冲 + 深度缓冲)
I=Ia⋅ka+Id⋅kd(N⋅L)+Is⋅ks(R⋅V)n
| 分量 | 含义 | 说明 |
|---|
| 环境光 Iaka | 全局光照 | 常量 |
| 漫反射 Idkd(N⋅L) | Lambert 反射 | 与视角无关 |
| 镜面反射 Isks(R⋅V)n | 高光 | 与视角有关 |
Blinn-Phong 改进:用半程向量 H=∥L+V∥L+V 替代 R:
Ispecular=ks(N⋅H)n
| 着色方式 | 计算位置 | 效果 |
|---|
| Flat 着色 | 每个面 | 面片感强 |
| Gouraud 着色 | 每个顶点 | 较平滑 |
| Phong 着色 | 每个像素 | 最平滑 |
将2D纹理映射到3D表面:
(u,v)∈[0,1]×[0,1]
| 方法 | 质量 | 性能 |
|---|
| 最近邻 | 差(锯齿) | 最快 |
| 双线性 | 好 | 中等 |
| 三线性 | 最好(Mipmap) | 较慢 |
Mipmap:预计算多级纹理,根据像素与纹理的距离选择级别:
级别=log2(max(dxdu,dxdv,dydu,dydv))
用纹理存储法线方向,模拟表面细节而不增加几何复杂度:
N′=normalize(T⋅nt)
其中 T 为切线空间变换矩阵,nt 为纹理中的法线。
顶点数据 → 顶点着色器 → 图元装配 → 几何着色器 → 光栅化 → 片段着色器 → 混合 → 帧缓冲
| 阶段 | 可编程 | 功能 |
|---|
| 顶点着色器 | 是 | MVP 变换 |
| 图元装配 | 否 | 组装图元 |
| 几何着色器 | 是 | 生成/修改图元 |
| 光栅化 | 否 | 生成片段 |
| 片段着色器 | 是 | 着色、纹理 |
| 混合 | 否 | 深度测试、混合 |
从相机发射光线,与场景求交:
for each pixel:
ray = generate_ray(pixel)
hit = trace_ray(ray, scene)
color = shade(hit)
递归光线追踪:在交点处继续发射反射/折射光线。
加速结构:
| 结构 | 构建时间 | 查询时间 |
|---|
| BVH | O(nlogn) | O(logn) |
| KD-Tree | O(nlogn) | O(logn) |
| 八叉树 | O(n) | O(logn) |
蒙特卡洛方法求解渲染方程:
Lo(p,ωo)=Le(p,ωo)+∫Ω+fr(p,ωi,ωo)Li(p,ωi)(n⋅ωi)dωi
通过采样估计积分:
Lo≈Le+N1∑i=1Np(ωi)frLi(n⋅ωi)
收敛速度:O(1/N)