基于 Kaolin 的 SDS + SDF 学习路径(偏工程)
目标:从 0 到 1,真正跑通并理解
Camera Sampling
→ Ray Generation
→ SDF Evaluation
→ Ray Marching / Surface Hit
→ Differentiable Rendering
→ SDS Loss
→ Backprop 更新 SDF
核心框架选型:Kaolin + PyTorch + 外部 Diffusion
阶段 0:建立完整心智模型(不要跳过)
目标
在动手前,脑中必须存在完整梯度闭环,而不是“模块拼接感”。
必须掌握
- SDF 是连续几何的 zero-level set,不是 mesh
- Ray-based rendering 是梯度通道,而非显示工具
- SDS 是“借用 2D 扩散模型的 score”,不是监督 loss
阶段产出:
能在纸上画出:SDF → image → SDS → ∂θ 的完整路径
阶段 1:Camera 与 Ray Sampling(与 AI 无关)
目标
自己实现一套相机采样 + 像素射线生成代码。
必须掌握
- Camera extrinsic / intrinsic
- World → Camera → Ray
- 随机视角采样的必要性(防止形状坍缩)
工程要求
Input : camera pose + intrinsics
Output: rays_o (N,3), rays_d (N,3)
阶段产出:
一个独立的 camera.py,不依赖 Kaolin
阶段 2:SDF 网络与几何约束
目标
构建可被优化的连续 SDF 表示。
必须掌握
- SDF MLP(x → sdf(x))
- Positional Encoding(可选)
- Eikonal Loss:||∇SDF|| ≈ 1
工程要点
loss_eikonal = (||∇sdf|| - 1)^2
阶段产出:
一个稳定输出 signed distance 的 SDF 网络
阶段 3:基于 Kaolin 的 Ray Marching
目标
打通Ray → SDF → Surface Hit → Gradient。
Kaolin 使用点
- SDF-based ray tracing / sphere tracing
- 命中点与 SDF 参数的可微关系
关键理解
渲染结果是否好看不重要,梯度是否稳定才重要。
阶段产出:
能稳定返回 hit points + normals,并可反传
阶段 4:Differentiable Rendering(极简)
目标
生成可送入 Diffusion 的 image tensor。
推荐最小渲染
- Silhouette(alpha)
- Normal-based shading
- 单通道或 RGB
注意
SDS 不需要 photorealism,只需要语义可识别结构。
阶段产出:
render(points, normals) → image
阶段 5:SDS Loss 接入(关键阶段)
目标
让 2D 扩散模型的 score 成为 3D SDF 的优化信号。
必须掌握
- timestep 采样
- noise schedule
- SDS 权重调度
梯度路径
SDS loss
→ image
→ hit points
→ sdf(x)
→ SDF parameters
阶段产出:
loss.backward() 后,SDF 参数发生有意义变化
阶段 6:稳定性与工程化
必须处理的问题
- 形状 hollow / blob
- 拓扑崩坏
- 多视角一致性
工程手段
- Camera sampling 扩展
- SDF 正则项权重控制
- SDS 强度分阶段开启
阶段产出:
一个可重复生成、可 debug 的 SDS + SDF 系统
最终能力检验
- 你能否快速判断:形状问题来自采样 / 渲染 / SDS?
- 你是否可以替换 Diffusion 而不动渲染?
- 你是否理解:SDS 为什么不是监督 loss?
如果三者答案都是“是”,说明你已经真正掌握这条路径。