跳到主要内容
sss-light-transport · 代码
查看代码目录
屏幕空间与实时效果 · source map

光不是撞到皮肤就立刻弹回来:代码定位

这里显示课程实际引用的代码片段。先看每段在说人话,再回到实验验证它对画面的影响。

← 回到对应自由实验状态
SSS 扩散剖面

循环采样剖面,再把它平均成可用的传播量。

src/lib/lab/rendering-effects/effects-source.ts · section sss

当前起点查看这段精确实现
// SECTION:sss
float sssProfile(float radius, int samples, float thickness) {
  float diffusion = 0.0;
  for (int i = 0; i < samples; i++) {
    diffusion += profile(radius, thickness, float(i) / float(samples));
  }
  return diffusion / float(samples);
}
质量降级的体积对照

天气体积和 SSS 一样,都要把步数乘进预算,而不是只看最终颜色。

src/lib/lab/rendering-effects/effects-source.ts · section volume

按需展开查看这段精确实现
// SECTION:volume
for (int step = 0; step < volumeSteps; step++) {
  float density = sampleNoise(rayPosition, noiseOctaves);
  transmittance *= exp(-density * stepLength);
  radiance += transmittance * density * exposure;
  rayPosition += rayDirection * stepLength;
}
数值安全 debug

即使扩散看起来漂亮,也要给异常能量留出可见的排查通道。

src/lib/lab/rendering-effects/effects-source.ts · section overflow

按需展开查看这段精确实现
// SECTION:overflow
float3 safeRadiance = clampHdr ? min(radiance, maxHdr) : radiance;
debugColor = any(isnan(safeRadiance)) || max(safeRadiance) > maxHdr
  ? float3(1.0, 0.1, 0.1)
  : safeRadiance;