@meimu/mutracer 0.1.3 → 0.1.5
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 +4155 -4052
- package/docs/api.md +13 -10
- package/docs/materials.md +17 -26
- package/docs/threejs.md +35 -9
- package/docs/viewer.md +36 -3
- 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 +17 -9
- 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 +8 -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 +323 -315
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +154 -121
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +434 -434
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- 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 +42 -41
- 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 +84 -84
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- 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 +476 -470
- 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 +95 -60
- 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/OpenPBRMaterial.d.ts +1 -1
- package/lib/scene/OpenPBRMaterial.js +1 -1
- package/lib/scene/OpenPBRMaterial.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
|
@@ -43,50 +43,50 @@ ${createOpenPbrBsdfWgsl(hasAnisotropyDirections, hasCoatNormals)}
|
|
|
43
43
|
${sampleLightWgsl}
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
var<private>
|
|
46
|
+
var<private> tL: u32 = 0u;
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
fn
|
|
50
|
+
fn jX() -> u32 {
|
|
51
51
|
return u32(max(rtUniform.directLightCandidates, 1));
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
fn
|
|
57
|
+
fn pK(wP: u32) -> f32 {
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
if (SAMPLING_PATTERN == 2) { _ = rand(); }
|
|
63
|
-
let
|
|
64
|
-
let key = aq(aq(
|
|
65
|
-
let dimension = aq(cF,
|
|
63
|
+
let kd = bc.x + bc.y * u32(rtUniform.outputSize.x);
|
|
64
|
+
let key = aq(aq(kd, bd), rtUniform.sequenceSeed);
|
|
65
|
+
let dimension = aq(cF, wP) ^ 0xa511e9b3u;
|
|
66
66
|
return f32(eg(key ^ dimension) >> 8u) * (1.0 / 16777216.0);
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
|
|
71
|
-
fn
|
|
72
|
-
let
|
|
73
|
-
if (
|
|
74
|
-
return aG(
|
|
71
|
+
fn tC(fg: f32, scatteringPdf: f32) -> f32 {
|
|
72
|
+
let aV = jX();
|
|
73
|
+
if (aV <= 1u) {
|
|
74
|
+
return aG(fg, scatteringPdf);
|
|
75
75
|
}
|
|
76
|
-
let
|
|
77
|
-
return
|
|
78
|
-
max(
|
|
76
|
+
let iJ = f32(aV) * fg;
|
|
77
|
+
return iJ /
|
|
78
|
+
max(iJ + scatteringPdf, 1e-20);
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
|
|
82
|
-
fn
|
|
83
|
-
let
|
|
84
|
-
if (
|
|
85
|
-
return aG(scatteringPdf,
|
|
82
|
+
fn fX(scatteringPdf: f32, fg: f32) -> f32 {
|
|
83
|
+
let aV = jX();
|
|
84
|
+
if (aV <= 1u) {
|
|
85
|
+
return aG(scatteringPdf, fg);
|
|
86
86
|
}
|
|
87
|
-
let
|
|
87
|
+
let iJ = f32(aV) * fg;
|
|
88
88
|
return scatteringPdf /
|
|
89
|
-
max(scatteringPdf +
|
|
89
|
+
max(scatteringPdf + iJ, 1e-20);
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
${createSampleMaterialWgsl(hasAnisotropyDirections, hasCoatNormals)}
|
|
@@ -101,24 +101,24 @@ ${shadowCatcherAccumulationWGSL}
|
|
|
101
101
|
@group(3) @binding(3) var<storage, read_write> outShadowCatcher: array<ShadowCatcherAccumulation>;
|
|
102
102
|
|
|
103
103
|
|
|
104
|
-
fn
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
fn hK(
|
|
105
|
+
hg: u32,
|
|
106
|
+
vy: vec3f,
|
|
107
107
|
normal: vec3f
|
|
108
108
|
) {
|
|
109
109
|
if (rtUniform.varianceMoments != 0) {
|
|
110
|
-
let value = dot(
|
|
111
|
-
outNormal[
|
|
110
|
+
let value = dot(vy, luminance);
|
|
111
|
+
outNormal[hg] += vec4f(value * value, 0.0, 0.0, 1.0);
|
|
112
112
|
}
|
|
113
113
|
else {
|
|
114
|
-
outNormal[
|
|
114
|
+
outNormal[hg] += vec4f(normal, 1.0);
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
|
|
120
|
-
fn
|
|
121
|
-
outShadowCatcher[
|
|
120
|
+
fn iS(hg: u32, value: f32) {
|
|
121
|
+
outShadowCatcher[hg].moments += vec4f(value, value * value, 0.0, 0.0);
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
|
|
@@ -130,30 +130,30 @@ normal: vec3f,
|
|
|
130
130
|
isBlank: bool,
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
fn dq(
|
|
134
|
-
let
|
|
135
|
-
if (
|
|
133
|
+
fn dq(sN: vec3f, height: f32, radius: f32) -> f32 {
|
|
134
|
+
let fR = length(sN);
|
|
135
|
+
if (fR < 0.00001) {
|
|
136
136
|
return -radius;
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
-
let
|
|
140
|
-
let
|
|
139
|
+
let iG = radius * sN.y / fR;
|
|
140
|
+
let iq = -1.5 * height;
|
|
141
141
|
var ev: f32;
|
|
142
|
-
if (
|
|
142
|
+
if (iG >= 0.0) {
|
|
143
143
|
ev = radius;
|
|
144
144
|
}
|
|
145
|
-
else if (
|
|
146
|
-
ev = -height *
|
|
145
|
+
else if (iG < iq) {
|
|
146
|
+
ev = -height * fR / sN.y;
|
|
147
147
|
}
|
|
148
148
|
else {
|
|
149
149
|
let dW = 1.0
|
|
150
|
-
-
|
|
150
|
+
- iG * iG / (3.0 * iq * iq);
|
|
151
151
|
ev = radius * dW;
|
|
152
152
|
}
|
|
153
|
-
return
|
|
153
|
+
return fR - ev;
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
fn
|
|
156
|
+
fn eT(origin: vec3f, direction: vec3f) -> vec3f {
|
|
157
157
|
if (!USE_GROUNDED_BACKGROUND) {
|
|
158
158
|
return direction;
|
|
159
159
|
}
|
|
@@ -165,8 +165,8 @@ params.z + params.x,
|
|
|
165
165
|
rtUniform.groundedBackgroundCenter.y
|
|
166
166
|
);
|
|
167
167
|
let bB = origin - center;
|
|
168
|
-
let
|
|
169
|
-
let ej =
|
|
168
|
+
let eJ = dot(bB, bY);
|
|
169
|
+
let ej = eJ * eJ
|
|
170
170
|
- dot(bB, bB) + params.y * params.y;
|
|
171
171
|
if (
|
|
172
172
|
ej <= 0.0
|
|
@@ -175,58 +175,61 @@ ej <= 0.0
|
|
|
175
175
|
return direction;
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
-
var cC = -
|
|
178
|
+
var cC = -eJ + sqrt(ej);
|
|
179
179
|
if (cC <= 0.0) {
|
|
180
180
|
return direction;
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
let
|
|
184
|
-
if (
|
|
185
|
-
return normalize(
|
|
183
|
+
let nO = bB + bY * cC;
|
|
184
|
+
if (nO.y >= 0.0) {
|
|
185
|
+
return normalize(nO);
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
if (bY.y < -0.00001 && params.y > 1.5 * params.x) {
|
|
189
|
-
let
|
|
190
|
-
let
|
|
191
|
-
let
|
|
189
|
+
let hT = (-params.x - bB.y) / bY.y;
|
|
190
|
+
let nE = bB + bY * hT;
|
|
191
|
+
let om = (2.0 / 3.0)
|
|
192
192
|
* sqrt(params.y * params.y - 2.25 * params.x * params.x);
|
|
193
|
-
if (
|
|
194
|
-
return normalize(
|
|
193
|
+
if (hT > 0.0 && length(nE.xz) <= om) {
|
|
194
|
+
return normalize(nE);
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
var cN = 0.0;
|
|
199
199
|
for (var i = 0; i < 14; i++) {
|
|
200
|
-
let
|
|
201
|
-
let
|
|
202
|
-
if (dq(
|
|
203
|
-
cC =
|
|
200
|
+
let fh = (cN + cC) * 0.5;
|
|
201
|
+
let pL = bB + bY * fh;
|
|
202
|
+
if (dq(pL, params.x, params.y) > 0.0) {
|
|
203
|
+
cC = fh;
|
|
204
204
|
}
|
|
205
205
|
else {
|
|
206
|
-
cN =
|
|
206
|
+
cN = fh;
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
209
|
let hit = bB + bY * ((cN + cC) * 0.5);
|
|
210
210
|
return normalize(hit);
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
fn
|
|
213
|
+
fn hH(ray: Ray) -> vec4f {
|
|
214
214
|
var bg = vec4f(0.0);
|
|
215
215
|
if (USE_BACKGROUND_MAP) {
|
|
216
|
-
let
|
|
217
|
-
|
|
216
|
+
let d = eT(ray.o, ray.d);
|
|
217
|
+
let t = rtUniform.backgroundMapTransform;
|
|
218
|
+
let qb = vec3f(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);
|
|
219
|
+
let aW = textureLinear(backgroundMap, eL(qb));
|
|
220
|
+
bg = vec4f(aW.rgb * t.z, aW.a);
|
|
218
221
|
}
|
|
219
222
|
else if (USE_BACKGROUND) {
|
|
220
223
|
bg = rtUniform.backgroundColor;
|
|
221
224
|
}
|
|
222
225
|
else if (USE_ENVMAP) {
|
|
223
|
-
bg = textureLinear(envMap,
|
|
226
|
+
bg = textureLinear(envMap, cY(ray.d));
|
|
224
227
|
}
|
|
225
228
|
return bg;
|
|
226
229
|
}
|
|
227
230
|
|
|
228
231
|
fn cW(ray: Ray, wavelength: f32) -> vec4f {
|
|
229
|
-
let bg =
|
|
232
|
+
let bg = hH(ray);
|
|
230
233
|
if (SPECTRAL) {
|
|
231
234
|
return vec4f(ai(bg.rgb, wavelength), bg.a);
|
|
232
235
|
}
|
|
@@ -253,20 +256,20 @@ let bg = cW(
|
|
|
253
256
|
(*aa).ray,
|
|
254
257
|
(*si).wavelength
|
|
255
258
|
);
|
|
256
|
-
let cT = select(
|
|
257
|
-
|
|
259
|
+
let cT = select(fX((*aa).scatteringPdf,
|
|
260
|
+
iB(cY((*aa).ray.d)) * rtUniform.envLightPmf),
|
|
258
261
|
1.0, (*aa).scatteringIsDelta);
|
|
259
262
|
(*aa).li += cT * (*aa).beta * bg.rgb * bg.a;
|
|
260
263
|
(*aa).alpha = max((*aa).alpha, bg.a);
|
|
261
264
|
}
|
|
262
265
|
else {
|
|
263
|
-
let
|
|
264
|
-
var emission = textureLinear(envMap,
|
|
266
|
+
let tQ = cY((*aa).ray.d);
|
|
267
|
+
var emission = textureLinear(envMap, tQ).rgb;
|
|
265
268
|
if (SPECTRAL) {
|
|
266
269
|
emission = ai(emission, (*si).wavelength);
|
|
267
270
|
}
|
|
268
271
|
(*aa).li += (*aa).beta * emission *
|
|
269
|
-
|
|
272
|
+
fX((*aa).scatteringPdf, iB(tQ));
|
|
270
273
|
}
|
|
271
274
|
}
|
|
272
275
|
else {
|
|
@@ -297,10 +300,10 @@ if ((*aa).fromEye) {
|
|
|
297
300
|
(USE_BACKGROUND && !USE_BACKGROUND_MAP);
|
|
298
301
|
}
|
|
299
302
|
else {
|
|
300
|
-
let cam =
|
|
301
|
-
let
|
|
303
|
+
let cam = hC(uv);
|
|
304
|
+
let mL = dot(cam.d, (*aa).ray.d) > 0.0;
|
|
302
305
|
if (rtUniform.transmissiveOutputAlphaMin < 1.0) {
|
|
303
|
-
if (
|
|
306
|
+
if (mL) {
|
|
304
307
|
(*aa).alpha = max((*aa).alpha, bg.a);
|
|
305
308
|
} else {
|
|
306
309
|
(*aa).alpha = 1.0;
|
|
@@ -309,11 +312,11 @@ if (mC) {
|
|
|
309
312
|
if (!USE_ENVMAP) {
|
|
310
313
|
|
|
311
314
|
|
|
312
|
-
if (
|
|
315
|
+
if (mL) {
|
|
313
316
|
|
|
314
317
|
|
|
315
318
|
(*aa).li += (*aa).beta *
|
|
316
|
-
|
|
319
|
+
fX((*aa).scatteringPdf, 1.0) * bg.rgb;
|
|
317
320
|
}
|
|
318
321
|
}
|
|
319
322
|
}
|
|
@@ -335,12 +338,12 @@ cH = true;
|
|
|
335
338
|
if (!cH && rtUniform.transmissiveOutputAlphaMin < 1.0) {
|
|
336
339
|
|
|
337
340
|
|
|
338
|
-
let
|
|
339
|
-
(*aa).alpha = max(
|
|
341
|
+
let tW = max(1.0 - (*ma).transmissionWeight, 1.0 - pow(1.0 - rtUniform.transmissiveOutputAlphaMin, f32(*depth)));
|
|
342
|
+
(*aa).alpha = max(tW, (*aa).alpha);
|
|
340
343
|
}
|
|
341
344
|
if (!cH) {
|
|
342
|
-
|
|
343
|
-
|
|
345
|
+
tL = u32(max(*depth, 0));
|
|
346
|
+
mb(si, ma, aa);
|
|
344
347
|
}
|
|
345
348
|
else {
|
|
346
349
|
|
|
@@ -375,10 +378,10 @@ if (*depth > 4) {
|
|
|
375
378
|
|
|
376
379
|
if (USE_RR) {
|
|
377
380
|
if (*depth >= RR_MAX && !cH) {
|
|
378
|
-
let
|
|
381
|
+
let oH = (*aa).beta;
|
|
379
382
|
|
|
380
|
-
let
|
|
381
|
-
let q: f32 = max(0.0, 1.0 -
|
|
383
|
+
let oy = max(max(oH.x, oH.y), oH.z);
|
|
384
|
+
let q: f32 = max(0.0, 1.0 - oy);
|
|
382
385
|
if (dz(cw(RUSSIAN_ROULETTE)) < q) {
|
|
383
386
|
|
|
384
387
|
|
|
@@ -394,13 +397,13 @@ if ((*aa).abort) {
|
|
|
394
397
|
return;
|
|
395
398
|
}
|
|
396
399
|
|
|
397
|
-
|
|
398
|
-
|
|
400
|
+
cZ((*aa).ray, si, *depth, true, (*aa).isNextRefraction);
|
|
401
|
+
eX(ma, (*si).materialIndex, (*si).uv, (*si).uv1, (*si).instanceIndex, (*si).vertexColor);
|
|
399
402
|
|
|
400
403
|
if (SPECTRAL) {
|
|
401
404
|
|
|
402
405
|
if ((*ma).transmissionWeight > 0.001) {
|
|
403
|
-
(*ma).specularIor =
|
|
406
|
+
(*ma).specularIor = eN(
|
|
404
407
|
(*si).wavelength,
|
|
405
408
|
(*ma).specularIor,
|
|
406
409
|
(*ma).transmissionDispersionScale,
|
|
@@ -415,26 +418,26 @@ return;
|
|
|
415
418
|
|
|
416
419
|
|
|
417
420
|
var lightSample: LightSampleRec;
|
|
418
|
-
let
|
|
421
|
+
let hy = eo(3u) < (*ma).alpha;
|
|
419
422
|
for (var i = 0; i < rtUniform.lightsCount; i++) {
|
|
420
423
|
|
|
421
424
|
let light: Light = analyticLights[i];
|
|
422
|
-
let d =
|
|
425
|
+
let d = my((*aa).ray, light, &lightSample);
|
|
423
426
|
lightSample.pdf *= light.selectionPmf;
|
|
424
|
-
let
|
|
425
|
-
if (d != INF && !(
|
|
426
|
-
let
|
|
427
|
+
let mC = (*si).hit && d > distance((*si).position, (*aa).ray.o);
|
|
428
|
+
if (d != INF && !(mC && hy)) {
|
|
429
|
+
let fa = fX((*aa).scatteringPdf, lightSample.pdf);
|
|
427
430
|
if (SPECTRAL) {
|
|
428
431
|
lightSample.emission = ai(lightSample.emission, (*si).wavelength);
|
|
429
432
|
}
|
|
430
|
-
(*aa).li +=
|
|
433
|
+
(*aa).li += fa * (*aa).beta * lightSample.emission;
|
|
431
434
|
(*aa).alpha = 1.0;
|
|
432
435
|
(*aa).abort = true;
|
|
433
436
|
}
|
|
434
437
|
}
|
|
435
438
|
|
|
436
439
|
if (USE_ENVMAP) {
|
|
437
|
-
if (!((*si).hit &&
|
|
440
|
+
if (!((*si).hit && hy)) {
|
|
438
441
|
if ((*aa).isNextRefraction) {
|
|
439
442
|
|
|
440
443
|
|
|
@@ -443,19 +446,19 @@ let bg = cW(
|
|
|
443
446
|
(*aa).ray,
|
|
444
447
|
(*si).wavelength
|
|
445
448
|
);
|
|
446
|
-
let cT = select(
|
|
447
|
-
|
|
449
|
+
let cT = select(fX((*aa).scatteringPdf,
|
|
450
|
+
iB(cY((*aa).ray.d)) * rtUniform.envLightPmf),
|
|
448
451
|
1.0, (*aa).scatteringIsDelta);
|
|
449
452
|
(*aa).li += cT * (*aa).beta * bg.rgb * bg.a;
|
|
450
453
|
(*aa).alpha = max((*aa).alpha, bg.a);
|
|
451
454
|
(*aa).abort = true;
|
|
452
455
|
return;
|
|
453
456
|
}
|
|
454
|
-
let _uv =
|
|
457
|
+
let _uv = cY((*aa).ray.d);
|
|
455
458
|
var emission = textureLinear(envMap, _uv).rgb;
|
|
456
|
-
let
|
|
459
|
+
let fa = fX(
|
|
457
460
|
(*aa).scatteringPdf,
|
|
458
|
-
|
|
461
|
+
iB(_uv) * rtUniform.envLightPmf
|
|
459
462
|
);
|
|
460
463
|
if (SPECTRAL) {
|
|
461
464
|
emission = ai(emission, (*si).wavelength);
|
|
@@ -464,7 +467,7 @@ emission = ai(emission, (*si).wavelength);
|
|
|
464
467
|
if (!USE_BACKGROUND) {
|
|
465
468
|
(*aa).alpha = 1.0;
|
|
466
469
|
}
|
|
467
|
-
(*aa).li += (*aa).beta * emission *
|
|
470
|
+
(*aa).li += (*aa).beta * emission * fa;
|
|
468
471
|
(*aa).abort = true;
|
|
469
472
|
}
|
|
470
473
|
}
|
|
@@ -472,40 +475,40 @@ if (!USE_BACKGROUND) {
|
|
|
472
475
|
*depth = *depth + 1;
|
|
473
476
|
}
|
|
474
477
|
|
|
475
|
-
fn
|
|
476
|
-
let origin = cameraUniform.viewProjectionInv * vec4f(
|
|
477
|
-
let center = cameraUniform.viewProjectionInv * vec4f(
|
|
478
|
+
fn hC(fH: vec2f) -> Ray {
|
|
479
|
+
let origin = cameraUniform.viewProjectionInv * vec4f(fH * 2.0 - 1.0, -1.0, 1.0);
|
|
480
|
+
let center = cameraUniform.viewProjectionInv * vec4f(fH * 2.0 - 1.0, 1.0, 1.0);
|
|
478
481
|
var cam: Ray;
|
|
479
|
-
|
|
482
|
+
iC(&cam, origin.xyz / origin.w, normalize(center.xyz * origin.w - origin.xyz * center.w));
|
|
480
483
|
|
|
481
484
|
return cam;
|
|
482
485
|
}
|
|
483
486
|
|
|
484
487
|
|
|
485
|
-
fn
|
|
488
|
+
fn kz(radius: f32, xi: f32) -> vec2f {
|
|
486
489
|
var x = 0.25;
|
|
487
|
-
for (var
|
|
490
|
+
for (var nG = 0; nG < 10; nG++) {
|
|
488
491
|
let x2 = x * x;
|
|
489
492
|
let x3 = x2 * x;
|
|
490
|
-
let
|
|
493
|
+
let kP = 1.0 - x;
|
|
491
494
|
let value = 10.0 * x2 - 20.0 * x3 + 15.0 * x2 * x2 -
|
|
492
495
|
4.0 * x2 * x3 - xi;
|
|
493
|
-
let
|
|
494
|
-
if (abs(value) < 1e-6 ||
|
|
495
|
-
x = clamp(x - value /
|
|
496
|
+
let mj = 20.0 * x * kP * kP * kP;
|
|
497
|
+
if (abs(value) < 1e-6 || mj == 0.0) { break; }
|
|
498
|
+
x = clamp(x - value / mj, 0.0, 1.0);
|
|
496
499
|
}
|
|
497
|
-
let
|
|
498
|
-
return vec2f(
|
|
500
|
+
let jo = x * radius;
|
|
501
|
+
return vec2f(jo, sqrt(max(radius * radius - jo * jo, 0.0)));
|
|
499
502
|
}
|
|
500
503
|
|
|
501
|
-
fn
|
|
502
|
-
if (
|
|
503
|
-
let
|
|
504
|
-
return
|
|
504
|
+
fn iT(radius: f32, gx: f32) -> f32 {
|
|
505
|
+
if (gx >= radius) { return 0.0; }
|
|
506
|
+
let og = radius - gx;
|
|
507
|
+
return og * og * og;
|
|
505
508
|
}
|
|
506
509
|
|
|
507
510
|
|
|
508
|
-
fn
|
|
511
|
+
fn mt(source: ad, radius: f32) -> vec3f {
|
|
509
512
|
var geometricNormal = source.faceNormal;
|
|
510
513
|
if (dot(geometricNormal, source.vertexNormal) < 0.0) {
|
|
511
514
|
geometricNormal = -geometricNormal;
|
|
@@ -513,73 +516,73 @@ geometricNormal = -geometricNormal;
|
|
|
513
516
|
var tangent: vec3f;
|
|
514
517
|
var bitangent: vec3f;
|
|
515
518
|
aL(geometricNormal, &tangent, &bitangent);
|
|
516
|
-
var
|
|
517
|
-
|
|
518
|
-
for (var
|
|
519
|
-
let
|
|
520
|
-
var cA =
|
|
521
|
-
let
|
|
522
|
-
var
|
|
523
|
-
var
|
|
519
|
+
var iF = vec3f(0.0);
|
|
520
|
+
|
|
521
|
+
for (var ig = 0; ig < BEVEL_SAMPLES; ig++) {
|
|
522
|
+
let ph = fp(CAMERA_BEVEL_BASE + u32(ig));
|
|
523
|
+
var cA = ph.x;
|
|
524
|
+
let oF = ph.y;
|
|
525
|
+
var dj = geometricNormal;
|
|
526
|
+
var fI = tangent;
|
|
524
527
|
var ek = bitangent;
|
|
525
|
-
var
|
|
526
|
-
var
|
|
527
|
-
var
|
|
528
|
+
var gf = 0.5;
|
|
529
|
+
var hY = 0.25;
|
|
530
|
+
var gH = 0.25;
|
|
528
531
|
if (cA < 0.5) {
|
|
529
532
|
cA *= 2.0;
|
|
530
533
|
}
|
|
531
534
|
else if (cA < 0.75) {
|
|
532
|
-
let
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
535
|
+
let mJ = dj;
|
|
536
|
+
dj = fI;
|
|
537
|
+
fI = mJ;
|
|
538
|
+
gf = 0.25;
|
|
539
|
+
hY = 0.5;
|
|
537
540
|
cA = (cA - 0.5) * 4.0;
|
|
538
541
|
}
|
|
539
542
|
else {
|
|
540
|
-
let
|
|
541
|
-
|
|
542
|
-
ek =
|
|
543
|
-
|
|
544
|
-
|
|
543
|
+
let mJ = dj;
|
|
544
|
+
dj = ek;
|
|
545
|
+
ek = mJ;
|
|
546
|
+
gf = 0.25;
|
|
547
|
+
gH = 0.5;
|
|
545
548
|
cA = (cA - 0.75) * 4.0;
|
|
546
549
|
}
|
|
547
550
|
|
|
548
|
-
let
|
|
551
|
+
let gV = kz(radius, oF);
|
|
549
552
|
let phi = TWOPI * cA;
|
|
550
|
-
let
|
|
551
|
-
(cos(phi) *
|
|
553
|
+
let qv = gV.x *
|
|
554
|
+
(cos(phi) * fI + sin(phi) * ek);
|
|
552
555
|
var ray: Ray;
|
|
553
|
-
|
|
556
|
+
iC(
|
|
554
557
|
&ray,
|
|
555
|
-
source.position +
|
|
556
|
-
-
|
|
558
|
+
source.position + dj * gV.y + qv,
|
|
559
|
+
-dj
|
|
557
560
|
);
|
|
558
561
|
var hit: ad;
|
|
559
|
-
|
|
562
|
+
iM(
|
|
560
563
|
ray,
|
|
561
564
|
&hit,
|
|
562
565
|
source.instanceIndex,
|
|
563
|
-
max(2.0 *
|
|
566
|
+
max(2.0 * gV.y, EPS)
|
|
564
567
|
);
|
|
565
568
|
if (!hit.hit) { continue; }
|
|
566
569
|
|
|
567
|
-
let
|
|
568
|
-
let
|
|
569
|
-
let
|
|
570
|
-
var weight =
|
|
571
|
-
|
|
572
|
-
|
|
570
|
+
let kQ = gf * abs(dot(dj, hit.faceNormal));
|
|
571
|
+
let mF = hY * abs(dot(fI, hit.faceNormal));
|
|
572
|
+
let kb = gH * abs(dot(ek, hit.faceNormal));
|
|
573
|
+
var weight = kQ / max(
|
|
574
|
+
kQ * kQ + mF * mF +
|
|
575
|
+
kb * kb,
|
|
573
576
|
1e-8
|
|
574
577
|
);
|
|
575
|
-
weight *=
|
|
576
|
-
max(
|
|
577
|
-
|
|
578
|
+
weight *= iT(radius, distance(hit.position, source.position)) /
|
|
579
|
+
max(iT(radius, gV.x), 1e-8);
|
|
580
|
+
iF += weight * hit.vertexNormal;
|
|
578
581
|
}
|
|
579
582
|
|
|
580
|
-
if (dot(
|
|
581
|
-
let
|
|
582
|
-
let result = source.normal +
|
|
583
|
+
if (dot(iF, iF) <= 1e-12) { return source.normal; }
|
|
584
|
+
let jH = normalize(iF);
|
|
585
|
+
let result = source.normal + jH - source.vertexNormal;
|
|
583
586
|
if (dot(result, result) > 1e-12) { return normalize(result); }
|
|
584
587
|
return source.normal;
|
|
585
588
|
}
|
|
@@ -596,12 +599,12 @@ aa.scatteringIsDelta = false;
|
|
|
596
599
|
aa.isNextRefraction = false;
|
|
597
600
|
aa.abort = false;
|
|
598
601
|
|
|
599
|
-
let
|
|
602
|
+
let rJ = (*ma).transmissionWeight < 0.001 && (*ma).subsurfaceWeight < 0.001 && (*ma).alpha > 0.99;
|
|
600
603
|
let bounceLimit = max(rtUniform.bounces, 0);
|
|
601
604
|
var depth = 0;
|
|
602
605
|
|
|
603
606
|
for (var idx: i32 = 0; idx < min(bounceLimit * 3, ${MAX_PATH_EVENTS}); idx = idx + 1) {
|
|
604
|
-
if (
|
|
607
|
+
if (rJ && idx > bounceLimit) {
|
|
605
608
|
aa.abort = true;
|
|
606
609
|
}
|
|
607
610
|
if (aa.abort) {
|
|
@@ -613,7 +616,7 @@ bounce(uv, &aa, &depth, si, ma, outAux);
|
|
|
613
616
|
return vec4f(aa.li, aa.alpha);
|
|
614
617
|
}
|
|
615
618
|
|
|
616
|
-
fn
|
|
619
|
+
fn iD(uv: vec2f, si: ptr<function, ad>, ray: Ray, ma: ptr<function, J>, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
|
|
617
620
|
${deterministicPrimaryAlpha ? /* wgsl */ `let coverage = clamp((*ma).alpha, 0.0, 1.0);
|
|
618
621
|
if (!(*si).hit || ((*ma).materialType != STANDARD && (*ma).materialType != UNLIT) || coverage >= 1.0) {
|
|
619
622
|
return bw(uv, si, ray, ma, outAux);
|
|
@@ -623,60 +626,60 @@ return bw(uv, si, ray, ma, outAux);
|
|
|
623
626
|
|
|
624
627
|
|
|
625
628
|
|
|
626
|
-
var
|
|
627
|
-
|
|
628
|
-
var
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
var
|
|
632
|
-
|
|
633
|
-
var
|
|
634
|
-
if (
|
|
635
|
-
|
|
636
|
-
|
|
629
|
+
var nX = ray;
|
|
630
|
+
nX.o = (*si).position + ray.d * (EPS * 0.02);
|
|
631
|
+
var dE = *si;
|
|
632
|
+
dE.albedoSampled = false;
|
|
633
|
+
cZ(nX, &dE, 0, false, false);
|
|
634
|
+
var rr: J;
|
|
635
|
+
eX(&rr, dE.materialIndex, dE.uv, dE.uv1, dE.instanceIndex, dE.vertexColor);
|
|
636
|
+
var gn = *outAux;
|
|
637
|
+
if (dE.hit && rr.materialType == STANDARD) {
|
|
638
|
+
gn.albedo = select(
|
|
639
|
+
rr.baseColor,
|
|
637
640
|
vec3f(1.0),
|
|
638
|
-
|
|
641
|
+
rr.transmissionWeight > 0.5
|
|
639
642
|
);
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
-
|
|
643
|
+
gn.normal = select(
|
|
644
|
+
dE.normal,
|
|
645
|
+
-dE.normal,
|
|
643
646
|
dot(
|
|
644
|
-
|
|
645
|
-
|
|
647
|
+
dE.normal,
|
|
648
|
+
dE.position - cameraUniform.viewInv[3].xyz
|
|
646
649
|
) > 0.0
|
|
647
650
|
);
|
|
648
|
-
|
|
651
|
+
dE.albedoSampled = rr.transmissionWeight > 0.5;
|
|
649
652
|
}
|
|
650
653
|
let back = bw(
|
|
651
|
-
uv, &
|
|
654
|
+
uv, &dE, nX, &rr, &gn
|
|
652
655
|
);
|
|
653
656
|
if (coverage <= 0.0) {
|
|
654
|
-
*outAux =
|
|
657
|
+
*outAux = gn;
|
|
655
658
|
return back;
|
|
656
659
|
}
|
|
657
660
|
|
|
658
|
-
var
|
|
659
|
-
var
|
|
660
|
-
|
|
661
|
-
var
|
|
662
|
-
let
|
|
663
|
-
uv, &
|
|
661
|
+
var tu = *si;
|
|
662
|
+
var uI = *ma;
|
|
663
|
+
uI.alpha = 1.0;
|
|
664
|
+
var iW = *outAux;
|
|
665
|
+
let qY = bw(
|
|
666
|
+
uv, &tu, ray, &uI, &iW
|
|
664
667
|
);
|
|
665
|
-
(*outAux).albedo = mix(
|
|
666
|
-
let
|
|
668
|
+
(*outAux).albedo = mix(gn.albedo, iW.albedo, coverage);
|
|
669
|
+
let fW = mix(gn.normal, iW.normal, coverage);
|
|
667
670
|
(*outAux).normal = select(
|
|
668
671
|
vec3f(0.0),
|
|
669
|
-
normalize(
|
|
670
|
-
dot(
|
|
672
|
+
normalize(fW),
|
|
673
|
+
dot(fW, fW) > 1e-12
|
|
671
674
|
);
|
|
672
|
-
(*outAux).isBlank =
|
|
673
|
-
(*outAux).isShadowCatcher =
|
|
674
|
-
return mix(back,
|
|
675
|
+
(*outAux).isBlank = gn.isBlank && iW.isBlank;
|
|
676
|
+
(*outAux).isShadowCatcher = gn.isShadowCatcher && iW.isShadowCatcher;
|
|
677
|
+
return mix(back, qY, coverage);` : /* wgsl */ `return bw(uv, si, ray, ma, outAux);`}
|
|
675
678
|
}
|
|
676
679
|
|
|
677
680
|
|
|
678
681
|
|
|
679
|
-
fn
|
|
682
|
+
fn mx(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
|
|
680
683
|
var si: ad;
|
|
681
684
|
var ma: J;
|
|
682
685
|
si.albedoSampled = false;
|
|
@@ -687,8 +690,8 @@ si.mediumAnisotropy = 0.0;
|
|
|
687
690
|
si.barycentrics = vec2f(0.0);
|
|
688
691
|
|
|
689
692
|
|
|
690
|
-
|
|
691
|
-
|
|
693
|
+
cZ(ray, &si, 0, false, false);
|
|
694
|
+
eX(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
692
695
|
|
|
693
696
|
if (si.hit && ma.materialType == SHADOW_CATCHER) {
|
|
694
697
|
(*outAux).isShadowCatcher = true;
|
|
@@ -708,7 +711,7 @@ return vec4f(vec3f(1.0), aa.alpha);
|
|
|
708
711
|
else {
|
|
709
712
|
if (HAS_BEVEL && rtUniform.bevel != 0) {
|
|
710
713
|
if (ma.bevel > 0.0) {
|
|
711
|
-
si.normal =
|
|
714
|
+
si.normal = mt(si, ma.bevel);
|
|
712
715
|
}
|
|
713
716
|
}
|
|
714
717
|
|
|
@@ -734,40 +737,40 @@ if (SPECTRAL) {
|
|
|
734
737
|
|
|
735
738
|
|
|
736
739
|
|
|
737
|
-
let
|
|
738
|
-
var
|
|
740
|
+
let sQ = array<f32, 3>(650.0, 510.0, 475.0);
|
|
741
|
+
var tO = vec3f(0.0);
|
|
739
742
|
var alpha = 0.0;
|
|
740
|
-
var
|
|
741
|
-
var
|
|
742
|
-
var
|
|
743
|
+
var jE = vec3f(0.0);
|
|
744
|
+
var jF = vec3f(0.0);
|
|
745
|
+
var sf = true;
|
|
743
746
|
var si2 = si;
|
|
744
747
|
var ma2 = ma;
|
|
745
|
-
let
|
|
746
|
-
let
|
|
748
|
+
let qL = s0;
|
|
749
|
+
let nT = em;
|
|
747
750
|
let eh = rtUniform.dispersionWavelengths == 1;
|
|
748
|
-
let
|
|
751
|
+
let jM = si.hit &&
|
|
749
752
|
ma.transmissionWeight > 0.001 &&
|
|
750
753
|
ma.transmissionDispersionScale > 0.001;
|
|
751
|
-
let
|
|
752
|
-
var
|
|
753
|
-
if (eh &&
|
|
754
|
+
let se = select(3, 1, eh);
|
|
755
|
+
var lO = 0;
|
|
756
|
+
if (eh && jM) {
|
|
754
757
|
|
|
755
758
|
|
|
756
|
-
|
|
759
|
+
lO = min(i32(floor(dz(CAMERA_WAVELENGTH) * 3.0)), 2);
|
|
757
760
|
}
|
|
758
|
-
for (var i = 0; i <
|
|
761
|
+
for (var i = 0; i < se; i++) {
|
|
759
762
|
|
|
760
763
|
|
|
761
764
|
|
|
762
765
|
if (!eh) {
|
|
763
|
-
s0 =
|
|
764
|
-
em =
|
|
766
|
+
s0 = qL;
|
|
767
|
+
em = nT;
|
|
765
768
|
cF = 0u;
|
|
766
769
|
}
|
|
767
770
|
si.wavelength = 0.0;
|
|
768
|
-
if (!eh ||
|
|
769
|
-
si.wavelength =
|
|
770
|
-
ma.specularIor =
|
|
771
|
+
if (!eh || jM) {
|
|
772
|
+
si.wavelength = sQ[select(i, lO, eh)];
|
|
773
|
+
ma.specularIor = eN(
|
|
771
774
|
si.wavelength,
|
|
772
775
|
ma.specularIor,
|
|
773
776
|
ma.transmissionDispersionScale,
|
|
@@ -783,32 +786,32 @@ dD.normal = (*outAux).normal;
|
|
|
783
786
|
dD.isBlank = false;
|
|
784
787
|
dD.isShadowCatcher = false;
|
|
785
788
|
}
|
|
786
|
-
let res =
|
|
789
|
+
let res = iD(uv, &si, ray, &ma, &dD);
|
|
787
790
|
if (eh) {
|
|
788
791
|
*outAux = dD;
|
|
789
|
-
let scale = select(1.0, 3.0,
|
|
792
|
+
let scale = select(1.0, 3.0, jM);
|
|
790
793
|
return vec4f(res.rgb * scale, res.a);
|
|
791
794
|
}
|
|
792
|
-
|
|
795
|
+
tO += res.rgb;
|
|
793
796
|
alpha = max(alpha, res.a);
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
+
jE += dD.albedo;
|
|
798
|
+
jF += dD.normal;
|
|
799
|
+
sf = sf && dD.isBlank;
|
|
797
800
|
si = si2;
|
|
798
801
|
ma = ma2;
|
|
799
802
|
}
|
|
800
|
-
(*outAux).albedo =
|
|
801
|
-
(*outAux).normal =
|
|
802
|
-
(*outAux).isBlank =
|
|
803
|
-
return vec4f(
|
|
803
|
+
(*outAux).albedo = jE / 3.0;
|
|
804
|
+
(*outAux).normal = jF / 3.0;
|
|
805
|
+
(*outAux).isBlank = sf;
|
|
806
|
+
return vec4f(tO, alpha);
|
|
804
807
|
}
|
|
805
808
|
else {
|
|
806
|
-
return
|
|
809
|
+
return iD(uv, &si, ray, &ma, outAux);
|
|
807
810
|
}
|
|
808
811
|
}
|
|
809
812
|
}
|
|
810
813
|
|
|
811
|
-
fn
|
|
814
|
+
fn oK(ip: vec2f) -> vec2f {
|
|
812
815
|
let p = 2.0 * ip - 1.0;
|
|
813
816
|
let greater = abs(p.x) > abs(p.y);
|
|
814
817
|
let r = select(p.y, p.x, greater);
|
|
@@ -823,17 +826,17 @@ let outputSize = rtUniform.outputSize;
|
|
|
823
826
|
let scaleOffset = rtUniform.scaleOffset;
|
|
824
827
|
var jitter = rtUniform.jitter;
|
|
825
828
|
|
|
826
|
-
let
|
|
827
|
-
if (
|
|
829
|
+
let fH = globalId.xy * vec2u(scaleOffset.xy) + vec2u(scaleOffset.zw);
|
|
830
|
+
if (fH.x >= u32(outputSize.x) || fH.y >= u32(outputSize.y)) {
|
|
828
831
|
return;
|
|
829
832
|
}
|
|
830
|
-
let idx =
|
|
833
|
+
let idx = fH.x + fH.y * u32(outputSize.x);
|
|
831
834
|
|
|
832
835
|
if (
|
|
833
836
|
rtUniform.adaptiveSampling != 0 &&
|
|
834
837
|
outNormal[idx].a >= textureLoad(
|
|
835
838
|
adaptiveSampleTargets,
|
|
836
|
-
vec2i(
|
|
839
|
+
vec2i(fH),
|
|
837
840
|
0
|
|
838
841
|
).r
|
|
839
842
|
) {
|
|
@@ -843,26 +846,26 @@ return;
|
|
|
843
846
|
|
|
844
847
|
|
|
845
848
|
|
|
846
|
-
let uv = (vec2<f32>(f32(
|
|
849
|
+
let uv = (vec2<f32>(f32(fH.x), f32(fH.y)) + vec2f(0.5)) / outputSize;
|
|
847
850
|
|
|
848
|
-
bc =
|
|
851
|
+
bc = fH;
|
|
849
852
|
bd = u32(outNormal[idx].a) + rtUniform.sampleSequenceOffset;
|
|
850
853
|
cF = 0u; em = 0u;
|
|
851
854
|
if (SAMPLING_PATTERN == 0 || SAMPLING_PATTERN == 1) {
|
|
852
|
-
jitter = (
|
|
855
|
+
jitter = (fp(CAMERA_PIXEL) - 0.5) / outputSize;
|
|
853
856
|
}
|
|
854
|
-
|
|
855
|
-
var cam =
|
|
857
|
+
kh(fH, i32(bd ^ eg(rtUniform.sequenceSeed)));
|
|
858
|
+
var cam = hC(uv + jitter);
|
|
856
859
|
|
|
857
860
|
if (cameraUniform.apertureRadius > 0.0) {
|
|
858
861
|
|
|
859
862
|
let eye = cameraUniform.viewInv[3].xyz;
|
|
860
|
-
let
|
|
861
|
-
let
|
|
862
|
-
let
|
|
863
|
-
let origin = (cameraUniform.viewInv * vec4f(
|
|
864
|
-
let dir = normalize(
|
|
865
|
-
|
|
863
|
+
let oj = -normalize(cameraUniform.viewInv[2].xyz);
|
|
864
|
+
let qy = eye + cam.d * (cameraUniform.focusDistance / dot(cam.d, oj));
|
|
865
|
+
let rK = cameraUniform.apertureRadius * oK(fp(CAMERA_LENS));
|
|
866
|
+
let origin = (cameraUniform.viewInv * vec4f(rK, 0.0, 1.0)).xyz;
|
|
867
|
+
let dir = normalize(qy - origin);
|
|
868
|
+
iC(&cam, origin, dir);
|
|
866
869
|
}
|
|
867
870
|
|
|
868
871
|
var outAux: RayTraceAuxiliary;
|
|
@@ -870,7 +873,7 @@ outAux.albedo = vec3f(0.0);
|
|
|
870
873
|
outAux.normal = vec3f(0.0);
|
|
871
874
|
outAux.isBlank = false;
|
|
872
875
|
outAux.isShadowCatcher = false;
|
|
873
|
-
var aF =
|
|
876
|
+
var aF = mx(uv + jitter, cam, &outAux);
|
|
874
877
|
|
|
875
878
|
|
|
876
879
|
|
|
@@ -885,21 +888,21 @@ aF = vec4f(0.0, 0.0, 0.0, 1.0);
|
|
|
885
888
|
if (outAux.isShadowCatcher) {
|
|
886
889
|
|
|
887
890
|
|
|
888
|
-
let
|
|
889
|
-
let
|
|
890
|
-
let
|
|
891
|
+
let aW = hH(cam);
|
|
892
|
+
let qg = select(0.0, 1.0, aW.a >= 0.01);
|
|
893
|
+
let jw = vec4f(aW.rgb * aW.a, aW.a);
|
|
891
894
|
|
|
892
895
|
|
|
893
|
-
outShadowCatcher[idx].mask += vec4f(1.0,
|
|
894
|
-
outShadowCatcher[idx].background +=
|
|
895
|
-
outColor[idx] +=
|
|
896
|
-
outAlbedo[idx] += vec4f(outAux.albedo,
|
|
897
|
-
|
|
896
|
+
outShadowCatcher[idx].mask += vec4f(1.0, aW.a, qg, aF.a);
|
|
897
|
+
outShadowCatcher[idx].background += jw;
|
|
898
|
+
outColor[idx] += jw;
|
|
899
|
+
outAlbedo[idx] += vec4f(outAux.albedo, qg);
|
|
900
|
+
hK(idx, aW.rgb, outAux.normal);
|
|
898
901
|
|
|
899
902
|
|
|
900
903
|
let visibility = 1.0 - aF.a;
|
|
901
|
-
|
|
902
|
-
1.0, dot(
|
|
904
|
+
iS(idx, visibility * select(
|
|
905
|
+
1.0, dot(aW.rgb, luminance), aW.a >= 0.01
|
|
903
906
|
));
|
|
904
907
|
}
|
|
905
908
|
else {
|
|
@@ -914,8 +917,8 @@ outShadowCatcher[idx].mask.g += aF.a;
|
|
|
914
917
|
}
|
|
915
918
|
outColor[idx] += aF;
|
|
916
919
|
outAlbedo[idx] += vec4f(outAux.albedo, select(1.0, 0.0, outAux.isBlank));
|
|
917
|
-
|
|
918
|
-
|
|
920
|
+
hK(idx, aF.rgb, outAux.normal);
|
|
921
|
+
iS(idx, dot(aF.rgb, luminance));
|
|
919
922
|
}
|
|
920
923
|
}
|
|
921
924
|
`;
|