@meimu/mutracer 0.2.0 → 0.3.0
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/README.md +3 -0
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +8949 -7915
- package/docs/api.md +42 -21
- package/docs/caustics.md +80 -0
- package/docs/materials.md +5 -4
- package/docs/progressive-rendering.md +50 -9
- package/docs/technical/continuous-spectrum.md +93 -0
- package/docs/updates.md +3 -1
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +7 -5
- package/lib/Display.js +1 -1
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -0
- package/lib/Engine.js +47 -12
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +61 -13
- package/lib/Render.js +169 -19
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -3
- package/lib/RenderLoop.js +68 -44
- package/lib/RenderLoop.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/GPUTraceQueue.d.ts +2 -1
- package/lib/renderer/GPUTraceQueue.js +3 -1
- package/lib/renderer/GPUTraceQueue.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +4 -0
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
- package/lib/renderer/WGPUCausticLightPass.js +217 -0
- package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
- package/lib/renderer/WGPUPhotonMap.js +191 -0
- package/lib/renderer/WGPUPhotonMap.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
- package/lib/renderer/WGPURayTraceOutput.js +122 -28
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +48 -17
- package/lib/renderer/WGPURayTracePass.js +538 -340
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +83 -47
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
- package/lib/renderer/WebGLFullQuadPass.js +4 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +6 -1
- package/lib/renderer/WebGLRayTracePass.js +43 -6
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +10 -14
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +60 -60
- package/lib/renderer/accumulationTarget.d.ts +2 -1
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/causticDiagnostics.d.ts +31 -0
- package/lib/renderer/causticDiagnostics.js +5 -0
- package/lib/renderer/causticDiagnostics.js.map +1 -0
- package/lib/renderer/causticEmission.d.ts +10 -0
- package/lib/renderer/causticEmission.js +40 -0
- package/lib/renderer/causticEmission.js.map +1 -0
- package/lib/renderer/causticUniform.d.ts +12 -0
- package/lib/renderer/causticUniform.js +22 -0
- package/lib/renderer/causticUniform.js.map +1 -0
- package/lib/renderer/caustics.d.ts +16 -0
- package/lib/renderer/caustics.js +93 -0
- package/lib/renderer/caustics.js.map +1 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +33 -33
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
- package/lib/renderer/glsl/chunks/intersect.glsl.js +426 -428
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +68 -63
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +140 -117
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/sampling.glsl.js +89 -92
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- 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 +2 -2
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +260 -237
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +26 -26
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
- package/lib/renderer/lightSampling.d.ts +3 -2
- package/lib/renderer/lightSampling.js +14 -8
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +4 -3
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +31 -0
- package/lib/renderer/researchTransport.js +5 -0
- package/lib/renderer/researchTransport.js.map +1 -0
- package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
- package/lib/renderer/sceneLayoutSchema.js +2 -2
- package/lib/renderer/sceneLayoutSchema.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.js.map +1 -0
- package/lib/renderer/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +3 -3
- package/lib/renderer/wgpuShaderSource.d.ts +7 -0
- package/lib/renderer/wgpuShaderSource.js +2 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +537 -0
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +598 -592
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +14 -14
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +75 -73
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +794 -794
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +35 -25
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +204 -187
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +89 -93
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +98 -98
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +25 -25
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
- package/lib/renderer/wgsl/photonMap.compute.js +352 -0
- package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +9 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +448 -522
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +2 -2
- package/lib/scene/MaterialState.js +2 -2
- package/lib/scene/MaterialState.js.map +1 -1
- package/lib/settings/render.d.ts +11 -0
- package/lib/settings/render.js +1 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +2 -2
- 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/llms.txt +2 -1
- package/package.json +3 -3
|
@@ -1,27 +1,29 @@
|
|
|
1
|
+
import { researchTransport } from '../researchTransport.js';
|
|
1
2
|
import { MAX_PATH_EVENTS } from '../pathLimits.js';
|
|
2
3
|
import cameraRayGlsl from './chunks/cameraRay.glsl.js';
|
|
3
4
|
// Portions adapted from ray-tracing-renderer@0.10.15
|
|
4
5
|
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
5
6
|
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
6
7
|
import commonGlsl from './chunks/common.glsl.js';
|
|
7
|
-
import
|
|
8
|
+
import { createRayTraceCoreGlsl } from './chunks/rayTraceCore.glsl.js';
|
|
8
9
|
import textureLinear from './chunks/textureLinear.glsl.js';
|
|
9
|
-
import
|
|
10
|
+
import { createMaterialBufferGlsl } from './chunks/materialBuffer.glsl.js';
|
|
10
11
|
import intersect from './chunks/intersect.glsl.js';
|
|
11
12
|
import randGlsl from './chunks/rand.glsl.js';
|
|
12
13
|
import random from './chunks/random.glsl.js';
|
|
13
14
|
import envMap from './chunks/envMap.glsl.js';
|
|
14
|
-
import
|
|
15
|
+
import { createSampleMaterialGlsl } from './chunks/sampleMaterial.glsl.js';
|
|
15
16
|
import sampleLightGlsl from './chunks/sampleLight.glsl.js';
|
|
16
17
|
import { FragmentShader, glsl, Shader } from '../shader.js';
|
|
17
18
|
import openPbrBsdfGlsl from './chunks/openPbrBsdf.glsl.js';
|
|
18
19
|
import samplingGlsl from './chunks/sampling.glsl.js';
|
|
20
|
+
import { spectrumGlsl } from '../spectrum.js';
|
|
19
21
|
import { isIntelMac } from '../util.js';
|
|
20
22
|
import uvProjectionGlsl from './chunks/uvProjection.glsl.js';
|
|
21
23
|
const doubleTransmissionCheckCode = glsl `
|
|
22
24
|
#if defined(HAS_TRANSMISSION) || defined(HAS_ALPHA)
|
|
23
25
|
if (!si.isTransparency && BOUNCES < 16 && depth * 2 > BOUNCES) {
|
|
24
|
-
|
|
26
|
+
path.abort = true;
|
|
25
27
|
return;
|
|
26
28
|
}
|
|
27
29
|
#endif
|
|
@@ -32,27 +34,33 @@ return;
|
|
|
32
34
|
// So here the code are injected separately.
|
|
33
35
|
const bounceCodeOnIntelMac = glsl `
|
|
34
36
|
|
|
35
|
-
for(int
|
|
36
|
-
if (
|
|
37
|
-
return vec4(
|
|
37
|
+
for(int yl = 0; yl < BOUNCES; yl++) {{
|
|
38
|
+
if (path.abort) {
|
|
39
|
+
return vec4(path.li, path.alpha);
|
|
38
40
|
}
|
|
39
|
-
bounce(
|
|
41
|
+
bounce(path, depth, si, mat, outAux);
|
|
40
42
|
}}
|
|
41
43
|
`;
|
|
42
44
|
const bounceCodeOnOther = glsl `
|
|
43
|
-
bool
|
|
44
|
-
int
|
|
45
|
+
bool xB = !si.isTransparency;
|
|
46
|
+
int rQ = min(BOUNCES, bounceLimit);
|
|
45
47
|
for(int idx = 0; idx < min(BOUNCES * 3, ${MAX_PATH_EVENTS}); idx++) {
|
|
46
|
-
if (
|
|
47
|
-
|
|
48
|
+
if (xB && idx > rQ) {
|
|
49
|
+
path.abort = true;
|
|
48
50
|
}
|
|
49
|
-
if (
|
|
50
|
-
return vec4(
|
|
51
|
+
if (path.abort) {
|
|
52
|
+
return vec4(path.li, path.alpha);
|
|
51
53
|
}
|
|
52
|
-
bounce(
|
|
54
|
+
bounce(path, depth, si, mat, outAux);
|
|
53
55
|
}
|
|
54
56
|
`;
|
|
55
|
-
export default function createRayTraceFragmentShader() {
|
|
57
|
+
export default function createRayTraceFragmentShader(...options) {
|
|
58
|
+
const research = researchTransport()?.fragment(options);
|
|
59
|
+
const enabled = research?.enabled ?? false;
|
|
60
|
+
const fragments = research?.fragments;
|
|
61
|
+
const materialBufferGlsl = createMaterialBufferGlsl(fragments);
|
|
62
|
+
const rayTraceCore = createRayTraceCoreGlsl(fragments);
|
|
63
|
+
const sampleMaterialGlsl = createSampleMaterialGlsl(fragments);
|
|
56
64
|
const intelMac = isIntelMac();
|
|
57
65
|
return new FragmentShader({
|
|
58
66
|
name: 'rayTraceFrag',
|
|
@@ -61,6 +69,9 @@ export default function createRayTraceFragmentShader() {
|
|
|
61
69
|
BOUNCES: 2
|
|
62
70
|
},
|
|
63
71
|
uniforms: {
|
|
72
|
+
emissiveLightData: Shader.uniform('sampler2D'), emissiveLightColumns: Shader.uniform('int'),
|
|
73
|
+
emissiveChoiceOffset: Shader.uniform('int'), emissiveChoiceCount: Shader.uniform('int'), emissivePmfOffset: Shader.uniform('int'),
|
|
74
|
+
emissiveWeightTotal: Shader.uniform('float', 0),
|
|
64
75
|
cameraApertureRadius: Shader.uniform('float', 0),
|
|
65
76
|
cameraFocusDistance: Shader.uniform('float', 10),
|
|
66
77
|
viewProjectionInv: Shader.uniform('mat4'),
|
|
@@ -68,12 +79,12 @@ export default function createRayTraceFragmentShader() {
|
|
|
68
79
|
transmissiveOutputAlphaMin: Shader.uniform('float'),
|
|
69
80
|
openPbrEnergyLut: Shader.uniform('sampler2D'),
|
|
70
81
|
viewportSize: Shader.uniform('vec2'),
|
|
71
|
-
|
|
82
|
+
spectralChannel: Shader.uniform('int', 0),
|
|
72
83
|
bevelEnabled: Shader.uniform('bool', true),
|
|
73
84
|
dispersionWavelengths: Shader.uniform('int', 3),
|
|
74
85
|
bounceLimit: Shader.uniform('int', 8)
|
|
75
86
|
},
|
|
76
|
-
includes: [rayTraceCore, materialBufferGlsl, intersect, random, envMap],
|
|
87
|
+
includes: [rayTraceCore, materialBufferGlsl, intersect, random, envMap, ...(research?.mixin ? [research.mixin] : [])],
|
|
77
88
|
main: glsl `
|
|
78
89
|
${commonGlsl}
|
|
79
90
|
|
|
@@ -91,13 +102,16 @@ ${intersect.main}
|
|
|
91
102
|
${envMap.main}
|
|
92
103
|
|
|
93
104
|
${samplingGlsl}
|
|
105
|
+
${spectrumGlsl}
|
|
94
106
|
${openPbrBsdfGlsl}
|
|
95
107
|
|
|
96
|
-
float
|
|
97
|
-
float
|
|
108
|
+
float qh;
|
|
109
|
+
float pathWavelength;
|
|
110
|
+
int qg;
|
|
111
|
+
int pathChannel;
|
|
98
112
|
|
|
99
113
|
${sampleLightGlsl}
|
|
100
|
-
${sampleMaterialGlsl}
|
|
114
|
+
${research?.declarations ?? ''}${sampleMaterialGlsl}
|
|
101
115
|
|
|
102
116
|
${cameraRayGlsl}
|
|
103
117
|
struct RayTraceAuxiliary {
|
|
@@ -109,8 +123,8 @@ bool isBlank;
|
|
|
109
123
|
bool isShadowCatcher;
|
|
110
124
|
};
|
|
111
125
|
|
|
112
|
-
void bounce(inout Path
|
|
113
|
-
|
|
126
|
+
void bounce(inout Path path, inout int depth, inout SurfaceInteraction si, inout OpenPbrResolvedMaterial mat, inout RayTraceAuxiliary outAux) {
|
|
127
|
+
samplingBounce = uint(max(depth, 0));
|
|
114
128
|
|
|
115
129
|
|
|
116
130
|
|
|
@@ -119,11 +133,11 @@ ${intelMac ? doubleTransmissionCheckCode : ''}
|
|
|
119
133
|
|
|
120
134
|
bool isShadowCatcher = mat.materialType == SHADOW_CATCHER;
|
|
121
135
|
if (isShadowCatcher) {
|
|
122
|
-
if (
|
|
136
|
+
if (path.fromEye) {
|
|
123
137
|
|
|
124
138
|
|
|
125
139
|
outAux.albedo = vec3(1.0);
|
|
126
|
-
outAux.normal = dot(si.normal,
|
|
140
|
+
outAux.normal = dot(si.normal, path.ray.d) > 0.0 ? -si.normal : si.normal;
|
|
127
141
|
si.hit = false;
|
|
128
142
|
outAux.isShadowCatcher = true;
|
|
129
143
|
}
|
|
@@ -131,69 +145,69 @@ else {
|
|
|
131
145
|
|
|
132
146
|
|
|
133
147
|
#ifdef USE_ENVMAP
|
|
134
|
-
if (
|
|
148
|
+
if (path.isNextRefraction) {
|
|
135
149
|
|
|
136
150
|
|
|
137
151
|
|
|
138
|
-
vec4 bg =
|
|
139
|
-
bg.rgb =
|
|
140
|
-
float
|
|
141
|
-
:
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
152
|
+
vec4 bg = cn(path.ray.o, path.ray.d);
|
|
153
|
+
bg.rgb = sampling_spectral_rgb_filter(bg.rgb, pathChannel);
|
|
154
|
+
float cM = path.scatteringIsDelta ? 1.0
|
|
155
|
+
: aF(path.scatteringPdf,
|
|
156
|
+
envMapPdf(cT(path.ray.d)) * envLightSelectionPmf);
|
|
157
|
+
path.li += cM * path.beta * bg.rgb * bg.a;
|
|
158
|
+
path.alpha = max(path.alpha, bg.a);
|
|
145
159
|
}
|
|
146
160
|
else {
|
|
147
|
-
vec2
|
|
148
|
-
vec3 emission = textureLinear(envMap,
|
|
149
|
-
emission =
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
161
|
+
vec2 vC = cT(path.ray.d);
|
|
162
|
+
vec3 emission = textureLinear(envMap, vC).rgb;
|
|
163
|
+
emission = sampling_spectral_rgb_filter(emission, pathChannel);
|
|
164
|
+
path.li += path.beta * emission *
|
|
165
|
+
aF(
|
|
166
|
+
path.scatteringPdf,
|
|
167
|
+
envMapPdf(vC) * envLightSelectionPmf
|
|
154
168
|
);
|
|
155
169
|
}
|
|
156
170
|
#else
|
|
157
|
-
vec4 bg =
|
|
158
|
-
bg.rgb =
|
|
159
|
-
|
|
171
|
+
vec4 bg = cn(path.ray.o, path.ray.d);
|
|
172
|
+
bg.rgb = sampling_spectral_rgb_filter(bg.rgb, pathChannel);
|
|
173
|
+
path.li += path.beta * bg.rgb * bg.a;
|
|
160
174
|
#endif
|
|
161
|
-
|
|
175
|
+
path.abort = true;
|
|
162
176
|
return;
|
|
163
177
|
}
|
|
164
178
|
}
|
|
165
179
|
|
|
166
180
|
if (!si.hit) {
|
|
167
181
|
|
|
168
|
-
vec4 bg =
|
|
182
|
+
vec4 bg = cn(path.ray.o, path.ray.d);
|
|
169
183
|
|
|
170
184
|
|
|
171
185
|
|
|
172
|
-
bg.rgb =
|
|
173
|
-
if (
|
|
174
|
-
|
|
175
|
-
|
|
186
|
+
bg.rgb = sampling_spectral_rgb_filter(bg.rgb, pathChannel);
|
|
187
|
+
if (path.fromEye) {
|
|
188
|
+
path.li = bg.rgb * bg.a;
|
|
189
|
+
path.alpha = bg.a;
|
|
176
190
|
|
|
177
191
|
outAux.isBlank = bg.a < 0.01;
|
|
178
192
|
}
|
|
179
193
|
else {
|
|
180
|
-
Ray cam =
|
|
181
|
-
bool
|
|
194
|
+
Ray cam = eT(v_Texcoord + te());
|
|
195
|
+
bool nt = dot(cam.d, path.ray.d) > 0.0;
|
|
182
196
|
if (transmissiveOutputAlphaMin < 1.0) {
|
|
183
|
-
if (
|
|
184
|
-
|
|
197
|
+
if (nt) {
|
|
198
|
+
path.alpha = max(path.alpha, bg.a);
|
|
185
199
|
} else {
|
|
186
|
-
|
|
200
|
+
path.alpha = 1.0;
|
|
187
201
|
}
|
|
188
202
|
}
|
|
189
203
|
#if !defined(USE_ENVMAP)
|
|
190
204
|
|
|
191
|
-
if (
|
|
192
|
-
|
|
205
|
+
if (nt) {
|
|
206
|
+
path.li += path.beta * aF(path.scatteringPdf, 1.0) * bg.rgb;
|
|
193
207
|
}
|
|
194
208
|
#endif
|
|
195
209
|
}
|
|
196
|
-
|
|
210
|
+
path.abort = true;
|
|
197
211
|
return;
|
|
198
212
|
}
|
|
199
213
|
|
|
@@ -202,22 +216,22 @@ if ((mat.materialType == STANDARD || mat.materialType == UNLIT)) {
|
|
|
202
216
|
if (transmissiveOutputAlphaMin < 1.0) {
|
|
203
217
|
|
|
204
218
|
float alpha = max(1.0 - mat.transmissionWeight, 1.0 - pow(1.0 - transmissiveOutputAlphaMin, float(depth)));
|
|
205
|
-
|
|
219
|
+
path.alpha = max(alpha, path.alpha);
|
|
206
220
|
}
|
|
207
221
|
float alpha = mat.alpha;
|
|
208
222
|
if (alpha < 1.0) {
|
|
209
223
|
|
|
210
224
|
|
|
211
|
-
|
|
212
|
-
if (
|
|
225
|
+
path.alpha = max(path.alpha, alpha);
|
|
226
|
+
if (ek(3u) > alpha) {
|
|
213
227
|
aJ = true;
|
|
214
228
|
}
|
|
215
229
|
}
|
|
216
230
|
if (!aJ) {
|
|
217
|
-
|
|
231
|
+
mx(si, mat, path);
|
|
218
232
|
}
|
|
219
233
|
else {
|
|
220
|
-
|
|
234
|
+
path.ray.o = si.position + path.ray.d * EPS;
|
|
221
235
|
}
|
|
222
236
|
}
|
|
223
237
|
|
|
@@ -245,38 +259,39 @@ si.albedoSampled = true;
|
|
|
245
259
|
#ifdef USE_RR
|
|
246
260
|
if (depth >= RR_MAX && !aJ) {
|
|
247
261
|
|
|
248
|
-
float
|
|
249
|
-
float q = max(0.0, 1.0 -
|
|
250
|
-
if (
|
|
262
|
+
float pc = max(max(path.beta.x, path.beta.y), path.beta.z);
|
|
263
|
+
float q = max(0.0, 1.0 - pc);
|
|
264
|
+
if (sample1D(bE(RUSSIAN_ROULETTE)) < q) {
|
|
251
265
|
|
|
252
266
|
|
|
253
|
-
|
|
254
|
-
|
|
267
|
+
path.alpha = 1.0;
|
|
268
|
+
path.abort = true;
|
|
255
269
|
}
|
|
256
270
|
else {
|
|
257
|
-
|
|
271
|
+
path.beta /= 1.0 - q;
|
|
258
272
|
}
|
|
259
273
|
}
|
|
260
274
|
#endif
|
|
261
275
|
|
|
262
|
-
if (
|
|
276
|
+
if (path.abort) {
|
|
263
277
|
return;
|
|
264
278
|
}
|
|
265
279
|
|
|
266
280
|
|
|
267
|
-
intersectScene(
|
|
268
|
-
|
|
281
|
+
intersectScene(path.ray, si, true);
|
|
282
|
+
getMaterial(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
269
283
|
si.isTransparency = mat.transmissionWeight > 0.001 || mat.subsurfaceWeight > 0.001 || mat.alpha < 0.999;
|
|
270
284
|
|
|
271
285
|
|
|
272
286
|
|
|
273
287
|
|
|
274
288
|
if (dispersionWavelengths == 1 && si.hit && mat.transmissionWeight > 0.001 && mat.transmissionDispersionScale > 0.001) {
|
|
275
|
-
|
|
289
|
+
pathWavelength = qh;
|
|
290
|
+
pathChannel = qg;
|
|
276
291
|
}
|
|
277
|
-
if (mat.transmissionWeight > 0.001 &&
|
|
278
|
-
mat.specularIor =
|
|
279
|
-
|
|
292
|
+
if (mat.transmissionWeight > 0.001 && pathWavelength > 0.0) {
|
|
293
|
+
mat.specularIor = sampling_cauchy_ior(
|
|
294
|
+
pathWavelength,
|
|
280
295
|
mat.specularIor,
|
|
281
296
|
mat.transmissionDispersionScale,
|
|
282
297
|
mat.dispersionAbbeNumber
|
|
@@ -287,56 +302,56 @@ if (aJ) {
|
|
|
287
302
|
return;
|
|
288
303
|
}
|
|
289
304
|
|
|
290
|
-
bool
|
|
305
|
+
bool ht = ek(3u) < mat.alpha;
|
|
291
306
|
#ifdef NUM_LIGHTS
|
|
292
307
|
|
|
293
308
|
LightSampleRec lightSample;
|
|
294
309
|
for (int i = 0; i < NUM_LIGHTS; i++) {
|
|
295
310
|
|
|
296
|
-
Light light =
|
|
297
|
-
float d =
|
|
298
|
-
bool
|
|
299
|
-
if (d != INF && !(
|
|
311
|
+
Light light = fetchLight(i);
|
|
312
|
+
float d = mX(path.ray, light, lightSample);
|
|
313
|
+
bool lH = si.hit && d > distance(si.position, path.ray.o);
|
|
314
|
+
if (d != INF && !(lH && ht)) {
|
|
300
315
|
lightSample.pdf *= light.selectionPmf;
|
|
301
|
-
float
|
|
302
|
-
lightSample.emission =
|
|
303
|
-
|
|
316
|
+
float misWeight = aF(path.scatteringPdf, lightSample.pdf);
|
|
317
|
+
lightSample.emission = sampling_spectral_rgb_filter(lightSample.emission, pathChannel);
|
|
318
|
+
${enabled ? 'if (!causticHitOwned(path)) { ' : ''}path.li += misWeight * path.beta * lightSample.emission;${enabled ? ' }' : ''}
|
|
304
319
|
|
|
305
|
-
|
|
306
|
-
|
|
320
|
+
path.alpha = 1.0;
|
|
321
|
+
path.abort = true;
|
|
307
322
|
}
|
|
308
323
|
}
|
|
309
324
|
#endif
|
|
310
325
|
|
|
311
326
|
#ifdef USE_ENVMAP
|
|
312
|
-
if (!(si.hit &&
|
|
313
|
-
if (
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
vec4 bg =
|
|
317
|
-
bg.rgb =
|
|
318
|
-
float
|
|
319
|
-
:
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
327
|
+
if (!(si.hit && ht)) {
|
|
328
|
+
if (path.isNextRefraction) {
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
vec4 bg = cn(path.ray.o, path.ray.d);
|
|
332
|
+
bg.rgb = sampling_spectral_rgb_filter(bg.rgb, pathChannel);
|
|
333
|
+
float cM = path.scatteringIsDelta ? 1.0
|
|
334
|
+
: aF(path.scatteringPdf,
|
|
335
|
+
envMapPdf(cT(path.ray.d)) * envLightSelectionPmf);
|
|
336
|
+
path.li += cM * path.beta * bg.rgb * bg.a;
|
|
337
|
+
path.alpha = max(path.alpha, bg.a);
|
|
338
|
+
path.abort = true;
|
|
324
339
|
return;
|
|
325
340
|
}
|
|
326
|
-
vec2 uv =
|
|
341
|
+
vec2 uv = cT(path.ray.d);
|
|
327
342
|
vec3 emission = textureLinear(envMap, uv).rgb;
|
|
328
|
-
float
|
|
329
|
-
|
|
330
|
-
|
|
343
|
+
float misWeight = aF(
|
|
344
|
+
path.scatteringPdf,
|
|
345
|
+
envMapPdf(uv) * envLightSelectionPmf
|
|
331
346
|
);
|
|
332
|
-
emission =
|
|
333
|
-
|
|
347
|
+
emission = sampling_spectral_rgb_filter(emission, pathChannel);
|
|
348
|
+
path.li += path.beta * emission * misWeight;
|
|
334
349
|
|
|
335
350
|
|
|
336
351
|
#if !defined(USE_BACKGROUND)
|
|
337
|
-
|
|
352
|
+
path.alpha = 1.0;
|
|
338
353
|
#endif
|
|
339
|
-
|
|
354
|
+
path.abort = true;
|
|
340
355
|
return;
|
|
341
356
|
}
|
|
342
357
|
#endif
|
|
@@ -345,177 +360,179 @@ depth++;
|
|
|
345
360
|
}
|
|
346
361
|
|
|
347
362
|
|
|
348
|
-
vec2
|
|
363
|
+
vec2 kK(float radius, float xi) {
|
|
349
364
|
float x = 0.25;
|
|
350
|
-
for (int
|
|
365
|
+
for (int iteration = 0; iteration < 10; iteration++) {
|
|
351
366
|
float x2 = x * x;
|
|
352
367
|
float x3 = x2 * x;
|
|
353
|
-
float
|
|
368
|
+
float la = 1.0 - x;
|
|
354
369
|
float value = 10.0 * x2 - 20.0 * x3 + 15.0 * x2 * x2 -
|
|
355
370
|
4.0 * x2 * x3 - xi;
|
|
356
|
-
float
|
|
357
|
-
if (abs(value) < 1e-6 ||
|
|
358
|
-
x = clamp(x - value /
|
|
371
|
+
float mJ = 20.0 * x * la * la * la;
|
|
372
|
+
if (abs(value) < 1e-6 || mJ == 0.0) break;
|
|
373
|
+
x = clamp(x - value / mJ, 0.0, 1.0);
|
|
359
374
|
}
|
|
360
|
-
float
|
|
375
|
+
float jr = x * radius;
|
|
361
376
|
return vec2(
|
|
362
|
-
|
|
363
|
-
sqrt(max(radius * radius -
|
|
377
|
+
jr,
|
|
378
|
+
sqrt(max(radius * radius - jr * jr, 0.0))
|
|
364
379
|
);
|
|
365
380
|
}
|
|
366
381
|
|
|
367
|
-
float
|
|
368
|
-
if (
|
|
369
|
-
float
|
|
370
|
-
return
|
|
382
|
+
float bevelCubicPdf(float radius, float gu) {
|
|
383
|
+
if (gu >= radius) return 0.0;
|
|
384
|
+
float falloff = radius - gu;
|
|
385
|
+
return falloff * falloff * falloff;
|
|
371
386
|
}
|
|
372
387
|
|
|
373
388
|
|
|
374
|
-
vec3
|
|
389
|
+
vec3 mT(SurfaceInteraction source, float radius) {
|
|
375
390
|
vec3 geometricNormal = source.faceNormal;
|
|
376
391
|
if (dot(geometricNormal, source.vertexNormal) < 0.0) geometricNormal = -geometricNormal;
|
|
377
392
|
vec3 tangent;
|
|
378
393
|
vec3 bitangent;
|
|
379
|
-
|
|
380
|
-
vec3
|
|
381
|
-
|
|
382
|
-
for (int
|
|
383
|
-
vec2
|
|
384
|
-
float
|
|
385
|
-
float
|
|
386
|
-
vec3
|
|
387
|
-
vec3
|
|
388
|
-
vec3
|
|
389
|
-
float
|
|
390
|
-
float
|
|
391
|
-
float
|
|
392
|
-
if (
|
|
393
|
-
|
|
394
|
-
}
|
|
395
|
-
else if (
|
|
396
|
-
vec3
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
394
|
+
sampling_orthonormal_basis(geometricNormal, tangent, bitangent);
|
|
395
|
+
vec3 iE = vec3(0.0);
|
|
396
|
+
|
|
397
|
+
for (int ih = 0; ih < BEVEL_SAMPLES; ih++) {
|
|
398
|
+
vec2 qa = sample2D(CAMERA_BEVEL_BASE + uint(ih));
|
|
399
|
+
float cr = qa.x;
|
|
400
|
+
float pj = qa.y;
|
|
401
|
+
vec3 cZ = geometricNormal;
|
|
402
|
+
vec3 fI = tangent;
|
|
403
|
+
vec3 eh = bitangent;
|
|
404
|
+
float ge = 0.5;
|
|
405
|
+
float hW = 0.25;
|
|
406
|
+
float gC = 0.25;
|
|
407
|
+
if (cr < 0.5) {
|
|
408
|
+
cr *= 2.0;
|
|
409
|
+
}
|
|
410
|
+
else if (cr < 0.75) {
|
|
411
|
+
vec3 nr = cZ;
|
|
412
|
+
cZ = fI;
|
|
413
|
+
fI = nr;
|
|
414
|
+
ge = 0.25;
|
|
415
|
+
hW = 0.5;
|
|
416
|
+
cr = (cr - 0.5) * 4.0;
|
|
402
417
|
}
|
|
403
418
|
else {
|
|
404
|
-
vec3
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
vec2
|
|
413
|
-
float phi = TWOPI *
|
|
414
|
-
vec3
|
|
415
|
-
(cos(phi) *
|
|
419
|
+
vec3 nr = cZ;
|
|
420
|
+
cZ = eh;
|
|
421
|
+
eh = nr;
|
|
422
|
+
ge = 0.25;
|
|
423
|
+
gC = 0.5;
|
|
424
|
+
cr = (cr - 0.75) * 4.0;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
vec2 gQ = kK(radius, pj);
|
|
428
|
+
float phi = TWOPI * cr;
|
|
429
|
+
vec3 rr = gQ.x *
|
|
430
|
+
(cos(phi) * fI + sin(phi) * eh);
|
|
416
431
|
Ray ray;
|
|
417
|
-
|
|
432
|
+
initRay(
|
|
418
433
|
ray,
|
|
419
|
-
source.position +
|
|
420
|
-
-
|
|
434
|
+
source.position + cZ * gQ.y + rr,
|
|
435
|
+
-cZ
|
|
421
436
|
);
|
|
422
437
|
SurfaceInteraction hit;
|
|
423
438
|
intersectSceneBevel(
|
|
424
439
|
ray,
|
|
425
440
|
hit,
|
|
426
441
|
source.instanceIndex,
|
|
427
|
-
max(2.0 *
|
|
442
|
+
max(2.0 * gQ.y, EPS)
|
|
428
443
|
);
|
|
429
444
|
if (!hit.hit) continue;
|
|
430
445
|
|
|
431
|
-
float
|
|
432
|
-
float
|
|
433
|
-
float
|
|
434
|
-
float weight =
|
|
435
|
-
|
|
436
|
-
|
|
446
|
+
float lc = ge * abs(dot(cZ, hit.faceNormal));
|
|
447
|
+
float nj = hW * abs(dot(fI, hit.faceNormal));
|
|
448
|
+
float kj = gC * abs(dot(eh, hit.faceNormal));
|
|
449
|
+
float weight = lc / max(
|
|
450
|
+
lc * lc + nj * nj +
|
|
451
|
+
kj * kj,
|
|
437
452
|
1e-8
|
|
438
453
|
);
|
|
439
|
-
weight *=
|
|
440
|
-
max(
|
|
441
|
-
|
|
454
|
+
weight *= bevelCubicPdf(radius, distance(hit.position, source.position)) /
|
|
455
|
+
max(bevelCubicPdf(radius, gQ.x), 1e-8);
|
|
456
|
+
iE += weight * hit.vertexNormal;
|
|
442
457
|
}
|
|
443
458
|
|
|
444
|
-
if (dot(
|
|
445
|
-
vec3
|
|
446
|
-
vec3 result = source.normal +
|
|
459
|
+
if (dot(iE, iE) <= 1e-12) return source.normal;
|
|
460
|
+
vec3 jM = normalize(iE);
|
|
461
|
+
vec3 result = source.normal + jM - source.vertexNormal;
|
|
447
462
|
return dot(result, result) > 1e-12 ? normalize(result) : source.normal;
|
|
448
463
|
}
|
|
449
464
|
|
|
450
|
-
vec4
|
|
451
|
-
Path
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
465
|
+
vec4 cG(SurfaceInteraction si, Ray ray, OpenPbrResolvedMaterial mat, inout RayTraceAuxiliary outAux) {
|
|
466
|
+
Path path;
|
|
467
|
+
path.ray = ray;
|
|
468
|
+
path.li = vec3(0);
|
|
469
|
+
path.alpha = transmissiveOutputAlphaMin < 1.0 ? 0.0 : 1.0;
|
|
470
|
+
path.beta = vec3(1.0);
|
|
471
|
+
path.fromEye = true;${enabled ? /* glsl */ `
|
|
472
|
+
path.causticK = 0; path.causticSingleT = false;
|
|
473
|
+
path.causticReceiverPrimary = false; path.causticHasReceiver = false; path.causticMneeReceiver=false;` : ''}
|
|
474
|
+
path.scatteringPdf = 0.0;
|
|
475
|
+
path.scatteringIsDelta = false;
|
|
476
|
+
path.isNextRefraction = false;
|
|
477
|
+
path.abort = false;
|
|
461
478
|
int depth = 0;
|
|
462
479
|
${intelMac ? bounceCodeOnIntelMac : bounceCodeOnOther}
|
|
463
|
-
return vec4(
|
|
480
|
+
return vec4(path.li, path.alpha);
|
|
464
481
|
}
|
|
465
482
|
|
|
466
|
-
vec4
|
|
483
|
+
vec4 iC(SurfaceInteraction si, Ray ray, OpenPbrResolvedMaterial mat, inout RayTraceAuxiliary outAux) {
|
|
467
484
|
float coverage = clamp(mat.alpha, 0.0, 1.0);
|
|
468
485
|
if (!si.hit || (mat.materialType != STANDARD && mat.materialType != UNLIT) || coverage >= 1.0) {
|
|
469
|
-
return
|
|
486
|
+
return cG(si, ray, mat, outAux);
|
|
470
487
|
}
|
|
471
488
|
|
|
472
489
|
|
|
473
490
|
|
|
474
491
|
|
|
475
492
|
|
|
476
|
-
Ray
|
|
477
|
-
|
|
478
|
-
SurfaceInteraction
|
|
479
|
-
|
|
480
|
-
intersectScene(
|
|
481
|
-
OpenPbrResolvedMaterial
|
|
482
|
-
|
|
483
|
-
RayTraceAuxiliary
|
|
484
|
-
if (
|
|
485
|
-
|
|
493
|
+
Ray uK = ray;
|
|
494
|
+
uK.o = si.position + ray.d * (EPS * 0.02);
|
|
495
|
+
SurfaceInteraction jL = si;
|
|
496
|
+
jL.albedoSampled = false;
|
|
497
|
+
intersectScene(uK, jL, false);
|
|
498
|
+
OpenPbrResolvedMaterial oH;
|
|
499
|
+
getMaterial(oH, jL.materialIndex, jL.uv, jL.uv1, jL.instanceIndex, jL.vertexColor);
|
|
500
|
+
RayTraceAuxiliary eg = outAux;
|
|
501
|
+
if (jL.hit && (oH.materialType == STANDARD || oH.materialType == UNLIT)) {
|
|
502
|
+
eg.albedo = oH.transmissionWeight > 0.5
|
|
486
503
|
? vec3(1.0)
|
|
487
|
-
:
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
504
|
+
: oH.baseColor;
|
|
505
|
+
eg.normal = dot(
|
|
506
|
+
jL.normal,
|
|
507
|
+
jL.position - vec3(viewInv[3])
|
|
491
508
|
) > 0.0
|
|
492
|
-
? -
|
|
493
|
-
:
|
|
494
|
-
|
|
509
|
+
? -jL.normal
|
|
510
|
+
: jL.normal;
|
|
511
|
+
jL.albedoSampled = oH.transmissionWeight > 0.5;
|
|
495
512
|
}
|
|
496
|
-
vec4 back =
|
|
513
|
+
vec4 back = cG(jL, uK, oH, eg);
|
|
497
514
|
if (coverage <= 0.0) {
|
|
498
|
-
outAux =
|
|
515
|
+
outAux = eg;
|
|
499
516
|
return back;
|
|
500
517
|
}
|
|
501
518
|
|
|
502
|
-
SurfaceInteraction
|
|
503
|
-
OpenPbrResolvedMaterial
|
|
504
|
-
|
|
505
|
-
RayTraceAuxiliary
|
|
506
|
-
vec4 front =
|
|
507
|
-
outAux.albedo = mix(
|
|
508
|
-
vec3
|
|
509
|
-
outAux.normal = dot(
|
|
510
|
-
? normalize(
|
|
519
|
+
SurfaceInteraction yc = si;
|
|
520
|
+
OpenPbrResolvedMaterial vD = mat;
|
|
521
|
+
vD.alpha = 1.0;
|
|
522
|
+
RayTraceAuxiliary sa = outAux;
|
|
523
|
+
vec4 front = cG(yc, ray, vD, sa);
|
|
524
|
+
outAux.albedo = mix(eg.albedo, sa.albedo, coverage);
|
|
525
|
+
vec3 cS = mix(eg.normal, sa.normal, coverage);
|
|
526
|
+
outAux.normal = dot(cS, cS) > 1e-12
|
|
527
|
+
? normalize(cS)
|
|
511
528
|
: vec3(0.0);
|
|
512
|
-
outAux.isBlank =
|
|
529
|
+
outAux.isBlank = eg.isBlank && sa.isBlank;
|
|
513
530
|
return mix(back, front, coverage);
|
|
514
531
|
}
|
|
515
532
|
|
|
516
533
|
|
|
517
534
|
|
|
518
|
-
vec4
|
|
535
|
+
vec4 hR(Ray ray, out RayTraceAuxiliary outAux) {
|
|
519
536
|
|
|
520
537
|
SurfaceInteraction si;
|
|
521
538
|
OpenPbrResolvedMaterial mat;
|
|
@@ -529,12 +546,12 @@ si.mediumAnisotropy = 0.0;
|
|
|
529
546
|
#endif
|
|
530
547
|
|
|
531
548
|
intersectScene(ray, si, false);
|
|
532
|
-
|
|
549
|
+
getMaterial(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
533
550
|
si.isTransparency = mat.transmissionWeight > 0.001 || mat.subsurfaceWeight > 0.001 || mat.alpha < 0.999;
|
|
534
551
|
|
|
535
552
|
#ifdef HAS_BEVEL
|
|
536
553
|
if (bevelEnabled && mat.bevel > 0.0) {
|
|
537
|
-
si.normal =
|
|
554
|
+
si.normal = mT(si, mat.bevel);
|
|
538
555
|
}
|
|
539
556
|
#endif
|
|
540
557
|
|
|
@@ -551,32 +568,38 @@ si.albedoSampled = mat.transmissionWeight > 0.5;
|
|
|
551
568
|
}
|
|
552
569
|
|
|
553
570
|
if (mat.transmissionDispersionScale > 0.001) {
|
|
554
|
-
mat.specularIor =
|
|
555
|
-
|
|
571
|
+
mat.specularIor = sampling_cauchy_ior(
|
|
572
|
+
pathWavelength,
|
|
556
573
|
mat.specularIor,
|
|
557
574
|
mat.transmissionDispersionScale,
|
|
558
575
|
mat.dispersionAbbeNumber
|
|
559
576
|
);
|
|
560
577
|
}
|
|
561
|
-
return
|
|
578
|
+
return iC(si, ray, mat, outAux);
|
|
562
579
|
}
|
|
563
580
|
|
|
564
581
|
void main() {
|
|
565
582
|
|
|
566
|
-
|
|
567
|
-
|
|
583
|
+
${fragments?.debugInit ?? ''} rA();
|
|
584
|
+
fi(v_Texcoord * viewportSize, int(uint(sampleCount) ^ cB(uint(sequenceSeed))));
|
|
568
585
|
|
|
569
586
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
if (
|
|
573
|
-
float
|
|
574
|
-
|
|
587
|
+
pathWavelength = 0.0;
|
|
588
|
+
pathChannel = 0;
|
|
589
|
+
if (spectralChannel > 0) {
|
|
590
|
+
float aZ = sample1D(CAMERA_WAVELENGTH);
|
|
591
|
+
if (dispersionWavelengths == 1) {
|
|
592
|
+
qg = min(int(aZ * 3.0), 2) + 1;
|
|
593
|
+
qh = cU(qg - 1, fract(aZ * 3.0));
|
|
594
|
+
} else {
|
|
595
|
+
pathChannel = spectralChannel;
|
|
596
|
+
pathWavelength = cU(spectralChannel - 1, aZ);
|
|
597
|
+
}
|
|
575
598
|
}
|
|
576
599
|
|
|
577
600
|
|
|
578
601
|
|
|
579
|
-
Ray cam =
|
|
602
|
+
Ray cam = ow();
|
|
580
603
|
|
|
581
604
|
RayTraceAuxiliary outAux;
|
|
582
605
|
outAux.albedo = vec3(0.0);
|
|
@@ -584,38 +607,38 @@ outAux.normal = vec3(0.0);
|
|
|
584
607
|
outAux.isBlank = false;
|
|
585
608
|
outAux.isShadowCatcher = false;
|
|
586
609
|
|
|
587
|
-
vec4
|
|
610
|
+
vec4 liAndAlpha = hR(cam, outAux);
|
|
588
611
|
|
|
589
612
|
|
|
590
613
|
|
|
591
614
|
#ifdef CLAMPING
|
|
592
615
|
float clamping = float(CLAMPING);
|
|
593
|
-
|
|
616
|
+
liAndAlpha.rgb = clamp(liAndAlpha.rgb, -clamping, clamping);
|
|
594
617
|
#endif
|
|
595
618
|
|
|
596
619
|
|
|
597
|
-
if (
|
|
620
|
+
if (pathWavelength > 0.0) {
|
|
598
621
|
|
|
599
|
-
|
|
622
|
+
liAndAlpha.rgb *= 3.0;
|
|
600
623
|
if (dispersionWavelengths != 1) {
|
|
601
624
|
|
|
602
625
|
|
|
603
|
-
|
|
626
|
+
liAndAlpha.a /= 3.0;
|
|
604
627
|
}
|
|
605
628
|
}
|
|
606
|
-
if (!(
|
|
607
|
-
|
|
629
|
+
if (!(liAndAlpha.x < INF && liAndAlpha.x > -EPS)) {
|
|
630
|
+
liAndAlpha = vec4(0, 0, 0, 1);
|
|
608
631
|
}
|
|
609
632
|
|
|
610
|
-
out_color =
|
|
633
|
+
out_color = ${research?.debugOutput || 'liAndAlpha'};
|
|
611
634
|
out_albedo = vec4(outAux.albedo, outAux.isBlank ? 0.0 : 1.0);
|
|
612
635
|
out_normal = vec4(outAux.normal, 1.0);
|
|
613
636
|
|
|
614
637
|
|
|
615
|
-
float
|
|
638
|
+
float jw = dot(liAndAlpha.rgb, vec3(0.2126, 0.7152, 0.0722));
|
|
616
639
|
out_moments = outAux.isShadowCatcher
|
|
617
640
|
? vec4(0.0)
|
|
618
|
-
: vec4(
|
|
641
|
+
: vec4(jw, jw * jw, 1.0, 0.0);
|
|
619
642
|
|
|
620
643
|
}`
|
|
621
644
|
});
|