Skip to content

Commit 54af46e

Browse files
committed
upd
1 parent f97dad9 commit 54af46e

3 files changed

Lines changed: 53 additions & 7 deletions

File tree

content/posts/foundation/pt-6-path-tracing-adventures.md

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
author: mos9527
3-
lastmod: 2025-12-25T16:12:40.471693
3+
lastmod: 2025-12-25T16:42:35.007429
44
title: Foundation 施工笔记 【6】- 路径追踪
55
tags: ["CG","Vulkan","Foundation"]
66
categories: ["CG","Vulkan"]
@@ -1082,15 +1082,17 @@ float3 f = (Fss + Fms) * mfDistrib.D(wm) * mfDistrib.G(wo, wi) / (4 * AbsCosThet
10821082
return BSDFSample(f, wi, pdf, BxDFFlags::GlossyReflection);
10831083
```
10841084
1085-
##### 导体效果
1085+
##### 导体
10861086
1087-
一样的白炉测试效果如下。先令所有`metallic=1.0f`,即只看specular lobe:
1087+
###### 导体效果
1088+
1089+
一样的白炉测试效果如下。先令所有`metallic=1.0f`,即只看ConductorBxDF等效部分:
10881090
10891091
![image-20251225143740725](/image-foundation/image-20251225143740725.png)
10901092
10911093
(注:别忘了Sampler用CLAMP_TO_EDGE - -||)
10921094
1093-
##### 电介质表现
1095+
##### 电介质
10941096
10951097
目前为止,我们只对不存在(不考虑:导体中折射即吸收)折射贡献的BRDF做了改进。对于电介质BRDF(及metal<1),这里的工作是不够的:因为算$E$的时候并没有看「折射」后的能量问题。
10961098
@@ -1168,13 +1170,57 @@ ggxE[dot(p, uint2(1, 32))] = float2(E / samples, Eprime / samples);
11681170

11691171
###### 电介质效果
11701172

1171-
让roughness,metallic反映场景真实情况,效果如下:
1173+
ImageWorks也提到了对Diffuse lobe的调整(虽然这部分我们也讨论过了):$E\prime\prime$是补偿过的反射量,那么真正能到达底层diffuse lobe的能量即为$1-E\prime\prime$(回顾反射率关系),刚好允许我们进行正确的能量调整:漫反射一定有入射=出射,$1-E\prime\prime$则是混合glossy lobe后其正确的反照率。
1174+
1175+
至此电介质模型调整完毕,shader节选如下:
1176+
1177+
```c++
1178+
...
1179+
const float mu = AbsCosTheta(wo);
1180+
const float2 EEp = ggxLutE.SampleLevel(lutSampler, float2(mu, roughness), 0);
1181+
const float3 Epp = F0 * EEp.x + (F90 - F0) * EEp.y;
1182+
float probGlossy = NEEGlossyProb(wo);
1183+
if (uc < probGlossy) {
1184+
// Sample Glossy
1185+
if (mfDistrib.EffectivelySmooth()) {
1186+
// Dirac delta case
1187+
float3 wi = float3(-wo.x, -wo.y, wo.z); // = wr
1188+
float3 fGlossy = SchlickFresnel(F0, 1.0f, AbsCosTheta(wi));
1189+
// Sampled PDF would be delta, but we represent them as 1s w/o weighting
1190+
// With NEE this is what you get:
1191+
return BSDFSample(fGlossy / AbsCosTheta(wi), wi, 1 * probGlossy, BxDFFlags::SpecularReflection);
1192+
} else {
1193+
float3 wm = mfDistrib.Sample_wm(wo, u);
1194+
float3 wi = Reflect(wo, wm);
1195+
if (!SameHemisphere(wo, wi))
1196+
return BSDFSample(); // Absorption
1197+
1198+
float3 Fss = SchlickFresnel(F0, 1.0f, AbsDot(wo, wm));
1199+
float3 Fms = F0 * (1/Epp - 1) * Fss;
1200+
float3 f = (Fms + Fss) * mfDistrib.D(wm) * mfDistrib.G(wo, wi) / (4 * AbsCosTheta(wi) * AbsCosTheta(wo));
1201+
1202+
float pdf = probGlossy * mfDistrib.PDF(wo, wm) / (4 * AbsDot(wo, wm));
1203+
return BSDFSample(f, wi, pdf, BxDFFlags::GlossyReflection);
1204+
}
1205+
} else {
1206+
// Sample Diffuse
1207+
float3 wi = SampleCosineHemisphere(u);
1208+
wi = FaceForward(wi, float3(0,0,1));
1209+
float3 wm = normalize(wo + wi);
1210+
1211+
float3 cdiff = baseColor * (1.0f - metallic);
1212+
float3 f = (1-Epp) * cdiff * InvPi;
11721213

1173-
![image-20251225161144555](/image-foundation/image-20251225161144555.png)
1214+
float pdf = (1 - probGlossy) * CosineHemispherePDF(ClampedCosTheta(wi));
1215+
return BSDFSample(f, wi, pdf, BxDFFlags::DiffuseReflection);
1216+
}
1217+
```
11741218

1175-
TBD:中途roughness过补偿?
1219+
让metallic=0(全电介质)的效果如下:
11761220

1221+
![image-20251225163746262](/image-foundation/image-20251225163746262.png)
11771222

1223+
11781224

11791225

11801226
<h1 style="color:red">--- 施工中 ---</h1>
-148 KB
Binary file not shown.
155 KB
Loading

0 commit comments

Comments
 (0)