@meimu/mutracer 0.1.3 → 0.1.4
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 +4114 -4015
- package/docs/api.md +11 -9
- package/docs/threejs.md +30 -4
- package/lib/Engine.js +18 -1
- package/lib/Engine.js.map +1 -1
- package/lib/main.d.ts +1 -1
- package/lib/main.js.map +1 -1
- 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 +10 -4
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +6 -6
- package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
- package/lib/renderer/WGPURayTraceOutput.js +14 -14
- package/lib/renderer/WGPURayTracePass.d.ts +2 -0
- package/lib/renderer/WGPURayTracePass.js +12 -6
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +15 -15
- package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
- package/lib/renderer/WebGLRayTracePass.js +7 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/envMapCreation.d.ts +5 -1
- package/lib/renderer/envMapCreation.js +42 -5
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +1 -1
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +316 -310
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +151 -119
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +414 -414
- 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 +40 -39
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +78 -78
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
- package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +133 -133
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
- package/lib/renderer/lightsUtil.js +6 -4
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialChanges.js +1 -1
- package/lib/renderer/materialChanges.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +36 -18
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.js +2 -2
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.js +4 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLightChanges.js +3 -2
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +475 -469
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +93 -59
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
- 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 +25 -22
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +9 -3
- package/lib/scene/EnvironmentLight.js +9 -2
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/Scene.d.ts +4 -0
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SpotLight.d.ts +2 -2
- package/lib/scene/SpotLight.js +1 -1
- package/lib/scene/SpotLight.js.map +1 -1
- package/lib/scene/Texture.d.ts +17 -6
- package/lib/scene/Texture.js +13 -4
- package/lib/scene/Texture.js.map +1 -1
- package/lib/util/fromTHREE.js +151 -29
- 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 +1 -1
|
@@ -2,33 +2,33 @@
|
|
|
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 mU(ad si, J mat, ag prepared, inout Path aa, vec3 ffnormal, bool gE) {
|
|
6
|
+
float mD = 1.0;
|
|
7
|
+
vec3 ln = vec3(fo(cw(LIGHT_POSITION)), dz(cw(LIGHT_SELECT)));
|
|
8
8
|
|
|
9
9
|
LightSampleRec lightSample;
|
|
10
|
-
sampleLight(si.position,
|
|
10
|
+
sampleLight(si.position, ln, lightSample, false);
|
|
11
11
|
lightSample.emission = ai(lightSample.emission, bf);
|
|
12
12
|
|
|
13
13
|
vec3 lightDir = lightSample.direction;
|
|
14
|
-
vec3
|
|
15
|
-
float
|
|
14
|
+
vec3 oT = -aa.ray.d;
|
|
15
|
+
float fg = lightSample.pdf;
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
float cosThetaL = dot(ffnormal, lightDir);
|
|
21
21
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
22
|
-
if (
|
|
22
|
+
if (gE && mat.coatNormalEnabled) { cosThetaL = dot(mat.geometricNormal, lightDir); }
|
|
23
23
|
#endif
|
|
24
24
|
|
|
25
|
-
if (
|
|
25
|
+
if (fg <= 0.0 || max(max(lightSample.emission.x, lightSample.emission.y), lightSample.emission.z) <= 0.0) {
|
|
26
26
|
return vec3(0.0);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
float scatteringPdf = 0.0;
|
|
30
30
|
vec3 f = vec3(0.0);
|
|
31
|
-
if (
|
|
31
|
+
if (gE) {
|
|
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(oT, 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 mA;
|
|
50
|
+
vec3 hi = si.position + EPS * lightDir;
|
|
51
|
+
if (gE) {
|
|
52
52
|
const float bZ = 0.1;
|
|
53
53
|
float dr = dot(si.normal, lightDir);
|
|
54
54
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
@@ -56,73 +56,73 @@ 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 hS = dot(geometricNormal, lightDir);
|
|
60
|
+
float oC = dr < bZ
|
|
61
61
|
? clamp(
|
|
62
|
-
2.0 - (
|
|
62
|
+
2.0 - (hS + dr) / bZ,
|
|
63
63
|
0.0,
|
|
64
64
|
1.0
|
|
65
65
|
)
|
|
66
|
-
: clamp(1.0 -
|
|
67
|
-
|
|
66
|
+
: clamp(1.0 - hS / bZ, 0.0, 1.0);
|
|
67
|
+
hi += si.shadowOffset * oC;
|
|
68
68
|
}
|
|
69
|
-
|
|
70
|
-
if (ex(
|
|
69
|
+
iC(mA, hi, lightDir);
|
|
70
|
+
if (ex(mA, 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 = cx(
|
|
77
|
+
if (gE && cosThetaL < 0.0 && ln.z < envLightSelectionPmf) {
|
|
78
|
+
vec4 background = cx(mA.o, lightDir);
|
|
79
79
|
lightSample.emission = ai(background.rgb * background.a, bf);
|
|
80
80
|
}
|
|
81
81
|
#endif
|
|
82
82
|
|
|
83
83
|
|
|
84
84
|
|
|
85
|
-
float
|
|
85
|
+
float fa = lightSample.isDelta
|
|
86
86
|
? 1.0
|
|
87
|
-
: aG(
|
|
88
|
-
return
|
|
89
|
-
?
|
|
87
|
+
: aG(fg, scatteringPdf);
|
|
88
|
+
return fa > 0.0
|
|
89
|
+
? fa * lightSample.emission * f / fg
|
|
90
90
|
: vec3(0.0);
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
94
|
-
vec3
|
|
95
|
-
bool
|
|
96
|
-
vec3
|
|
97
|
-
vec3
|
|
98
|
-
if (dot(
|
|
99
|
-
return
|
|
94
|
+
vec3 fE(vec3 pG, vec3 tq, vec3 view) {
|
|
95
|
+
bool qY = dot(tq, view) >= 0.0;
|
|
96
|
+
vec3 uo = qY ? tq : -tq;
|
|
97
|
+
vec3 qX = qY ? pG : -pG;
|
|
98
|
+
if (dot(pG, tq) <= 0.0 || dot(qX, view) <= 1e-6) { return uo; }
|
|
99
|
+
return qX;
|
|
100
100
|
}
|
|
101
101
|
#endif
|
|
102
|
-
void
|
|
103
|
-
vec3
|
|
102
|
+
void mc(inout ad si, J mat, inout Path aa) {
|
|
103
|
+
vec3 ur = vec3(fo(cw(BSDF_DIRECTION)), dz(cw(BSDF_LOBE)));
|
|
104
104
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
105
105
|
vec3 bC = si.faceNormal;
|
|
106
|
-
vec3
|
|
106
|
+
vec3 mF = si.normal;
|
|
107
107
|
#endif
|
|
108
|
-
float
|
|
109
|
-
float
|
|
108
|
+
float rN = -dot(si.faceNormal, aa.ray.d);
|
|
109
|
+
float sG = -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 (rN < 0.0) {
|
|
113
113
|
si.faceNormal = -si.faceNormal;
|
|
114
|
-
|
|
114
|
+
rN = -rN;
|
|
115
115
|
}
|
|
116
|
-
if (
|
|
116
|
+
if (sG < 0.0) {
|
|
117
117
|
si.normal = -si.normal;
|
|
118
|
-
|
|
118
|
+
sG = -sG;
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
|
|
123
|
-
bool
|
|
124
|
-
float ndv =
|
|
125
|
-
vec3 normal =
|
|
123
|
+
bool pU = rN >= 0.0 && sG < 0.0;
|
|
124
|
+
float ndv = pU ? rN : sG;
|
|
125
|
+
vec3 normal = pU ? si.faceNormal : si.normal;
|
|
126
126
|
|
|
127
127
|
mat.inside = ndv <= 0.0 && !mat.thinWalled;
|
|
128
128
|
|
|
@@ -131,12 +131,12 @@ vec3 ffnormal = ndv >= 0.0 ? normal : -normal;
|
|
|
131
131
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
132
132
|
if (mat.coatNormalEnabled) {
|
|
133
133
|
vec3 view = -aa.ray.d;
|
|
134
|
-
float
|
|
135
|
-
mat.geometricNormal =
|
|
136
|
-
ffnormal =
|
|
137
|
-
mat.coatNormal =
|
|
138
|
-
mat.inside =
|
|
139
|
-
mat.relativeIor = (
|
|
134
|
+
float ga = dot(bC, view);
|
|
135
|
+
mat.geometricNormal = ga >= 0.0 ? bC : -bC;
|
|
136
|
+
ffnormal = fE(mF, bC, view);
|
|
137
|
+
mat.coatNormal = fE(si.coatNormal, bC, view);
|
|
138
|
+
mat.inside = ga <= 0.0 && !mat.thinWalled;
|
|
139
|
+
mat.relativeIor = (ga > 0.0 || mat.thinWalled) ? 1.0 / mat.specularIor : mat.specularIor;
|
|
140
140
|
}
|
|
141
141
|
#endif
|
|
142
142
|
|
|
@@ -145,47 +145,47 @@ float scatteringPdf;
|
|
|
145
145
|
vec3 cG;
|
|
146
146
|
aa.scatteringIsDelta = false;
|
|
147
147
|
bool bl = false;
|
|
148
|
-
bool
|
|
148
|
+
bool hn = false;
|
|
149
149
|
ag prepared;
|
|
150
150
|
|
|
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 nv = 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 sC = max(max(extinction.x, extinction.y), extinction.z);
|
|
158
|
+
if (mediumType > 0 && sC > 0.0) {
|
|
159
159
|
|
|
160
160
|
|
|
161
161
|
|
|
162
162
|
|
|
163
|
-
int
|
|
164
|
-
float
|
|
165
|
-
float
|
|
166
|
-
? min(-log(max(dz(cw(MEDIUM_DISTANCE)), 1e-7)) /
|
|
163
|
+
int nk = min(int(dz(cw(MEDIUM_CHANNEL)) * 3.0), 2);
|
|
164
|
+
float fD = extinction[nk];
|
|
165
|
+
float ih = fD > 0.0
|
|
166
|
+
? min(-log(max(dz(cw(MEDIUM_DISTANCE)), 1e-7)) / fD, d)
|
|
167
167
|
: d;
|
|
168
|
-
bl =
|
|
169
|
-
vec3 ew = exp(-extinction *
|
|
170
|
-
vec3
|
|
168
|
+
bl = ih < d;
|
|
169
|
+
vec3 ew = exp(-extinction * ih);
|
|
170
|
+
vec3 oa = bl
|
|
171
171
|
? extinction * ew
|
|
172
172
|
: ew;
|
|
173
|
-
float
|
|
174
|
-
(
|
|
173
|
+
float nL = max(
|
|
174
|
+
(oa.x + oa.y + oa.z) / 3.0,
|
|
175
175
|
1e-8
|
|
176
176
|
);
|
|
177
177
|
if (bl) {
|
|
178
|
-
aa.beta *= ew * scattering /
|
|
178
|
+
aa.beta *= ew * scattering / nL;
|
|
179
179
|
|
|
180
|
-
aa.ray.o =
|
|
180
|
+
aa.ray.o = nv + ih * aa.ray.d;
|
|
181
181
|
si.position = aa.ray.o;
|
|
182
|
-
aa.li +=
|
|
182
|
+
aa.li += mU(si, mat, prepared, aa, ffnormal, false) * aa.beta;
|
|
183
183
|
|
|
184
184
|
|
|
185
|
-
cG =
|
|
185
|
+
cG = fp(
|
|
186
186
|
-aa.ray.d,
|
|
187
187
|
si.mediumAnisotropy,
|
|
188
|
-
|
|
188
|
+
fo(cw(PHASE_DIRECTION))
|
|
189
189
|
);
|
|
190
190
|
scatteringPdf = bD(
|
|
191
191
|
dot(cG, -aa.ray.d),
|
|
@@ -193,7 +193,7 @@ si.mediumAnisotropy
|
|
|
193
193
|
);
|
|
194
194
|
}
|
|
195
195
|
else {
|
|
196
|
-
aa.beta *= ew /
|
|
196
|
+
aa.beta *= ew / nL;
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
#endif
|
|
@@ -205,21 +205,21 @@ if (mat.materialType == UNLIT) {
|
|
|
205
205
|
aa.abort = true;
|
|
206
206
|
return;
|
|
207
207
|
}
|
|
208
|
-
vec3
|
|
208
|
+
vec3 pS = vec3(0.0);
|
|
209
209
|
#ifdef USE_TANGENT
|
|
210
|
-
|
|
210
|
+
pS = 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 =
|
|
217
|
-
aa.li +=
|
|
216
|
+
prepared = eH(pS, mat, -aa.ray.d, ffnormal);
|
|
217
|
+
aa.li += mU(si, mat, prepared, aa, ffnormal, true) * aa.beta;
|
|
218
218
|
|
|
219
219
|
bool isNextRefraction;
|
|
220
220
|
vec3 f = dv(
|
|
221
221
|
prepared,
|
|
222
|
-
|
|
222
|
+
ur,
|
|
223
223
|
cG,
|
|
224
224
|
scatteringPdf,
|
|
225
225
|
isNextRefraction
|
|
@@ -238,7 +238,7 @@ aa.abort = true;
|
|
|
238
238
|
return;
|
|
239
239
|
}
|
|
240
240
|
aa.beta *= f / scatteringPdf;
|
|
241
|
-
|
|
241
|
+
hn = !mat.thinWalled &&
|
|
242
242
|
isNextRefraction;
|
|
243
243
|
aa.isNextRefraction = isNextRefraction;
|
|
244
244
|
|
|
@@ -250,7 +250,7 @@ if (mat.coatNormalEnabled) { aa.ray.o = si.position + EPS * (dot(bC, cG) >= 0.0
|
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
aa.scatteringPdf = scatteringPdf;
|
|
253
|
-
|
|
253
|
+
iC(aa.ray, aa.ray.o, cG);
|
|
254
254
|
if (bl) {
|
|
255
255
|
aa.isNextRefraction = false;
|
|
256
256
|
}
|
|
@@ -259,8 +259,8 @@ aa.fromEye = false;
|
|
|
259
259
|
#ifdef HAS_MEDIUM
|
|
260
260
|
|
|
261
261
|
|
|
262
|
-
if (!bl &&
|
|
263
|
-
if (
|
|
262
|
+
if (!bl && hn && mat.mediumType > 0) {
|
|
263
|
+
if (rN >= 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
|
|
14
|
+
uint ky(uint candidate, uint slot) {
|
|
15
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 oT = -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
|
-
|
|
27
|
-
dz(
|
|
25
|
+
vec3 ln = vec3(
|
|
26
|
+
fo(ky(candidate, LIGHT_POSITION)),
|
|
27
|
+
dz(ky(candidate, LIGHT_SELECT))
|
|
28
28
|
);
|
|
29
|
-
sampleLight(si.position,
|
|
29
|
+
sampleLight(si.position, ln, 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 pM = dot(si.normal, oT) * cosThetaL;
|
|
34
|
+
bool mD = false;
|
|
35
|
+
if (pM >= 0.0) {
|
|
36
36
|
Ray ray;
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
iC(ray, si.position + EPS * lightDir, lightDir);
|
|
38
|
+
mD = ex(ray, lightSample.dist - EPS, si.triangleIndex);
|
|
39
39
|
}
|
|
40
|
-
visibility +=
|
|
40
|
+
visibility += mD ? 0.0 : 1.0;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
aa.alpha = visibility / float(SHADOW_CATCHER_LIGHT_SAMPLES);
|
|
@@ -5,70 +5,70 @@ 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
|
|
8
|
+
vec3 rm = vec3(alpha, 1.0);
|
|
9
|
+
vec3 gj = normalize(rm * view);
|
|
10
|
+
float uh = min(gj.z, 1.0);
|
|
11
|
+
float qQ = 1.0 + uh;
|
|
12
|
+
float rh = (1.0 - samplePoint.y) * qQ;
|
|
13
|
+
float rR = samplePoint.y * qQ;
|
|
14
|
+
float sI = rh + (1.0 - uh);
|
|
15
|
+
float fl = sqrt(max(0.0, sI * rR));
|
|
16
16
|
float br = TWOPI * samplePoint.x;
|
|
17
|
-
vec3
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
vec3 lJ = vec3(
|
|
18
|
+
gj.x + fl * cos(br),
|
|
19
|
+
gj.y + fl * sin(br),
|
|
20
|
+
rh
|
|
21
21
|
);
|
|
22
|
-
return normalize(
|
|
22
|
+
return normalize(rm * lJ);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
float
|
|
26
|
-
vec3
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
float gK(vec3 oq, vec2 alpha) {
|
|
26
|
+
vec3 hr = vec3(
|
|
27
|
+
oq.x / alpha.x,
|
|
28
|
+
oq.y / alpha.y,
|
|
29
|
+
oq.z
|
|
30
30
|
);
|
|
31
|
-
float ap = dot(
|
|
31
|
+
float ap = dot(hr, hr);
|
|
32
32
|
return 1.0 / (
|
|
33
33
|
PI * alpha.x * alpha.y * ap * ap
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
float bk(vec3 direction, vec2 alpha) {
|
|
38
|
-
float
|
|
39
|
-
if (
|
|
38
|
+
float eF = abs(direction.z);
|
|
39
|
+
if (eF <= 1e-8) {
|
|
40
40
|
return 0.0;
|
|
41
41
|
}
|
|
42
|
-
vec2
|
|
43
|
-
float
|
|
44
|
-
/ (
|
|
45
|
-
return 2.0 / (1.0 + sqrt(1.0 +
|
|
42
|
+
vec2 ic = alpha * direction.xy;
|
|
43
|
+
float lK = dot(ic, ic)
|
|
44
|
+
/ (eF * eF);
|
|
45
|
+
return 2.0 / (1.0 + sqrt(1.0 + lK));
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
float aE(float au) {
|
|
49
|
-
float
|
|
50
|
-
return pow(
|
|
49
|
+
float di = clamp(1.0 - au, 0.0, 1.0);
|
|
50
|
+
return pow(di, 5.0);
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
float cu(float L, float cJ) {
|
|
54
|
-
float
|
|
55
|
-
float
|
|
56
|
-
* max(0.0, 1.0 -
|
|
57
|
-
if (
|
|
54
|
+
float iA = clamp(abs(L), 0.0, 1.0);
|
|
55
|
+
float kl = cJ * cJ
|
|
56
|
+
* max(0.0, 1.0 - iA * iA);
|
|
57
|
+
if (kl >= 1.0) {
|
|
58
58
|
return 1.0;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
float
|
|
62
|
-
float ba = (
|
|
63
|
-
/ max(
|
|
64
|
-
float
|
|
65
|
-
/ max(cJ *
|
|
61
|
+
float lU = sqrt(max(0.0, 1.0 - kl));
|
|
62
|
+
float ba = (iA - cJ * lU)
|
|
63
|
+
/ max(iA + cJ * lU, 1e-8);
|
|
64
|
+
float pN = (cJ * iA - lU)
|
|
65
|
+
/ max(cJ * iA + lU, 1e-8);
|
|
66
66
|
return 0.5 * (
|
|
67
|
-
ba * ba +
|
|
67
|
+
ba * ba + pN * pN
|
|
68
68
|
);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
vec2
|
|
71
|
+
vec2 gh(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 kF = gh(samplePoint);
|
|
92
92
|
return vec3(
|
|
93
|
-
|
|
94
|
-
sqrt(max(0.0, 1.0 - dot(
|
|
93
|
+
kF,
|
|
94
|
+
sqrt(max(0.0, 1.0 - dot(kF, kF)))
|
|
95
95
|
);
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
float aG(float
|
|
99
|
-
float scale = max(
|
|
98
|
+
float aG(float pr, float nO) {
|
|
99
|
+
float scale = max(pr, nO);
|
|
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(pr, nO) / scale;
|
|
104
|
+
vec2 oP = normalized * normalized;
|
|
105
|
+
return oP.x / (oP.x + oP.y);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
void aL(in vec3 normal, out vec3 tangent, out vec3 bitangent) {
|
|
109
|
-
float
|
|
110
|
-
float dW = -1.0 / (
|
|
109
|
+
float ik = normal.z >= 0.0 ? 1.0 : -1.0;
|
|
110
|
+
float dW = -1.0 / (ik + normal.z);
|
|
111
111
|
float xy = normal.x * normal.y * dW;
|
|
112
112
|
tangent = vec3(
|
|
113
|
-
1.0 +
|
|
114
|
-
|
|
115
|
-
-
|
|
113
|
+
1.0 + ik * normal.x * normal.x * dW,
|
|
114
|
+
ik * xy,
|
|
115
|
+
-ik * normal.x
|
|
116
116
|
);
|
|
117
117
|
bitangent = vec3(
|
|
118
118
|
xy,
|
|
119
|
-
|
|
119
|
+
ik + 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 tN = 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 * tN;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
float
|
|
136
|
+
float eN(
|
|
137
137
|
float wavelength,
|
|
138
|
-
float
|
|
139
|
-
float
|
|
140
|
-
float
|
|
138
|
+
float hg,
|
|
139
|
+
float hp,
|
|
140
|
+
float qs
|
|
141
141
|
) {
|
|
142
|
-
if (wavelength == 0.0 ||
|
|
143
|
-
return
|
|
142
|
+
if (wavelength == 0.0 || hp <= 0.0) {
|
|
143
|
+
return hg;
|
|
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 jR = 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 nh = max(qs / hp, 1e-6);
|
|
154
|
+
float qR = (hg - 1.0) * jR / nh;
|
|
155
|
+
float tl = hg
|
|
156
|
+
- qR / (FRAUNHOFER_D * FRAUNHOFER_D);
|
|
157
|
+
return tl + qR / (wavelength * wavelength);
|
|
158
158
|
}
|
|
159
159
|
|
|
160
|
-
vec3
|
|
161
|
-
vec3
|
|
160
|
+
vec3 fp(
|
|
161
|
+
vec3 gy,
|
|
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 ja = (1.0 - anisotropy * anisotropy)
|
|
171
171
|
/ (1.0 + anisotropy - 2.0 * anisotropy * samplePoint.y);
|
|
172
172
|
au = (
|
|
173
|
-
|
|
173
|
+
ja * ja - 1.0 - anisotropy * anisotropy
|
|
174
174
|
) / (2.0 * anisotropy);
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
-
float
|
|
177
|
+
float ud = sqrt(max(0.0, 1.0 - au * au));
|
|
178
178
|
float br = TWOPI * samplePoint.x;
|
|
179
179
|
vec3 tangent;
|
|
180
180
|
vec3 bitangent;
|
|
181
|
-
aL(
|
|
182
|
-
return tangent * (
|
|
183
|
-
+ bitangent * (
|
|
184
|
-
+
|
|
181
|
+
aL(gy, tangent, bitangent);
|
|
182
|
+
return tangent * (ud * cos(br))
|
|
183
|
+
+ bitangent * (ud * sin(br))
|
|
184
|
+
+ gy * au;
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
float bD(float au, float anisotropy) {
|