@meimu/mutracer 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +3525 -3484
- package/docs/materials.md +27 -7
- package/docs/threejs.md +13 -2
- package/docs/viewer.md +53 -0
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/MaterialTable.d.ts +1 -0
- package/lib/renderer/MaterialTable.js +2 -1
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
- package/lib/renderer/WGPURayTraceOutput.js +14 -12
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.js +2 -2
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +20 -18
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.js +3 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
- package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
- package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +32 -32
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
- package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +128 -128
- package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
- package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
- package/lib/renderer/lightsUtil.js +1 -1
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +5 -0
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/materialLayout.js +2 -1
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +4 -2
- package/lib/renderer/prepareMeshBVH.js +44 -20
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +376 -379
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +122 -117
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +13 -13
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
- package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/OpenPBRMaterial.d.ts +4 -2
- package/lib/scene/OpenPBRMaterial.js +4 -2
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/openPbrSchema.d.ts +7 -2
- package/lib/scene/openPbrSchema.js +2 -1
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +1 -0
- package/lib/util/fromTHREE.js +24 -6
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +5 -4
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Direct_Lighting.html#EstimatingtheDirectLightingIntegral
|
|
3
3
|
import { glsl } from '../../shader.js';
|
|
4
4
|
export default glsl `
|
|
5
|
-
vec3
|
|
6
|
-
float
|
|
7
|
-
vec3
|
|
5
|
+
vec3 mJ(ad si, J mat, ag prepared, inout Path aa, vec3 ffnormal, bool gy) {
|
|
6
|
+
float mt = 1.0;
|
|
7
|
+
vec3 lc = vec3(fk(cw(LIGHT_POSITION)), dz(cw(LIGHT_SELECT)));
|
|
8
8
|
|
|
9
9
|
LightSampleRec lightSample;
|
|
10
|
-
sampleLight(si.position,
|
|
10
|
+
sampleLight(si.position, lc, lightSample, false);
|
|
11
11
|
lightSample.emission = ai(lightSample.emission, bf);
|
|
12
12
|
|
|
13
13
|
vec3 lightDir = lightSample.direction;
|
|
14
|
-
vec3
|
|
14
|
+
vec3 oK = -aa.ray.d;
|
|
15
15
|
float fd = lightSample.pdf;
|
|
16
16
|
|
|
17
17
|
|
|
@@ -19,7 +19,7 @@ float fd = lightSample.pdf;
|
|
|
19
19
|
|
|
20
20
|
float cosThetaL = dot(ffnormal, lightDir);
|
|
21
21
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
22
|
-
if (
|
|
22
|
+
if (gy && mat.coatNormalEnabled) { cosThetaL = dot(mat.geometricNormal, lightDir); }
|
|
23
23
|
#endif
|
|
24
24
|
|
|
25
25
|
if (fd <= 0.0 || max(max(lightSample.emission.x, lightSample.emission.y), lightSample.emission.z) <= 0.0) {
|
|
@@ -28,7 +28,7 @@ return vec3(0.0);
|
|
|
28
28
|
|
|
29
29
|
float scatteringPdf = 0.0;
|
|
30
30
|
vec3 f = vec3(0.0);
|
|
31
|
-
if (
|
|
31
|
+
if (gy) {
|
|
32
32
|
if (cosThetaL <= 0.0 && mat.transmissionWeight <= 0.0 && mat.subsurfaceWeight <= 0.0) {
|
|
33
33
|
return vec3(0.0);
|
|
34
34
|
}
|
|
@@ -36,7 +36,7 @@ f = bI(prepared, lightDir, scatteringPdf);
|
|
|
36
36
|
}
|
|
37
37
|
else {
|
|
38
38
|
scatteringPdf = bD(
|
|
39
|
-
dot(
|
|
39
|
+
dot(oK, lightDir),
|
|
40
40
|
si.mediumAnisotropy
|
|
41
41
|
);
|
|
42
42
|
f = vec3(scatteringPdf);
|
|
@@ -46,9 +46,9 @@ if (scatteringPdf <= 0.0 || max(max(f.x, f.y), f.z) <= 0.0) {
|
|
|
46
46
|
return vec3(0.0);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
Ray
|
|
50
|
-
vec3
|
|
51
|
-
if (
|
|
49
|
+
Ray mp;
|
|
50
|
+
vec3 hd = si.position + EPS * lightDir;
|
|
51
|
+
if (gy) {
|
|
52
52
|
const float bZ = 0.1;
|
|
53
53
|
float dr = dot(si.normal, lightDir);
|
|
54
54
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
@@ -56,26 +56,26 @@ if (mat.coatNormalEnabled) { dr = dot(si.faceNormal, lightDir); }
|
|
|
56
56
|
#endif
|
|
57
57
|
vec3 geometricNormal = dr < 0.0 ? -si.faceNormal : si.faceNormal;
|
|
58
58
|
dr = abs(dr);
|
|
59
|
-
float
|
|
60
|
-
float
|
|
59
|
+
float hO = dot(geometricNormal, lightDir);
|
|
60
|
+
float ot = dr < bZ
|
|
61
61
|
? clamp(
|
|
62
|
-
2.0 - (
|
|
62
|
+
2.0 - (hO + dr) / bZ,
|
|
63
63
|
0.0,
|
|
64
64
|
1.0
|
|
65
65
|
)
|
|
66
|
-
: clamp(1.0 -
|
|
67
|
-
|
|
66
|
+
: clamp(1.0 - hO / bZ, 0.0, 1.0);
|
|
67
|
+
hd += si.shadowOffset * ot;
|
|
68
68
|
}
|
|
69
|
-
iw(
|
|
70
|
-
if (ex(
|
|
69
|
+
iw(mp, hd, lightDir);
|
|
70
|
+
if (ex(mp, lightSample.dist - EPS, si.triangleIndex)) {
|
|
71
71
|
return vec3(0.0);
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
#ifdef USE_ENVMAP
|
|
75
75
|
|
|
76
76
|
|
|
77
|
-
if (
|
|
78
|
-
vec4 background =
|
|
77
|
+
if (gy && cosThetaL < 0.0 && lc.z < envLightSelectionPmf) {
|
|
78
|
+
vec4 background = cx(mp.o, lightDir);
|
|
79
79
|
lightSample.emission = ai(background.rgb * background.a, bf);
|
|
80
80
|
}
|
|
81
81
|
#endif
|
|
@@ -84,45 +84,45 @@ lightSample.emission = ai(background.rgb * background.a, bf);
|
|
|
84
84
|
|
|
85
85
|
float eW = lightSample.isDelta
|
|
86
86
|
? 1.0
|
|
87
|
-
:
|
|
87
|
+
: aG(fd, scatteringPdf);
|
|
88
88
|
return eW > 0.0
|
|
89
89
|
? eW * lightSample.emission * f / fd
|
|
90
90
|
: vec3(0.0);
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
94
|
-
vec3 fB(vec3
|
|
95
|
-
bool
|
|
96
|
-
vec3
|
|
97
|
-
vec3
|
|
98
|
-
if (dot(
|
|
99
|
-
return
|
|
94
|
+
vec3 fB(vec3 po, vec3 th, vec3 view) {
|
|
95
|
+
bool qQ = dot(th, view) >= 0.0;
|
|
96
|
+
vec3 uh = qQ ? th : -th;
|
|
97
|
+
vec3 qP = qQ ? po : -po;
|
|
98
|
+
if (dot(po, th) <= 0.0 || dot(qP, view) <= 1e-6) { return uh; }
|
|
99
|
+
return qP;
|
|
100
100
|
}
|
|
101
101
|
#endif
|
|
102
|
-
void
|
|
103
|
-
vec3
|
|
102
|
+
void lR(inout ad si, J mat, inout Path aa) {
|
|
103
|
+
vec3 uj = vec3(fk(cw(BSDF_DIRECTION)), dz(cw(BSDF_LOBE)));
|
|
104
104
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
105
105
|
vec3 bC = si.faceNormal;
|
|
106
|
-
vec3
|
|
106
|
+
vec3 mv = si.normal;
|
|
107
107
|
#endif
|
|
108
|
-
float
|
|
109
|
-
float
|
|
108
|
+
float rF = -dot(si.faceNormal, aa.ray.d);
|
|
109
|
+
float sw = -dot(si.normal, aa.ray.d);
|
|
110
110
|
if ((mat.transmissionWeight > 0.0 || mat.subsurfaceWeight > 0.0) && mat.thinWalled) {
|
|
111
111
|
|
|
112
|
-
if (
|
|
112
|
+
if (rF < 0.0) {
|
|
113
113
|
si.faceNormal = -si.faceNormal;
|
|
114
|
-
|
|
114
|
+
rF = -rF;
|
|
115
115
|
}
|
|
116
|
-
if (
|
|
116
|
+
if (sw < 0.0) {
|
|
117
117
|
si.normal = -si.normal;
|
|
118
|
-
|
|
118
|
+
sw = -sw;
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
|
|
123
|
-
bool
|
|
124
|
-
float ndv =
|
|
125
|
-
vec3 normal =
|
|
123
|
+
bool pM = rF >= 0.0 && sw < 0.0;
|
|
124
|
+
float ndv = pM ? rF : sw;
|
|
125
|
+
vec3 normal = pM ? si.faceNormal : si.normal;
|
|
126
126
|
|
|
127
127
|
mat.inside = ndv <= 0.0 && !mat.thinWalled;
|
|
128
128
|
|
|
@@ -133,7 +133,7 @@ if (mat.coatNormalEnabled) {
|
|
|
133
133
|
vec3 view = -aa.ray.d;
|
|
134
134
|
float fW = dot(bC, view);
|
|
135
135
|
mat.geometricNormal = fW >= 0.0 ? bC : -bC;
|
|
136
|
-
ffnormal = fB(
|
|
136
|
+
ffnormal = fB(mv, bC, view);
|
|
137
137
|
mat.coatNormal = fB(si.coatNormal, bC, view);
|
|
138
138
|
mat.inside = fW <= 0.0 && !mat.thinWalled;
|
|
139
139
|
mat.relativeIor = (fW > 0.0 || mat.thinWalled) ? 1.0 / mat.specularIor : mat.specularIor;
|
|
@@ -142,7 +142,7 @@ mat.relativeIor = (fW > 0.0 || mat.thinWalled) ? 1.0 / mat.specularIor : mat.spe
|
|
|
142
142
|
|
|
143
143
|
|
|
144
144
|
float scatteringPdf;
|
|
145
|
-
vec3
|
|
145
|
+
vec3 cG;
|
|
146
146
|
aa.scatteringIsDelta = false;
|
|
147
147
|
bool bl = false;
|
|
148
148
|
bool hj = false;
|
|
@@ -151,49 +151,49 @@ ag prepared;
|
|
|
151
151
|
#ifdef HAS_MEDIUM
|
|
152
152
|
int mediumType = si.mediumType;
|
|
153
153
|
float d = distance(si.position, aa.ray.o);
|
|
154
|
-
vec3
|
|
154
|
+
vec3 nh = aa.ray.o;
|
|
155
155
|
vec3 extinction = si.mediumExtinction;
|
|
156
156
|
vec3 scattering = min(si.mediumScattering, extinction);
|
|
157
|
-
float
|
|
158
|
-
if (mediumType > 0 &&
|
|
157
|
+
float sr = max(max(extinction.x, extinction.y), extinction.z);
|
|
158
|
+
if (mediumType > 0 && sr > 0.0) {
|
|
159
159
|
|
|
160
160
|
|
|
161
161
|
|
|
162
162
|
|
|
163
|
-
int
|
|
164
|
-
float fA = extinction[
|
|
165
|
-
float
|
|
166
|
-
? min(-log(max(dz(
|
|
163
|
+
int mW = min(int(dz(cw(MEDIUM_CHANNEL)) * 3.0), 2);
|
|
164
|
+
float fA = extinction[mW];
|
|
165
|
+
float ib = fA > 0.0
|
|
166
|
+
? min(-log(max(dz(cw(MEDIUM_DISTANCE)), 1e-7)) / fA, d)
|
|
167
167
|
: d;
|
|
168
|
-
bl =
|
|
169
|
-
vec3 ew = exp(-extinction *
|
|
170
|
-
vec3
|
|
168
|
+
bl = ib < d;
|
|
169
|
+
vec3 ew = exp(-extinction * ib);
|
|
170
|
+
vec3 nP = bl
|
|
171
171
|
? extinction * ew
|
|
172
172
|
: ew;
|
|
173
|
-
float
|
|
174
|
-
(
|
|
173
|
+
float nA = max(
|
|
174
|
+
(nP.x + nP.y + nP.z) / 3.0,
|
|
175
175
|
1e-8
|
|
176
176
|
);
|
|
177
177
|
if (bl) {
|
|
178
|
-
aa.beta *= ew * scattering /
|
|
178
|
+
aa.beta *= ew * scattering / nA;
|
|
179
179
|
|
|
180
|
-
aa.ray.o =
|
|
180
|
+
aa.ray.o = nh + ib * aa.ray.d;
|
|
181
181
|
si.position = aa.ray.o;
|
|
182
|
-
aa.li +=
|
|
182
|
+
aa.li += mJ(si, mat, prepared, aa, ffnormal, false) * aa.beta;
|
|
183
183
|
|
|
184
184
|
|
|
185
|
-
|
|
185
|
+
cG = fl(
|
|
186
186
|
-aa.ray.d,
|
|
187
187
|
si.mediumAnisotropy,
|
|
188
|
-
fk(
|
|
188
|
+
fk(cw(PHASE_DIRECTION))
|
|
189
189
|
);
|
|
190
190
|
scatteringPdf = bD(
|
|
191
|
-
dot(
|
|
191
|
+
dot(cG, -aa.ray.d),
|
|
192
192
|
si.mediumAnisotropy
|
|
193
193
|
);
|
|
194
194
|
}
|
|
195
195
|
else {
|
|
196
|
-
aa.beta *= ew /
|
|
196
|
+
aa.beta *= ew / nA;
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
#endif
|
|
@@ -205,22 +205,22 @@ if (mat.materialType == UNLIT) {
|
|
|
205
205
|
aa.abort = true;
|
|
206
206
|
return;
|
|
207
207
|
}
|
|
208
|
-
vec3
|
|
208
|
+
vec3 pK = vec3(0.0);
|
|
209
209
|
#ifdef USE_TANGENT
|
|
210
|
-
|
|
210
|
+
pK = si.tangent;
|
|
211
211
|
#endif
|
|
212
212
|
mat.directionTangent = si.directionTangent;
|
|
213
213
|
mat.directionBitangent = si.directionBitangent;
|
|
214
214
|
mat.geometryTangent = si.geometryTangent;
|
|
215
215
|
mat.geometryBitangent = si.geometryBitangent;
|
|
216
|
-
prepared = eG(
|
|
217
|
-
aa.li +=
|
|
216
|
+
prepared = eG(pK, mat, -aa.ray.d, ffnormal);
|
|
217
|
+
aa.li += mJ(si, mat, prepared, aa, ffnormal, true) * aa.beta;
|
|
218
218
|
|
|
219
219
|
bool isNextRefraction;
|
|
220
220
|
vec3 f = dv(
|
|
221
221
|
prepared,
|
|
222
|
-
|
|
223
|
-
|
|
222
|
+
uj,
|
|
223
|
+
cG,
|
|
224
224
|
scatteringPdf,
|
|
225
225
|
isNextRefraction
|
|
226
226
|
);
|
|
@@ -232,7 +232,7 @@ prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6;
|
|
|
232
232
|
|
|
233
233
|
|
|
234
234
|
if (!(scatteringPdf > 0.0) || any(isnan(f)) || any(isinf(f)) ||
|
|
235
|
-
dot(
|
|
235
|
+
dot(cG, cG) < 0.5) {
|
|
236
236
|
aa.scatteringPdf = 0.0;
|
|
237
237
|
aa.abort = true;
|
|
238
238
|
return;
|
|
@@ -243,14 +243,14 @@ isNextRefraction;
|
|
|
243
243
|
aa.isNextRefraction = isNextRefraction;
|
|
244
244
|
|
|
245
245
|
|
|
246
|
-
aa.ray.o = si.position + EPS *
|
|
246
|
+
aa.ray.o = si.position + EPS * cG;
|
|
247
247
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
248
|
-
if (mat.coatNormalEnabled) { aa.ray.o = si.position + EPS * (dot(bC,
|
|
248
|
+
if (mat.coatNormalEnabled) { aa.ray.o = si.position + EPS * (dot(bC, cG) >= 0.0 ? bC : -bC); }
|
|
249
249
|
#endif
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
aa.scatteringPdf = scatteringPdf;
|
|
253
|
-
iw(aa.ray, aa.ray.o,
|
|
253
|
+
iw(aa.ray, aa.ray.o, cG);
|
|
254
254
|
if (bl) {
|
|
255
255
|
aa.isNextRefraction = false;
|
|
256
256
|
}
|
|
@@ -260,7 +260,7 @@ aa.fromEye = false;
|
|
|
260
260
|
|
|
261
261
|
|
|
262
262
|
if (!bl && hj && mat.mediumType > 0) {
|
|
263
|
-
if (
|
|
263
|
+
if (rF >= 0.0) {
|
|
264
264
|
si.mediumType = mat.mediumType;
|
|
265
265
|
si.mediumExtinction = mat.mediumExtinction;
|
|
266
266
|
si.mediumScattering = mat.mediumScattering;
|
|
@@ -11,33 +11,33 @@ export default glsl `
|
|
|
11
11
|
|
|
12
12
|
const uint SHADOW_CATCHER_LIGHT_SAMPLES = 4u;
|
|
13
13
|
|
|
14
|
-
uint
|
|
15
|
-
return candidate == 0u ?
|
|
14
|
+
uint ko(uint candidate, uint slot) {
|
|
15
|
+
return candidate == 0u ? cw(slot) : cw(9u + (candidate - 1u) * 3u + slot);
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
void sampleShadowCatcher(ad si, int bounce, inout Path aa) {
|
|
19
|
-
vec3
|
|
19
|
+
vec3 oK = -aa.ray.d;
|
|
20
20
|
|
|
21
21
|
#if defined(NUM_LIGHTS) || defined(USE_ENVMAP)
|
|
22
22
|
float visibility = 0.0;
|
|
23
23
|
for (uint candidate = 0u; candidate < SHADOW_CATCHER_LIGHT_SAMPLES; candidate++) {
|
|
24
24
|
LightSampleRec lightSample;
|
|
25
|
-
vec3
|
|
26
|
-
fk(
|
|
27
|
-
dz(
|
|
25
|
+
vec3 lc = vec3(
|
|
26
|
+
fk(ko(candidate, LIGHT_POSITION)),
|
|
27
|
+
dz(ko(candidate, LIGHT_SELECT))
|
|
28
28
|
);
|
|
29
|
-
sampleLight(si.position,
|
|
29
|
+
sampleLight(si.position, lc, lightSample, false);
|
|
30
30
|
|
|
31
31
|
vec3 lightDir = lightSample.direction;
|
|
32
32
|
float cosThetaL = dot(si.normal, lightDir);
|
|
33
|
-
float
|
|
34
|
-
bool
|
|
35
|
-
if (
|
|
33
|
+
float pv = dot(si.normal, oK) * cosThetaL;
|
|
34
|
+
bool mt = false;
|
|
35
|
+
if (pv >= 0.0) {
|
|
36
36
|
Ray ray;
|
|
37
37
|
iw(ray, si.position + EPS * lightDir, lightDir);
|
|
38
|
-
|
|
38
|
+
mt = ex(ray, lightSample.dist - EPS, si.triangleIndex);
|
|
39
39
|
}
|
|
40
|
-
visibility +=
|
|
40
|
+
visibility += mt ? 0.0 : 1.0;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
aa.alpha = visibility / float(SHADOW_CATCHER_LIGHT_SAMPLES);
|
|
@@ -5,28 +5,28 @@ export default glsl `
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
vec3 aQ(vec3 view, vec2 alpha, vec2 samplePoint) {
|
|
8
|
-
vec3
|
|
9
|
-
vec3
|
|
10
|
-
float
|
|
11
|
-
float
|
|
12
|
-
float
|
|
13
|
-
float
|
|
14
|
-
float
|
|
15
|
-
float fi = sqrt(max(0.0,
|
|
8
|
+
vec3 rc = vec3(alpha, 1.0);
|
|
9
|
+
vec3 gf = normalize(rc * view);
|
|
10
|
+
float ua = min(gf.z, 1.0);
|
|
11
|
+
float qH = 1.0 + ua;
|
|
12
|
+
float qX = (1.0 - samplePoint.y) * qH;
|
|
13
|
+
float rJ = samplePoint.y * qH;
|
|
14
|
+
float sA = qX + (1.0 - ua);
|
|
15
|
+
float fi = sqrt(max(0.0, sA * rJ));
|
|
16
16
|
float br = TWOPI * samplePoint.x;
|
|
17
|
-
vec3
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
vec3 lw = vec3(
|
|
18
|
+
gf.x + fi * cos(br),
|
|
19
|
+
gf.y + fi * sin(br),
|
|
20
|
+
qX
|
|
21
21
|
);
|
|
22
|
-
return normalize(
|
|
22
|
+
return normalize(rc * lw);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
float
|
|
25
|
+
float gG(vec3 od, vec2 alpha) {
|
|
26
26
|
vec3 hm = vec3(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
od.x / alpha.x,
|
|
28
|
+
od.y / alpha.y,
|
|
29
|
+
od.z
|
|
30
30
|
);
|
|
31
31
|
float ap = dot(hm, hm);
|
|
32
32
|
return 1.0 / (
|
|
@@ -39,10 +39,10 @@ float eE = abs(direction.z);
|
|
|
39
39
|
if (eE <= 1e-8) {
|
|
40
40
|
return 0.0;
|
|
41
41
|
}
|
|
42
|
-
vec2
|
|
43
|
-
float
|
|
42
|
+
vec2 hY = alpha * direction.xy;
|
|
43
|
+
float lA = dot(hY, hY)
|
|
44
44
|
/ (eE * eE);
|
|
45
|
-
return 2.0 / (1.0 + sqrt(1.0 +
|
|
45
|
+
return 2.0 / (1.0 + sqrt(1.0 + lA));
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
float aE(float au) {
|
|
@@ -50,25 +50,25 @@ float dg = clamp(1.0 - au, 0.0, 1.0);
|
|
|
50
50
|
return pow(dg, 5.0);
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
float
|
|
53
|
+
float cu(float L, float cJ) {
|
|
54
54
|
float iu = clamp(abs(L), 0.0, 1.0);
|
|
55
|
-
float
|
|
55
|
+
float ke = cJ * cJ
|
|
56
56
|
* max(0.0, 1.0 - iu * iu);
|
|
57
|
-
if (
|
|
57
|
+
if (ke >= 1.0) {
|
|
58
58
|
return 1.0;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
float
|
|
62
|
-
float ba = (iu - cJ *
|
|
63
|
-
/ max(iu + cJ *
|
|
64
|
-
float
|
|
65
|
-
/ max(cJ * iu +
|
|
61
|
+
float lK = sqrt(max(0.0, 1.0 - ke));
|
|
62
|
+
float ba = (iu - cJ * lK)
|
|
63
|
+
/ max(iu + cJ * lK, 1e-8);
|
|
64
|
+
float pw = (cJ * iu - lK)
|
|
65
|
+
/ max(cJ * iu + lK, 1e-8);
|
|
66
66
|
return 0.5 * (
|
|
67
|
-
ba * ba +
|
|
67
|
+
ba * ba + pw * pw
|
|
68
68
|
);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
vec2
|
|
71
|
+
vec2 gd(vec2 samplePoint) {
|
|
72
72
|
vec2 offset = 2.0 * samplePoint - vec2(1.0);
|
|
73
73
|
if (offset.x == 0.0 && offset.y == 0.0) {
|
|
74
74
|
return vec2(0.0);
|
|
@@ -88,35 +88,35 @@ return radius * vec2(cos(angle), sin(angle));
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
vec3 bi(vec2 samplePoint) {
|
|
91
|
-
vec2
|
|
91
|
+
vec2 kx = gd(samplePoint);
|
|
92
92
|
return vec3(
|
|
93
|
-
|
|
94
|
-
sqrt(max(0.0, 1.0 - dot(
|
|
93
|
+
kx,
|
|
94
|
+
sqrt(max(0.0, 1.0 - dot(kx, kx)))
|
|
95
95
|
);
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
float
|
|
99
|
-
float scale = max(
|
|
98
|
+
float aG(float pi, float nD) {
|
|
99
|
+
float scale = max(pi, nD);
|
|
100
100
|
if (scale <= 0.0) {
|
|
101
101
|
return 0.0;
|
|
102
102
|
}
|
|
103
|
-
vec2 normalized = vec2(
|
|
104
|
-
vec2
|
|
105
|
-
return
|
|
103
|
+
vec2 normalized = vec2(pi, nD) / scale;
|
|
104
|
+
vec2 oG = normalized * normalized;
|
|
105
|
+
return oG.x / (oG.x + oG.y);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
void
|
|
109
|
-
float
|
|
110
|
-
float dW = -1.0 / (
|
|
108
|
+
void aL(in vec3 normal, out vec3 tangent, out vec3 bitangent) {
|
|
109
|
+
float ie = normal.z >= 0.0 ? 1.0 : -1.0;
|
|
110
|
+
float dW = -1.0 / (ie + normal.z);
|
|
111
111
|
float xy = normal.x * normal.y * dW;
|
|
112
112
|
tangent = vec3(
|
|
113
|
-
1.0 +
|
|
114
|
-
|
|
115
|
-
-
|
|
113
|
+
1.0 + ie * normal.x * normal.x * dW,
|
|
114
|
+
ie * xy,
|
|
115
|
+
-ie * normal.x
|
|
116
116
|
);
|
|
117
117
|
bitangent = vec3(
|
|
118
118
|
xy,
|
|
119
|
-
|
|
119
|
+
ie + normal.y * normal.y * dW,
|
|
120
120
|
-normal.y
|
|
121
121
|
);
|
|
122
122
|
}
|
|
@@ -125,40 +125,40 @@ vec3 ai(vec3 rgb, float wavelength) {
|
|
|
125
125
|
if (wavelength == 0.0) {
|
|
126
126
|
return rgb;
|
|
127
127
|
}
|
|
128
|
-
vec3
|
|
128
|
+
vec3 tG = wavelength > 600.0
|
|
129
129
|
? vec3(1.0, 0.0, 0.0)
|
|
130
130
|
: wavelength > 500.0
|
|
131
131
|
? vec3(0.0, 1.0, 0.0)
|
|
132
132
|
: vec3(0.0, 0.0, 1.0);
|
|
133
|
-
return rgb *
|
|
133
|
+
return rgb * tG;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
float eK(
|
|
137
137
|
float wavelength,
|
|
138
|
-
float
|
|
138
|
+
float hb,
|
|
139
139
|
float hk,
|
|
140
|
-
float
|
|
140
|
+
float qk
|
|
141
141
|
) {
|
|
142
142
|
if (wavelength == 0.0 || hk <= 0.0) {
|
|
143
|
-
return
|
|
143
|
+
return hb;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
const float FRAUNHOFER_C = 656.3;
|
|
147
147
|
const float FRAUNHOFER_D = 587.6;
|
|
148
148
|
const float FRAUNHOFER_F = 486.1;
|
|
149
|
-
float
|
|
149
|
+
float jK = 1.0 / (
|
|
150
150
|
1.0 / (FRAUNHOFER_F * FRAUNHOFER_F)
|
|
151
151
|
- 1.0 / (FRAUNHOFER_C * FRAUNHOFER_C)
|
|
152
152
|
);
|
|
153
|
-
float
|
|
154
|
-
float
|
|
155
|
-
float
|
|
156
|
-
-
|
|
157
|
-
return
|
|
153
|
+
float mT = max(qk / hk, 1e-6);
|
|
154
|
+
float qI = (hb - 1.0) * jK / mT;
|
|
155
|
+
float td = hb
|
|
156
|
+
- qI / (FRAUNHOFER_D * FRAUNHOFER_D);
|
|
157
|
+
return td + qI / (wavelength * wavelength);
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
vec3 fl(
|
|
161
|
-
vec3
|
|
161
|
+
vec3 gu,
|
|
162
162
|
float anisotropy,
|
|
163
163
|
vec2 samplePoint
|
|
164
164
|
) {
|
|
@@ -167,21 +167,21 @@ if (abs(anisotropy) < 0.001) {
|
|
|
167
167
|
au = 1.0 - 2.0 * samplePoint.y;
|
|
168
168
|
}
|
|
169
169
|
else {
|
|
170
|
-
float
|
|
170
|
+
float iV = (1.0 - anisotropy * anisotropy)
|
|
171
171
|
/ (1.0 + anisotropy - 2.0 * anisotropy * samplePoint.y);
|
|
172
172
|
au = (
|
|
173
|
-
|
|
173
|
+
iV * iV - 1.0 - anisotropy * anisotropy
|
|
174
174
|
) / (2.0 * anisotropy);
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
-
float
|
|
177
|
+
float tW = sqrt(max(0.0, 1.0 - au * au));
|
|
178
178
|
float br = TWOPI * samplePoint.x;
|
|
179
179
|
vec3 tangent;
|
|
180
180
|
vec3 bitangent;
|
|
181
|
-
|
|
182
|
-
return tangent * (
|
|
183
|
-
+ bitangent * (
|
|
184
|
-
+
|
|
181
|
+
aL(gu, tangent, bitangent);
|
|
182
|
+
return tangent * (tW * cos(br))
|
|
183
|
+
+ bitangent * (tW * sin(br))
|
|
184
|
+
+ gu * au;
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
float bD(float au, float anisotropy) {
|