屏幕空间与实时效果 · source map
← 回到对应自由实验状态 光不是撞到皮肤就立刻弹回来:代码定位
这里显示课程实际引用的代码片段。先看每段在说人话,再回到实验验证它对画面的影响。
循环采样剖面,再把它平均成可用的传播量。
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;
}
即使扩散看起来漂亮,也要给异常能量留出可见的排查通道。
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;