Computational Graphics - THU Spring 2018

August 14, 2026 · View on GitHub

HW1(10')

实现一个感兴趣的光栅图形学算法

基本选题加分项
画线(6')SSAA(2'), Kernel(2'), 区域采样(2'), 相交线反走样的case(4')
画弧(8')同上
区域填充(10')边界反走样(2')

Result

图太丑了而且这个作业也很trivial就不放图了

HW2(60')

参数曲线/曲面的三维造形与渲染

  • 利用参数曲线/曲面凹一个造型
  • 渲染
    • 基本:光线与参数曲线/曲面的求交
    • 其他:光子映射,加速,纹理景深,体积光等等

Scoring

占总评60分,按以下算法得出分值后,和全班一起归一化到70~100作为单项成绩。(负分倒扣, BUG倒扣)

基本功能完整性[-20, 0]: 光线跟踪基本结果,反射折射阴影
实现网格化求交: [-5]	
实现参数曲面求交: [0, 10]: 解方程请写出求解过程,其他请写出迭代过程
算法选型[0, 40]: 需要实现对应效果才为有效
参考基准: PT: 15, DRT: 25, PM: 30, PPM: 30.
DRT请在报告中注明使用的函数
加速[0, 10]: 算法型加速为有效
OpenMP: 2, GPU: 5
景深/软阴影/锯齿/贴图等[0,5]
主观分[-10, 10]: 设计和构图
其他额外效果: 凹凸贴图、体积光等: [5, ?]

代码基于 smallpt,实现了 CPU/CUDA 路径追踪(PT)、随机渐进式光子映射(SPPM),以及新的路径自适应 Guided Hybrid SPPM。花瓶和玻璃球场景均在 master,通过 --scene vase / --scene balls 切换。课程报告见 hw2/report.pdf

实现内容

  • 同时支持 CPU 与 CUDA backend,以及 PT、SPPM、Hybrid SPPM 和路径自适应 Hybrid SPPM。
  • 保留原始花瓶和玻璃球的构图、颜色、旋转 Bezier 曲面、彩色纹理、镜面反射、玻璃折射与焦散。
  • 支持景深、软阴影、抗锯齿、贴图、凹凸贴图、PBR、色散、体积光和体渲染,均通过参数显式开启。
  • 根据实际几何、材质和光路统计自适应采样,不依赖场景名称、物体位置、固定颜色或贴图文件名。

直接渲染结果

以下均为 3840×2160 原生 4K 直接渲染,仅将 PPM 无损转换成 PNG,没有调色、改曝光或后期修图。

花瓶:

花瓶场景:原生 4K 路径自适应 Hybrid SPPM 直接渲染

Balls:

Balls 场景:原生 4K 路径自适应 Hybrid SPPM 直接渲染

新算法:路径自适应 Guided Hybrid SPPM

传统 PT 容易浪费大量样本寻找光源和焦散;传统 SPPM 擅长处理焦散,但有限光子半径会模糊高光、镜面倒影和材质边界。新算法将光传输积分按实际路径类型拆分:

Lo=Ldiffuse,SPPM+Lspecular,PT+Ldirect,NEE.L_o=L_{\mathrm{diffuse,SPPM}}+L_{\mathrm{specular,PT}}+L_{\mathrm{direct,NEE}}.

  1. 按路径选择估计器。 漫反射和焦散交给 GPU 光子映射;镜面、玻璃和折射独立使用 PT;可见面积光通过 next-event estimation 直接采样。BSDF 和菲涅耳分支都保留正确概率补偿,因此清晰高光与倒影不会混进光子半径。
  2. 减少无效采样。 对光源功率、材质分支和四维光子发射进行随机化低差异分层;低贡献光子使用带权重补偿的 Russian roulette 提前终止;平面光子查询从 27 个哈希格减少到 9 个。
  3. 在原生分辨率复用兼容照明。 光子半径随分辨率缩小。漫反射先分离纹理反照率,再依据几何位置、法线、材质、实际辐亮度和镜面/折射事件频率复用辐照度,保留纹理、高光、玻璃和镜面细节。
  4. 用独立 PT 样本纠正缓存偏差。 每个像素先以独立 pilot 决定采样预算,再使用另一批原生分辨率 PT 路径估计缓存残差;物体轮廓和纹理、材质边界直接回退到像素自己的光路:

L^=C+Ucompatible[PC].\hat L=C+\mathcal U_{\mathrm{compatible}}[P-C].

其中 CC 是辐照度缓存,PP 是同一像素位置的 PT 估计,U\mathcal U 仅复用几何和光路行为相容的残差。独立 PT 路径本身无偏;有限光子半径与空间复用仍存在偏差—方差折中,因此不能把最终图像称为完全无偏。

实现见 hw2/sppm/cuda.cu,评测脚本见 hw2/sppm/benchmark.py

性能与收敛对比

原始 PT 成图来自 GitHub Releases;100000 表示每个子像素的路径采样次数。历史图片只有单个结果,且部分使用不同场景版本;噪声通过平坦区域的局部高频残差估计,不能等同于多随机种子的实测 RMS。

场景原始 PT 成图分辨率每子像素采样单图噪声估计
花瓶nomosaic_16k.png7680×43201000000.215
花瓶vase_4k_10w.png3840×21601000000.239
Ballsball_new_10w.png3840×21601000000.477
Ballsball_raw.png3840×2160未记录0.287

下面所有算法都使用一张 NVIDIA H200 实测。随机噪声 σ\sigma 由独立随机种子估计;系统性偏差 bb 对比同场景高采样 PT 参考图;综合误差为 σ2+b2\sqrt{\sigma^2+b^2}。GPU 时间只统计 CUDA kernel。

3840×2160 原生 4K:

场景算法采样 / 轮次GPU 时间随机噪声 σ\sigma系统偏差 bb综合误差
花瓶PT128 / 子像素74.428 s17.175
花瓶SPPM16 轮95.526 s2.684
花瓶Guided Hybrid16 轮268.420 s0.636
花瓶路径自适应 Hybrid24 轮41.697 s0.292
BallsPT128 / 子像素37.225 s12.2581.00412.299
BallsPT1024 / 子像素314.161 s4.2360.0244.236
BallsSPPM16 轮69.789 s4.0701.4754.329
BallsGuided Hybrid16 轮116.867 s0.7231.6171.771
Balls路径自适应 Hybrid24 轮74.196 s0.4600.2650.531
Balls路径自适应 Hybrid HQ24 轮119.768 s0.3500.2400.424
Balls路径自适应 Hybrid Ultra24 轮208.575 s0.2920.2340.374

普通 SPPM 使用 0.12 的光子半径,与新算法自动选择的 4K 半径一致。花瓶的新算法比 PT 快 1.78 倍、比普通 SPPM 快 2.29 倍,噪声分别降低 58.82 倍9.19 倍。Balls 标准档比 1024 spp 的 PT 快 4.23 倍、噪声降低 9.21 倍;比普通 SPPM 多花 6.3% 时间,但综合误差从 4.329 降至 0.531。完整数据见 docs/render/convergence-4k.csv

4K 渲染随机噪声与物理偏差收敛曲线

无偏 PT 参考与不同 Hybrid SPPM 结果的局部对照

640×360,16 轮,四个独立随机种子;PT 对应每子像素 128 次采样:

场景算法GPU 时间随机噪声 RMS
花瓶PT2.429 s17.615
花瓶SPPM1.581 s3.699
花瓶Hybrid SPPM3.527 s2.073
花瓶Guided Hybrid SPPM2.587 s1.800
BallsPT1.078 s12.447
BallsSPPM1.341 s5.901
BallsHybrid SPPM2.291 s1.379
BallsGuided Hybrid SPPM1.367 s0.952

同场景直接渲染效果,960×540:

算法花瓶Balls
PT花瓶 PTBalls PT
SPPM花瓶 SPPMBalls SPPM
Guided Hybrid SPPM花瓶 Guided HybridBalls Guided Hybrid

编译与运行

CUDA backend:

nvidia-smi
nvcc --version
cd hw2/sppm

# H100 / H200;A100 使用 sm_80,RTX 4090 使用 sm_89。
nvcc -O3 -arch=sm_90 -std=c++17 cuda.cu -o render-cuda

# 原生 4K 花瓶。
./render-cuda 3840 2160 vase-cache-4k.ppm 24 16 .5 1 \
  --scene vase --nearest --shadow-samples 3 \
  --hybrid-samples 64 --reconstruction-radius 4 --cache

# 原生 4K Balls;与上面的直接渲染图使用相同参数。
./render-cuda 3840 2160 balls-cache-4k.ppm 24 8 .5 1 \
  --scene balls --nearest --hybrid-samples 1536 \
  --reconstruction-radius 4 --cache

Balls 的 --hybrid-samples 改为 1925761536,分别对应标准、HQ 和 Ultra 档。程序按当前工作目录加载贴图;多卡机器可使用 CUDA_VISIBLE_DEVICES=0 指定 GPU。

CPU backend:

cd hw2/sppm
# macOS 可先安装 Homebrew GCC,再使用 /opt/homebrew/bin/g++-15。
g++ -O3 -fopenmp main.cpp -o render
./render 640 480 vase-cpu.ppm 32 --scene vase
./render 640 480 balls-cpu.ppm 32 --scene balls

常用功能参数:

功能参数
场景与纹理--scene vase / --scene balls--nearest
路径自适应 Hybrid--cache --hybrid-samples 192 --reconstruction-radius 4
景深--aperture .8 --focus 205
软阴影--shadow-samples 4 --light-radius 18
抗锯齿--aa 3
凹凸贴图--bump 2
PBR--pbr --roughness .35 --metallic .2
色散--dispersion .06
体积光--medium-density .004 --medium-albedo .8 --anisotropy .5
体渲染--volume-density .1 --volume-step 1 --volume-emission .5
自定义相机--camera-origin X,Y,Z --camera-direction X,Y,Z

体积光和体渲染不会默认开启;复现原始场景时也不要添加 --cinematic

复现 4K 评测:

python3 -m pip install numpy Pillow scipy matplotlib
python3 benchmark.py --binary ./render-cuda \
  --algorithms pt,sppm --iterations 16 --seeds 0,1,2,3 --photon-radius .12 \
  --width 3840 --height 2160 --gpus 0 --output /tmp/sppm-4k-baselines
python3 benchmark.py --binary ./render-cuda \
  --algorithms cache,cache_hq,cache_ultra --iterations 24 \
  --seeds 0,1,2,3 --width 3840 --height 2160 --gpus 0 \
  --output /tmp/sppm-4k-hybrid

添加 --reference balls=/path/to/converged-balls-pt.png 可以同时计算相对于高采样 PT 参考图的系统偏差。

PS:别只抄我构图,这里有一堆:https://graphics.cs.utah.edu/trc

HW3(30')

图像大作业

  1. 基于优化的图像彩色化 Colorization Using Optimization, SIGGRAPH 2004.
  2. 内容敏感的图像缩放 Seam Carving for Content-Aware Image Resizing, SIGGRAPH 2007.
  3. 无缝图像拼接 Coordinates for Instant Image Cloning, SIGGRAPH 2009.

此处选了第三个选题,实现了MVC和Poisson Image Editing两种算法

Result

hw3/MVC/pic/2_6.png

Other Result

MashPlant

Please refer to https://github.com/MashPlant/computational_graphics_2019 for more details.

LICENSE

本项目基于Graphics A+ LICENSE,属于MIT LICENSE的一个延伸。

使用或者参考本仓库代码的时候,在遵循MIT LICENSE的同时,需要同时遵循以下两条规则:

  1. 如果您有效果图,则必须将效果图的链接加入到这个README中,可以以PR或者ISSUE的方式让本仓库拥有者获悉;

  2. 如果您在《计算机图形学基础》或者《高等计算机图形学》中拿到了A+的成绩,则必须请本仓库拥有者吃饭。