画家算法(Painter's Algorithm)

从后到前绘制,覆盖帧缓冲区

屏幕截图 2025-01-24 165601.webp

不同的绘制顺序,可能会产生不同的结果

此外,需要对深度进行排序(n 个三角形需要 O(nlogn)),存在无法解决的深度值顺序问题

屏幕截图 2025-01-24 170850.webp

Z-Buffer

介绍

  • 存储每个采样点(像素)当前的 min z-value

  • 需要额外的 buffer 存储深度值

    • frame buffer 存储 color values

    • depth buffer(z-buffer)存储 depth

主要点:为了简化理解,我们假设 z 总是正数(z 越小,表示越近,z越大,表示越远)

屏幕截图 2025-01-24 171434.webp

伪代码

屏幕截图 2025-01-24 172111.webp

同时更新 framebuffer 和 zbuffer

例子

屏幕截图 2025-01-24 172235.webp

R 表示无穷大

复杂度

O(n) :遍历 n 个三角形(每个三角形假设是常数覆盖)

不需要考虑三角形绘制顺序,可以用 GPUs 实现

Shading

对不同物体应用不同材质的过程

Blinn-Phong Reflectance Model

基本概念

1-vpsq.webp

Specular highlights:高光

Diffuse reflection:漫反射

Ambient lighting:环境光

局部 Shading

2-oyhy.webp

在特定的 shading point,计算光反射到 camera

  • 法线,\vec{n}

  • 观测方向,\vec{v}

  • 光照方向,\vec{l}

  • 表面参数,(color, shininess, ...)

都是单位向量

3-vfab.webp

shading 不等于 shadow,shading 不会生成阴影

漫发射

光在各个方向均匀地散射,从任意观测方向看表面颜色是相同的

4_1.webp

Lambert's cosine law

单位面积有多少光被接收?

5-jnnu.webp

立方体的表面接收一定量的光

6-hfau.webp

60^o旋转立方体,顶面拦截一半的光

7-cwwq.webp

通常情况下,单位面积的光与cos\theta = \vec{l} \cdot \vec{n}成正比

Light Falloff

8-fixm.webp

Lambertian(Diffuse) Shading

9-ythl.webp

Shading 独立于观察方向

L_d = k_d(\vec{I}/r^2)max(0,\vec{n}\cdot\vec{l})

L_d:漫发射光

k_d:漫反射系数(color),表示反射率,即有多少光会被反射

r:光源到 shading point 的距离

max(0, \vec{n}\cdot\vec{l}):有多少光可以到达 shading point