@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
|
@@ -6,31 +6,31 @@ import { INSTANCE_VEC4_STRIDE } from '../../bvhAccel.js';
|
|
|
6
6
|
import { createShaderMixin, glsl, Shader } from '../../shader.js';
|
|
7
7
|
function getBVHTraverseCode(handleHitCode, skipTriangleCode = '', initialTMax = 'RAY_MAX_DISTANCE') {
|
|
8
8
|
const intersectTriangles = glsl `
|
|
9
|
-
ivec3 vertexOffset = ivec3(floatBitsToInt(
|
|
9
|
+
ivec3 vertexOffset = ivec3(floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).y));
|
|
10
10
|
for (int k = 0; k < primitiveCount; k++) {
|
|
11
11
|
int triangleIndex = primitiveOffset + k;
|
|
12
12
|
${skipTriangleCode}
|
|
13
|
-
vec4 r3 =
|
|
13
|
+
vec4 r3 = fetchBVH(triangleIndex);
|
|
14
14
|
ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
fw tri = fw(
|
|
16
|
+
fetchData(positionBuffer, index.x, vertexColumns).xyz,
|
|
17
|
+
fetchData(positionBuffer, index.y, vertexColumns).xyz,
|
|
18
|
+
fetchData(positionBuffer, index.z, vertexColumns).xyz
|
|
19
19
|
);
|
|
20
|
-
|
|
20
|
+
ev hit = fM(o, d, tri, dZ, gH, tMax);
|
|
21
21
|
|
|
22
22
|
if (hit.t > 0.0) {
|
|
23
23
|
tMax = hit.t;
|
|
24
24
|
vec3 e1 = tri.p1 - tri.p0;
|
|
25
25
|
vec3 e2 = tri.p2 - tri.p0;
|
|
26
26
|
vec3 faceNormal = normalize(cross(e1, e2));
|
|
27
|
-
int
|
|
28
|
-
floatBitsToInt(
|
|
27
|
+
int ku = int(af(
|
|
28
|
+
floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)
|
|
29
29
|
).x);
|
|
30
|
-
bool
|
|
31
|
-
|
|
30
|
+
bool iL = fetchMatData(
|
|
31
|
+
ku * MAT_DATA_SIZE + MAT_ROW_ALPHA
|
|
32
32
|
).z > 0.5;
|
|
33
|
-
if (!doubleSided && !
|
|
33
|
+
if (!doubleSided && !iL && dot(faceNormal, d) > 0.0) {
|
|
34
34
|
continue;
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -41,257 +41,257 @@ ${handleHitCode}
|
|
|
41
41
|
return glsl `
|
|
42
42
|
ivec2 stack[STACK_SIZE];
|
|
43
43
|
int top = -1;
|
|
44
|
-
int
|
|
44
|
+
int ug = -1;
|
|
45
45
|
float tMax = ${initialTMax};
|
|
46
46
|
|
|
47
47
|
vec3 o = ray.o;
|
|
48
48
|
vec3 d = ray.d;
|
|
49
49
|
|
|
50
|
-
bool
|
|
51
|
-
vec3
|
|
52
|
-
vec3
|
|
53
|
-
ivec3
|
|
50
|
+
bool sd = false;
|
|
51
|
+
vec3 hz;
|
|
52
|
+
vec3 aw;
|
|
53
|
+
ivec3 hr;
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
fw lR;
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
top = 0;
|
|
59
59
|
stack[0] = ivec2(0, -1);
|
|
60
60
|
|
|
61
|
-
int
|
|
62
|
-
while(top >= 0 &&
|
|
63
|
-
|
|
61
|
+
int yK = 0;
|
|
62
|
+
while(top >= 0 && yK < 5000) {
|
|
63
|
+
yK++;
|
|
64
64
|
ivec2 node = stack[top--];
|
|
65
65
|
|
|
66
|
-
int
|
|
66
|
+
int bK = node.y;
|
|
67
67
|
|
|
68
|
-
if (
|
|
69
|
-
if (
|
|
68
|
+
if (bK != ug) {
|
|
69
|
+
if (bK < 0) {
|
|
70
70
|
o = ray.o;
|
|
71
71
|
d = ray.d;
|
|
72
72
|
}
|
|
73
73
|
else {
|
|
74
74
|
mat4 w2l = mat4(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 1),
|
|
76
|
+
fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 2),
|
|
77
|
+
fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
78
|
+
fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
79
79
|
);
|
|
80
80
|
o = (w2l * vec4(ray.o, 1.0)).xyz;
|
|
81
81
|
d = (w2l * vec4(ray.d, 0.0)).xyz;
|
|
82
82
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
dZ = maxDimension(abs(d));
|
|
84
|
+
gH = mU(d, dZ);
|
|
85
|
+
ug = bK;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
int
|
|
89
|
-
uint
|
|
90
|
-
int
|
|
91
|
-
int
|
|
88
|
+
int bufferOff = bK < 0 ? 0 : blasOffset;
|
|
89
|
+
uint fK = bK < 0 ? 0u : floatBitsToUint(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).x);
|
|
90
|
+
int gN = int(fK >> 30u);
|
|
91
|
+
int eQ = int(fK & 0x3fffffffu);
|
|
92
92
|
int primitiveCount = 0;
|
|
93
93
|
int primitiveOffset = 0;
|
|
94
94
|
|
|
95
|
-
if (
|
|
96
|
-
uint
|
|
97
|
-
if ((
|
|
98
|
-
primitiveCount = int((
|
|
99
|
-
primitiveOffset =
|
|
95
|
+
if (gN == 3) {
|
|
96
|
+
uint hT = uint(node.x);
|
|
97
|
+
if ((hT & 0x80000000u) != 0u) {
|
|
98
|
+
primitiveCount = int((hT >> 23u) & 0xffu);
|
|
99
|
+
primitiveOffset = bufferOff + eQ + int(hT & 0x007fffffu);
|
|
100
100
|
}
|
|
101
101
|
else {
|
|
102
|
-
int i = node.x +
|
|
103
|
-
vec4
|
|
104
|
-
vec4
|
|
105
|
-
vec4
|
|
106
|
-
vec4
|
|
107
|
-
vec4
|
|
108
|
-
uint header = floatBitsToUint(
|
|
109
|
-
int
|
|
110
|
-
int
|
|
111
|
-
int
|
|
112
|
-
vec3
|
|
113
|
-
uintBitsToFloat(uint(
|
|
114
|
-
uintBitsToFloat(uint(
|
|
115
|
-
uintBitsToFloat(uint(
|
|
102
|
+
int i = node.x + bufferOff;
|
|
103
|
+
vec4 jF = fetchBVH(i);
|
|
104
|
+
vec4 fF = fetchBVH(i + 1);
|
|
105
|
+
vec4 nI = fetchBVH(i + 2);
|
|
106
|
+
vec4 nJ = fetchBVH(i + 3);
|
|
107
|
+
vec4 nK = fetchBVH(i + 4);
|
|
108
|
+
uint header = floatBitsToUint(jF.w);
|
|
109
|
+
int sD = int(header << 24u) >> 24;
|
|
110
|
+
int sE = int((header >> 8u) << 24u) >> 24;
|
|
111
|
+
int sF = int((header >> 16u) << 24u) >> 24;
|
|
112
|
+
vec3 hG = vec3(
|
|
113
|
+
uintBitsToFloat(uint(sD + 127) << 23u),
|
|
114
|
+
uintBitsToFloat(uint(sE + 127) << 23u),
|
|
115
|
+
uintBitsToFloat(uint(sF + 127) << 23u)
|
|
116
116
|
);
|
|
117
|
-
uint childBase = floatBitsToUint(
|
|
118
|
-
uint
|
|
117
|
+
uint childBase = floatBitsToUint(fF.x);
|
|
118
|
+
uint ps = floatBitsToUint(fF.y);
|
|
119
119
|
uint internalMask = header >> 24u;
|
|
120
|
-
uint
|
|
120
|
+
uint wm = (d.x < 0.0 ? 4u : 0u) |
|
|
121
121
|
(d.y < 0.0 ? 2u : 0u) |
|
|
122
122
|
(d.z < 0.0 ? 1u : 0u);
|
|
123
|
-
uint
|
|
124
|
-
floatBitsToUint(
|
|
125
|
-
floatBitsToUint(
|
|
126
|
-
floatBitsToUint(
|
|
127
|
-
floatBitsToUint(
|
|
128
|
-
floatBitsToUint(
|
|
129
|
-
floatBitsToUint(
|
|
123
|
+
uint gF[12] = uint[12](
|
|
124
|
+
floatBitsToUint(nI.x), floatBitsToUint(nI.y),
|
|
125
|
+
floatBitsToUint(nI.z), floatBitsToUint(nI.w),
|
|
126
|
+
floatBitsToUint(nJ.x), floatBitsToUint(nJ.y),
|
|
127
|
+
floatBitsToUint(nJ.z), floatBitsToUint(nJ.w),
|
|
128
|
+
floatBitsToUint(nK.x), floatBitsToUint(nK.y),
|
|
129
|
+
floatBitsToUint(nK.z), floatBitsToUint(nK.w)
|
|
130
130
|
);
|
|
131
131
|
|
|
132
132
|
for (int order = 7; order >= 0; order--) {
|
|
133
|
-
uint slot = uint(order) ^
|
|
134
|
-
uint
|
|
135
|
-
? floatBitsToUint(
|
|
136
|
-
: floatBitsToUint(
|
|
137
|
-
uint meta = (
|
|
133
|
+
uint slot = uint(order) ^ wm;
|
|
134
|
+
uint tW = slot >= 4u
|
|
135
|
+
? floatBitsToUint(fF.w)
|
|
136
|
+
: floatBitsToUint(fF.z);
|
|
137
|
+
uint meta = (tW >> ((slot & 3u) * 8u)) & 0xffu;
|
|
138
138
|
if (meta == 0u) continue;
|
|
139
|
-
uint
|
|
140
|
-
uint
|
|
141
|
-
vec3
|
|
142
|
-
float((
|
|
143
|
-
float((
|
|
144
|
-
float((
|
|
139
|
+
uint mt = (slot & 3u) * 8u;
|
|
140
|
+
uint lh = slot >> 2u;
|
|
141
|
+
vec3 ve = vec3(
|
|
142
|
+
float((gF[lh] >> mt) & 0xffu),
|
|
143
|
+
float((gF[2u + lh] >> mt) & 0xffu),
|
|
144
|
+
float((gF[4u + lh] >> mt) & 0xffu)
|
|
145
145
|
);
|
|
146
|
-
vec3
|
|
147
|
-
float((
|
|
148
|
-
float((
|
|
149
|
-
float((
|
|
146
|
+
vec3 vd = vec3(
|
|
147
|
+
float((gF[6u + lh] >> mt) & 0xffu),
|
|
148
|
+
float((gF[8u + lh] >> mt) & 0xffu),
|
|
149
|
+
float((gF[10u + lh] >> mt) & 0xffu)
|
|
150
150
|
);
|
|
151
|
-
vec3
|
|
152
|
-
vec3
|
|
153
|
-
if (
|
|
154
|
-
uint
|
|
155
|
-
if (
|
|
156
|
-
uint
|
|
157
|
-
uint
|
|
151
|
+
vec3 xn = jF.xyz + ve * hG;
|
|
152
|
+
vec3 xm = jF.xyz + vd * hG;
|
|
153
|
+
if (cH(o, d, xn, xm, tMax) <= 0.0) continue;
|
|
154
|
+
uint jH = meta & 0x1fu;
|
|
155
|
+
if (jH >= 24u) {
|
|
156
|
+
uint oa = internalMask & ((1u << slot) - 1u);
|
|
157
|
+
uint ur = childBase + rT(oa);
|
|
158
158
|
stack[++top] = ivec2(
|
|
159
|
-
|
|
159
|
+
eQ + int(ur * 5u), bK
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
162
|
else {
|
|
163
|
-
uint triangleCount =
|
|
164
|
-
uint
|
|
165
|
-
uint
|
|
163
|
+
uint triangleCount = rT(meta >> 5u);
|
|
164
|
+
uint sT = ps + jH;
|
|
165
|
+
uint xC = 0x80000000u |
|
|
166
166
|
(triangleCount << 23u) |
|
|
167
|
-
(
|
|
168
|
-
stack[++top] = ivec2(int(
|
|
167
|
+
(sT & 0x007fffffu);
|
|
168
|
+
stack[++top] = ivec2(int(xC), bK);
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
-
else if (
|
|
174
|
-
int i = node.x +
|
|
175
|
-
vec4
|
|
176
|
-
vec4
|
|
177
|
-
vec4
|
|
178
|
-
vec4
|
|
179
|
-
primitiveCount = int(floatBitsToUint(
|
|
173
|
+
else if (gN == 2) {
|
|
174
|
+
int i = node.x + bufferOff;
|
|
175
|
+
vec4 xq = fetchBVH(i);
|
|
176
|
+
vec4 xr = fetchBVH(i + 1);
|
|
177
|
+
vec4 xs = fetchBVH(i + 2);
|
|
178
|
+
vec4 xt = fetchBVH(i + 3);
|
|
179
|
+
primitiveCount = int(floatBitsToUint(xs.w));
|
|
180
180
|
if (primitiveCount > 0) {
|
|
181
|
-
primitiveOffset =
|
|
181
|
+
primitiveOffset = bufferOff + eQ + int(floatBitsToUint(xt.w));
|
|
182
182
|
}
|
|
183
183
|
else {
|
|
184
|
-
int left =
|
|
185
|
-
int right =
|
|
186
|
-
float d0 =
|
|
187
|
-
float d1 =
|
|
184
|
+
int left = eQ + int(floatBitsToUint(xq.w) * 4u);
|
|
185
|
+
int right = eQ + int(floatBitsToUint(xr.w) * 4u);
|
|
186
|
+
float d0 = cH(o, d, xq.xyz, xr.xyz, tMax);
|
|
187
|
+
float d1 = cH(o, d, xs.xyz, xt.xyz, tMax);
|
|
188
188
|
if (d0 > d1) {
|
|
189
|
-
if (d0 > 0.0) stack[++top] = ivec2(left,
|
|
190
|
-
if (d1 > 0.0) stack[++top] = ivec2(right,
|
|
189
|
+
if (d0 > 0.0) stack[++top] = ivec2(left, bK);
|
|
190
|
+
if (d1 > 0.0) stack[++top] = ivec2(right, bK);
|
|
191
191
|
}
|
|
192
192
|
else {
|
|
193
|
-
if (d1 > 0.0) stack[++top] = ivec2(right,
|
|
194
|
-
if (d0 > 0.0) stack[++top] = ivec2(left,
|
|
193
|
+
if (d1 > 0.0) stack[++top] = ivec2(right, bK);
|
|
194
|
+
if (d0 > 0.0) stack[++top] = ivec2(left, bK);
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
|
-
else if (
|
|
199
|
-
uint
|
|
200
|
-
if ((
|
|
201
|
-
primitiveCount = int((
|
|
202
|
-
primitiveOffset =
|
|
198
|
+
else if (gN == 1) {
|
|
199
|
+
uint hT = uint(node.x);
|
|
200
|
+
if ((hT & 0x80000000u) != 0u) {
|
|
201
|
+
primitiveCount = int((hT >> 23u) & 0xffu);
|
|
202
|
+
primitiveOffset = bufferOff + eQ + int(hT & 0x007fffffu);
|
|
203
203
|
}
|
|
204
204
|
else {
|
|
205
|
-
int i = node.x +
|
|
206
|
-
vec4
|
|
207
|
-
vec4
|
|
208
|
-
vec4
|
|
209
|
-
vec4
|
|
210
|
-
vec3 nodeMin =
|
|
211
|
-
vec3
|
|
212
|
-
uint
|
|
213
|
-
floatBitsToUint(
|
|
214
|
-
floatBitsToUint(
|
|
205
|
+
int i = node.x + bufferOff;
|
|
206
|
+
vec4 vW = fetchBVH(i);
|
|
207
|
+
vec4 sq = fetchBVH(i + 1);
|
|
208
|
+
vec4 qI = fetchBVH(i + 2);
|
|
209
|
+
vec4 oF = fetchBVH(i + 3);
|
|
210
|
+
vec3 nodeMin = vW.xyz;
|
|
211
|
+
vec3 ea = vec3(vW.w, sq.x, sq.y);
|
|
212
|
+
uint mF[4] = uint[4](
|
|
213
|
+
floatBitsToUint(sq.z), floatBitsToUint(sq.w),
|
|
214
|
+
floatBitsToUint(qI.x), floatBitsToUint(qI.y)
|
|
215
215
|
);
|
|
216
|
-
vec4
|
|
217
|
-
vec4
|
|
218
|
-
vec4
|
|
219
|
-
vec4
|
|
220
|
-
vec4
|
|
221
|
-
vec4
|
|
222
|
-
vec3
|
|
223
|
-
vec3 padding =
|
|
224
|
-
vec4 tx0 = (nodeMin.x +
|
|
225
|
-
vec4 tx1 = (nodeMin.x +
|
|
226
|
-
vec4 ty0 = (nodeMin.y +
|
|
227
|
-
vec4 ty1 = (nodeMin.y +
|
|
228
|
-
vec4 tz0 = (nodeMin.z +
|
|
229
|
-
vec4 tz1 = (nodeMin.z +
|
|
230
|
-
vec4
|
|
231
|
-
vec4
|
|
232
|
-
vec4 distance = mix(
|
|
233
|
-
distance = mix(distance, vec4(-1.0), greaterThan(
|
|
234
|
-
float
|
|
216
|
+
vec4 wV = eX(floatBitsToUint(qI.z));
|
|
217
|
+
vec4 wW = eX(floatBitsToUint(qI.w));
|
|
218
|
+
vec4 wX = eX(floatBitsToUint(oF.x));
|
|
219
|
+
vec4 wR = eX(floatBitsToUint(oF.y));
|
|
220
|
+
vec4 wS = eX(floatBitsToUint(oF.z));
|
|
221
|
+
vec4 wU = eX(floatBitsToUint(oF.w));
|
|
222
|
+
vec3 gb = eW(d);
|
|
223
|
+
vec3 padding = eU(gb, o);
|
|
224
|
+
vec4 tx0 = (nodeMin.x + wV * ea.x - o.x) * gb.x;
|
|
225
|
+
vec4 tx1 = (nodeMin.x + wR * ea.x - o.x) * gb.x;
|
|
226
|
+
vec4 ty0 = (nodeMin.y + wW * ea.y - o.y) * gb.y;
|
|
227
|
+
vec4 ty1 = (nodeMin.y + wS * ea.y - o.y) * gb.y;
|
|
228
|
+
vec4 tz0 = (nodeMin.z + wX * ea.z - o.z) * gb.z;
|
|
229
|
+
vec4 tz1 = (nodeMin.z + wU * ea.z - o.z) * gb.z;
|
|
230
|
+
vec4 ns = max(max((min(tx0, tx1) - vec4(padding.x)), (min(ty0, ty1) - vec4(padding.y))), (min(tz0, tz1) - vec4(padding.z)));
|
|
231
|
+
vec4 sW = min(min((max(tx0, tx1) + vec4(padding.x)), (max(ty0, ty1) + vec4(padding.y))), (max(tz0, tz1) + vec4(padding.z)));
|
|
232
|
+
vec4 distance = mix(sW, ns, greaterThan(ns, vec4(0.0)));
|
|
233
|
+
distance = mix(distance, vec4(-1.0), greaterThan(ns, min(sW, vec4(tMax))));
|
|
234
|
+
float eY[4] = float[4](distance.x, distance.y, distance.z, distance.w);
|
|
235
235
|
|
|
236
236
|
|
|
237
237
|
for (int order = 0; order < 4; order++) {
|
|
238
|
-
float
|
|
239
|
-
int
|
|
238
|
+
float dW = -1.0;
|
|
239
|
+
int ej = -1;
|
|
240
240
|
for (int child = 0; child < 4; child++) {
|
|
241
|
-
if (
|
|
242
|
-
|
|
243
|
-
|
|
241
|
+
if (mF[child] != 0u && eY[child] > dW) {
|
|
242
|
+
dW = eY[child];
|
|
243
|
+
ej = child;
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
|
-
if (
|
|
247
|
-
uint
|
|
248
|
-
int
|
|
249
|
-
if ((
|
|
250
|
-
|
|
246
|
+
if (ej >= 0 && dW > 0.0) {
|
|
247
|
+
uint ol = mF[ej];
|
|
248
|
+
int jO = int(ol);
|
|
249
|
+
if ((ol & 0x80000000u) == 0u) {
|
|
250
|
+
jO += eQ;
|
|
251
251
|
}
|
|
252
|
-
stack[++top] = ivec2(
|
|
253
|
-
|
|
252
|
+
stack[++top] = ivec2(jO, bK);
|
|
253
|
+
eY[ej] = -1.0;
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
}
|
|
258
258
|
else {
|
|
259
|
-
int i = node.x +
|
|
260
|
-
vec4 r1 =
|
|
261
|
-
int
|
|
259
|
+
int i = node.x + bufferOff;
|
|
260
|
+
vec4 r1 = fetchBVH(i);
|
|
261
|
+
int bf = floatBitsToInt(r1.w);
|
|
262
262
|
|
|
263
|
-
if (
|
|
263
|
+
if (bf >= 0) {
|
|
264
264
|
int left = node.x + 2;
|
|
265
|
-
int right =
|
|
265
|
+
int right = bf + eQ;
|
|
266
266
|
|
|
267
|
-
float d0 =
|
|
268
|
-
float d1 =
|
|
267
|
+
float d0 = cH(o, d, fetchBVH(left + bufferOff).xyz, fetchBVH(left + 1 + bufferOff).xyz, tMax);
|
|
268
|
+
float d1 = cH(o, d, fetchBVH(right + bufferOff).xyz, fetchBVH(right + 1 + bufferOff).xyz, tMax);
|
|
269
269
|
if (d0 > d1) {
|
|
270
270
|
if (d0 > 0.0) {
|
|
271
|
-
stack[++top] = ivec2(left,
|
|
271
|
+
stack[++top] = ivec2(left, bK);
|
|
272
272
|
}
|
|
273
273
|
if (d1 > 0.0) {
|
|
274
|
-
stack[++top] = ivec2(right,
|
|
274
|
+
stack[++top] = ivec2(right, bK);
|
|
275
275
|
}
|
|
276
276
|
}
|
|
277
277
|
else {
|
|
278
278
|
if (d1 > 0.0) {
|
|
279
|
-
stack[++top] = ivec2(right,
|
|
279
|
+
stack[++top] = ivec2(right, bK);
|
|
280
280
|
}
|
|
281
281
|
if (d0 > 0.0) {
|
|
282
|
-
stack[++top] = ivec2(left,
|
|
282
|
+
stack[++top] = ivec2(left, bK);
|
|
283
283
|
}
|
|
284
284
|
}
|
|
285
285
|
}
|
|
286
286
|
else {
|
|
287
|
-
if (
|
|
288
|
-
for (int k = 0; k < -
|
|
289
|
-
vec4 r3 =
|
|
287
|
+
if (bK < 0) {
|
|
288
|
+
for (int k = 0; k < -bf; k++) {
|
|
289
|
+
vec4 r3 = fetchBVH(i + 2 + k);
|
|
290
290
|
stack[++top] = ivec2(floatBitsToInt(r3.y), floatBitsToInt(r3.x));
|
|
291
291
|
}
|
|
292
292
|
}
|
|
293
293
|
else {
|
|
294
|
-
primitiveCount = -
|
|
294
|
+
primitiveCount = -bf;
|
|
295
295
|
primitiveOffset = i + 2;
|
|
296
296
|
}
|
|
297
297
|
}
|
|
@@ -321,13 +321,13 @@ export default createShaderMixin({
|
|
|
321
321
|
},
|
|
322
322
|
main: glsl `
|
|
323
323
|
|
|
324
|
-
struct
|
|
324
|
+
struct fw {
|
|
325
325
|
vec3 p0;
|
|
326
326
|
vec3 p1;
|
|
327
327
|
vec3 p2;
|
|
328
328
|
};
|
|
329
329
|
#ifdef NUM_LIGHTS
|
|
330
|
-
float
|
|
330
|
+
float hs(float rad, vec3 pos, Ray r) {
|
|
331
331
|
vec3 op = pos - r.o;
|
|
332
332
|
float eps = 0.001;
|
|
333
333
|
float b = dot(op, r.d);
|
|
@@ -347,7 +347,7 @@ return t2;
|
|
|
347
347
|
return INF;
|
|
348
348
|
}
|
|
349
349
|
|
|
350
|
-
float
|
|
350
|
+
float nV(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
|
|
351
351
|
float dt = dot(r.d, n);
|
|
352
352
|
float t = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
353
353
|
|
|
@@ -366,7 +366,17 @@ return t;
|
|
|
366
366
|
return INF;
|
|
367
367
|
}
|
|
368
368
|
|
|
369
|
-
float
|
|
369
|
+
float sphereSolidAnglePdf(vec3 origin, vec3 center, float radius) {
|
|
370
|
+
float ao = distance(origin, center);
|
|
371
|
+
if (ao <= radius) return INV4PI;
|
|
372
|
+
float sinThetaMaxSquared = min(1.0, radius * radius / (ao * ao));
|
|
373
|
+
float cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));
|
|
374
|
+
|
|
375
|
+
float oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
|
|
376
|
+
return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
float mX(Ray r, Light light, out LightSampleRec lightSample) {
|
|
370
380
|
|
|
371
381
|
|
|
372
382
|
|
|
@@ -383,15 +393,15 @@ vec3 normal = normalize(cross(u, v));
|
|
|
383
393
|
if (dot(normal, r.d) > 0.)
|
|
384
394
|
return INF;
|
|
385
395
|
|
|
386
|
-
d =
|
|
396
|
+
d = nV(pos, u, v, normal, r);
|
|
387
397
|
if (d < 0.) {
|
|
388
398
|
d = INF;
|
|
389
399
|
}
|
|
390
400
|
else {
|
|
391
|
-
float
|
|
401
|
+
float ct = dot(-r.d, normal);
|
|
392
402
|
float spread = light.spread;
|
|
393
|
-
if (
|
|
394
|
-
lightSample.pdf = (d * d) / (light.area *
|
|
403
|
+
if (ct >= cos(spread * PI / 2.0)) {
|
|
404
|
+
lightSample.pdf = (d * d) / (light.area * ct);
|
|
395
405
|
lightSample.emission = light.emission;
|
|
396
406
|
}
|
|
397
407
|
}
|
|
@@ -400,10 +410,10 @@ lightSample.emission = light.emission;
|
|
|
400
410
|
#ifdef HAS_SPHERE_LIGHTS
|
|
401
411
|
if (type == SPHERE_LIGHT) {
|
|
402
412
|
if (light.radius <= 0.0) {
|
|
403
|
-
vec3
|
|
404
|
-
float projection = dot(
|
|
405
|
-
vec3
|
|
406
|
-
if (projection <= EPS || dot(
|
|
413
|
+
vec3 kz = light.position - r.o;
|
|
414
|
+
float projection = dot(kz, r.d);
|
|
415
|
+
vec3 bd = kz - projection * r.d;
|
|
416
|
+
if (projection <= EPS || dot(bd, bd) > 1e-8) return INF;
|
|
407
417
|
d = projection;
|
|
408
418
|
lightSample.direction = r.d;
|
|
409
419
|
lightSample.normal = -r.d;
|
|
@@ -411,21 +421,15 @@ lightSample.dist = d;
|
|
|
411
421
|
lightSample.pdf = 1.0;
|
|
412
422
|
lightSample.isDelta = true;
|
|
413
423
|
} else {
|
|
414
|
-
d =
|
|
424
|
+
d = hs(light.radius, light.position, r);
|
|
415
425
|
lightSample.isDelta = false;
|
|
416
426
|
}
|
|
417
427
|
if (d < 0.) {
|
|
418
428
|
d = INF;
|
|
419
429
|
}
|
|
420
430
|
else {
|
|
421
|
-
float ak = distance(r.o, light.position);
|
|
422
|
-
float cosThetaMax = ak <= light.radius
|
|
423
|
-
? -1.0
|
|
424
|
-
: sqrt(max(0.0, 1.0 - light.radius * light.radius / (ak * ak)));
|
|
425
431
|
if (light.radius > 0.0) {
|
|
426
|
-
lightSample.pdf =
|
|
427
|
-
? INV4PI
|
|
428
|
-
: 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
|
|
432
|
+
lightSample.pdf = sphereSolidAnglePdf(r.o, light.position, light.radius);
|
|
429
433
|
}
|
|
430
434
|
lightSample.emission = light.radius <= 0.0
|
|
431
435
|
? light.emission / max(d * d, 1e-8)
|
|
@@ -436,10 +440,10 @@ lightSample.emission = light.radius <= 0.0
|
|
|
436
440
|
#ifdef HAS_SPOT_LIGHTS
|
|
437
441
|
if (type == SPOT_LIGHT) {
|
|
438
442
|
if (light.radius <= 0.0) {
|
|
439
|
-
vec3
|
|
440
|
-
float projection = dot(
|
|
441
|
-
vec3
|
|
442
|
-
if (projection <= EPS || dot(
|
|
443
|
+
vec3 kz = light.position - r.o;
|
|
444
|
+
float projection = dot(kz, r.d);
|
|
445
|
+
vec3 bd = kz - projection * r.d;
|
|
446
|
+
if (projection <= EPS || dot(bd, bd) > 1e-8) return INF;
|
|
443
447
|
d = projection;
|
|
444
448
|
lightSample.direction = r.d;
|
|
445
449
|
lightSample.normal = -r.d;
|
|
@@ -447,23 +451,17 @@ lightSample.dist = d;
|
|
|
447
451
|
lightSample.pdf = 1.0;
|
|
448
452
|
lightSample.isDelta = true;
|
|
449
453
|
} else {
|
|
450
|
-
d =
|
|
454
|
+
d = hs(light.radius, light.position, r);
|
|
451
455
|
lightSample.isDelta = false;
|
|
452
456
|
}
|
|
453
457
|
if (d != INF) {
|
|
454
|
-
vec3
|
|
455
|
-
float
|
|
456
|
-
if (
|
|
457
|
-
float ak = distance(r.o, light.position);
|
|
458
|
-
float cosThetaMax = ak <= light.radius
|
|
459
|
-
? -1.0
|
|
460
|
-
: sqrt(max(0.0, 1.0 - light.radius * light.radius / (ak * ak)));
|
|
458
|
+
vec3 xv = r.o + d * r.d;
|
|
459
|
+
float ne = evaluateSpotEmissionMultiplier(light, normalize(r.o - xv));
|
|
460
|
+
if (ne <= 0.0) return INF;
|
|
461
461
|
if (light.radius > 0.0) {
|
|
462
|
-
lightSample.pdf =
|
|
463
|
-
? INV4PI
|
|
464
|
-
: 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
|
|
462
|
+
lightSample.pdf = sphereSolidAnglePdf(r.o, light.position, light.radius);
|
|
465
463
|
}
|
|
466
|
-
lightSample.emission = light.emission *
|
|
464
|
+
lightSample.emission = light.emission * ne * (light.radius <= 0.0
|
|
467
465
|
? 1.0 / max(d * d, 1e-8)
|
|
468
466
|
: 1.0);
|
|
469
467
|
}
|
|
@@ -474,96 +472,96 @@ return d;
|
|
|
474
472
|
}
|
|
475
473
|
#endif
|
|
476
474
|
|
|
477
|
-
int
|
|
478
|
-
vec2 m00 =
|
|
479
|
-
vec2 m01 =
|
|
480
|
-
vec2 m02 =
|
|
481
|
-
vec2 m10 =
|
|
482
|
-
vec2 m11 =
|
|
483
|
-
vec2 m12 =
|
|
484
|
-
vec2 m20 =
|
|
485
|
-
vec2 m21 =
|
|
486
|
-
vec2 m22 =
|
|
487
|
-
float w00 = m00.y *
|
|
488
|
-
float w01 = m01.y *
|
|
489
|
-
float w02 = m02.y *
|
|
490
|
-
float w10 = m10.y *
|
|
491
|
-
float w11 = m11.y *
|
|
492
|
-
float w12 = m12.y *
|
|
493
|
-
float w20 = m20.y *
|
|
494
|
-
float w21 = m21.y *
|
|
495
|
-
float w22 = m22.y *
|
|
496
|
-
|
|
497
|
-
float
|
|
498
|
-
|
|
499
|
-
w00 = w00 /
|
|
500
|
-
w01 = w01 /
|
|
501
|
-
w02 = w02 /
|
|
502
|
-
w10 = w10 /
|
|
503
|
-
w11 = w11 /
|
|
504
|
-
w12 = w12 /
|
|
505
|
-
w20 = w20 /
|
|
506
|
-
w21 = w21 /
|
|
507
|
-
w22 = w22 /
|
|
508
|
-
|
|
509
|
-
float rand =
|
|
510
|
-
float
|
|
475
|
+
int fh(ivec4 m0, ivec4 m1, ivec4 m2, vec3 bary) {
|
|
476
|
+
vec2 m00 = af(m0.x);
|
|
477
|
+
vec2 m01 = af(m0.y);
|
|
478
|
+
vec2 m02 = af(m0.z);
|
|
479
|
+
vec2 m10 = af(m1.x);
|
|
480
|
+
vec2 m11 = af(m1.y);
|
|
481
|
+
vec2 m12 = af(m1.z);
|
|
482
|
+
vec2 m20 = af(m2.x);
|
|
483
|
+
vec2 m21 = af(m2.y);
|
|
484
|
+
vec2 m22 = af(m2.z);
|
|
485
|
+
float w00 = m00.y * bary.x;
|
|
486
|
+
float w01 = m01.y * bary.x;
|
|
487
|
+
float w02 = m02.y * bary.x;
|
|
488
|
+
float w10 = m10.y * bary.y;
|
|
489
|
+
float w11 = m11.y * bary.y;
|
|
490
|
+
float w12 = m12.y * bary.y;
|
|
491
|
+
float w20 = m20.y * bary.z;
|
|
492
|
+
float w21 = m21.y * bary.z;
|
|
493
|
+
float w22 = m22.y * bary.z;
|
|
494
|
+
|
|
495
|
+
float hd = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
496
|
+
|
|
497
|
+
w00 = w00 / hd;
|
|
498
|
+
w01 = w01 / hd + w00;
|
|
499
|
+
w02 = w02 / hd + w01;
|
|
500
|
+
w10 = w10 / hd + w02;
|
|
501
|
+
w11 = w11 / hd + w10;
|
|
502
|
+
w12 = w12 / hd + w11;
|
|
503
|
+
w20 = w20 / hd + w12;
|
|
504
|
+
w21 = w21 / hd + w20;
|
|
505
|
+
w22 = w22 / hd + w21;
|
|
506
|
+
|
|
507
|
+
float rand = ek(0u);
|
|
508
|
+
float nW;
|
|
511
509
|
if (rand < w00) {
|
|
512
|
-
|
|
510
|
+
nW = m00.x;
|
|
513
511
|
} else if (rand < w01) {
|
|
514
|
-
|
|
512
|
+
nW = m01.x;
|
|
515
513
|
} else if (rand < w02) {
|
|
516
|
-
|
|
514
|
+
nW = m02.x;
|
|
517
515
|
} else if (rand < w10) {
|
|
518
|
-
|
|
516
|
+
nW = m10.x;
|
|
519
517
|
} else if (rand < w11) {
|
|
520
|
-
|
|
518
|
+
nW = m11.x;
|
|
521
519
|
} else if (rand < w12) {
|
|
522
|
-
|
|
520
|
+
nW = m12.x;
|
|
523
521
|
} else if (rand < w20) {
|
|
524
|
-
|
|
522
|
+
nW = m20.x;
|
|
525
523
|
} else if (rand < w21) {
|
|
526
|
-
|
|
524
|
+
nW = m21.x;
|
|
527
525
|
} else {
|
|
528
|
-
|
|
526
|
+
nW = m22.x;
|
|
529
527
|
}
|
|
530
|
-
return int(
|
|
528
|
+
return int(nW);
|
|
531
529
|
}
|
|
532
530
|
|
|
533
531
|
|
|
534
|
-
vec4
|
|
532
|
+
vec4 fetchIns(int i);
|
|
535
533
|
|
|
536
534
|
|
|
537
|
-
mat2x3
|
|
538
|
-
float determinant =
|
|
539
|
-
vec3 t =
|
|
535
|
+
mat2x3 ez(vec3 normal, vec3 dp1, vec3 dp2, vec2 oM, vec2 oN, vec4 aS) {
|
|
536
|
+
float determinant = oM.x * oN.y - oM.y * oN.x;
|
|
537
|
+
vec3 t = aS.xyz;
|
|
540
538
|
vec3 b = vec3(0.0);
|
|
541
539
|
|
|
542
|
-
float
|
|
540
|
+
float rw = abs(aS.w) > 1.5 ? 0.0 : aS.w;
|
|
543
541
|
if (abs(determinant) > 1e-12) {
|
|
544
|
-
vec3 dt = (dp1 *
|
|
545
|
-
vec3 db = (dp2 *
|
|
542
|
+
vec3 dt = (dp1 * oN.y - dp2 * oM.y) / determinant;
|
|
543
|
+
vec3 db = (dp2 * oM.x - dp1 * oN.x) / determinant;
|
|
546
544
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
547
|
-
if (
|
|
545
|
+
if (rw == 0.0) { rw = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
|
|
548
546
|
}
|
|
549
547
|
t -= normal * dot(normal, t);
|
|
550
548
|
if (dot(t, t) < 1e-8) {
|
|
551
|
-
float
|
|
552
|
-
float
|
|
553
|
-
float xy = normal.x * normal.y *
|
|
554
|
-
t = vec3(1.0 +
|
|
555
|
-
b = vec3(xy,
|
|
549
|
+
float ik = (normal.z >= 0.0 ? 1.0 : -1.0);
|
|
550
|
+
float cv = -1.0 / (ik + normal.z);
|
|
551
|
+
float xy = normal.x * normal.y * cv;
|
|
552
|
+
t = vec3(1.0 + ik * normal.x * normal.x * cv, ik * xy, -ik * normal.x);
|
|
553
|
+
b = vec3(xy, ik + normal.y * normal.y * cv, -normal.y);
|
|
556
554
|
}
|
|
557
555
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
558
|
-
return mat2x3(t, b * (
|
|
556
|
+
return mat2x3(t, b * (rw < 0.0 ? -1.0 : 1.0));
|
|
559
557
|
}
|
|
560
558
|
|
|
561
|
-
void
|
|
559
|
+
void hn(inout SurfaceInteraction si, fw tri, vec3 barycentric, ivec3 index) {
|
|
562
560
|
si.hit = true;
|
|
563
561
|
si.position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
|
|
564
|
-
ivec2 i0 =
|
|
565
|
-
ivec2 i1 =
|
|
566
|
-
ivec2 i2 =
|
|
562
|
+
ivec2 i0 = gM(index.x, vertexColumns);
|
|
563
|
+
ivec2 i1 = gM(index.y, vertexColumns);
|
|
564
|
+
ivec2 i2 = gM(index.z, vertexColumns);
|
|
567
565
|
si.vertexColor = vec3(1.0);
|
|
568
566
|
#ifdef USE_VERTEX_COLOR
|
|
569
567
|
si.vertexColor = barycentric.x * texelFetch(colorBuffer, i0, 0).rgb
|
|
@@ -582,14 +580,14 @@ si.vertexNormal = normal;
|
|
|
582
580
|
|
|
583
581
|
|
|
584
582
|
vec3 geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
585
|
-
vec3
|
|
583
|
+
vec3 kw = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
|
|
586
584
|
float a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
587
585
|
float b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
588
586
|
float c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
589
587
|
float h = a * barycentric.x * (barycentric.x - 1.0)
|
|
590
588
|
+ (a + b + c) * barycentric.x * barycentric.y
|
|
591
589
|
+ b * barycentric.y * (barycentric.y - 1.0);
|
|
592
|
-
if (dot(
|
|
590
|
+
if (dot(kw, geometricNormal) > 0.0) {
|
|
593
591
|
float h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
594
592
|
float h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
595
593
|
float h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -607,7 +605,7 @@ h1 = max(dot(si.position - tri.p1, n1) + h1, 0.0);
|
|
|
607
605
|
h2 = max(dot(si.position - tri.p2, n2) + h2, 0.0);
|
|
608
606
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
609
607
|
}
|
|
610
|
-
si.shadowOffset =
|
|
608
|
+
si.shadowOffset = kw * h;
|
|
611
609
|
|
|
612
610
|
|
|
613
611
|
ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
|
|
@@ -615,7 +613,7 @@ ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
|
|
|
615
613
|
ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
|
|
616
614
|
|
|
617
615
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
618
|
-
si.materialIndex =
|
|
616
|
+
si.materialIndex = fh(m0, m1, m2, barycentric);
|
|
619
617
|
}
|
|
620
618
|
|
|
621
619
|
vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
|
|
@@ -626,80 +624,80 @@ vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
|
626
624
|
vec2 secondaryUv0 = texelFetch(uv1Buffer, i0, 0).xy;
|
|
627
625
|
vec2 secondaryUv1 = texelFetch(uv1Buffer, i1, 0).xy;
|
|
628
626
|
vec2 secondaryUv2 = texelFetch(uv1Buffer, i2, 0).xy;
|
|
629
|
-
vec2
|
|
627
|
+
vec2 cQ = barycentric.x * secondaryUv0
|
|
630
628
|
+ barycentric.y * secondaryUv1
|
|
631
629
|
+ barycentric.z * secondaryUv2;
|
|
632
630
|
|
|
633
|
-
vec4
|
|
634
|
-
int uvProjection = int(
|
|
631
|
+
vec4 mb = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
|
|
632
|
+
int uvProjection = int(mb.r);
|
|
635
633
|
if (uvProjection > 0) {
|
|
636
|
-
uv =
|
|
637
|
-
|
|
634
|
+
uv = gE(uvProjection, si.position, normal, mb.zw);
|
|
635
|
+
cQ = uv;
|
|
638
636
|
} else {
|
|
639
|
-
uv *=
|
|
640
|
-
|
|
637
|
+
uv *= mb.zw;
|
|
638
|
+
cQ *= mb.zw;
|
|
641
639
|
}
|
|
642
640
|
#else
|
|
643
641
|
vec2 uv = vec2(0.0);
|
|
644
|
-
vec2
|
|
642
|
+
vec2 cQ = vec2(0.0);
|
|
645
643
|
#endif
|
|
646
644
|
|
|
647
645
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
648
646
|
si.coatNormal = normal;
|
|
649
647
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
650
|
-
float
|
|
648
|
+
float pH = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
|
|
651
649
|
#endif
|
|
652
650
|
#endif
|
|
653
651
|
vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);
|
|
654
|
-
float
|
|
655
|
-
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 ||
|
|
652
|
+
float uQ = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
|
|
653
|
+
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || uQ != 0.0
|
|
656
654
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
657
655
|
|| fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_COAT).w > 0.0
|
|
658
656
|
#endif
|
|
659
657
|
) {
|
|
660
658
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
661
659
|
vec3 dp2 = tri.p1 - tri.p2;
|
|
662
|
-
vec4
|
|
660
|
+
vec4 aS = vec4(0.0);
|
|
663
661
|
#ifdef USE_TANGENT
|
|
664
|
-
|
|
662
|
+
aS = barycentric.x * texelFetch(tangentBuffer, i0, 0)
|
|
665
663
|
+ barycentric.y * texelFetch(tangentBuffer, i1, 0)
|
|
666
664
|
+ barycentric.z * texelFetch(tangentBuffer, i2, 0);
|
|
667
665
|
#endif
|
|
668
|
-
mat2x3
|
|
669
|
-
si.geometryTangent =
|
|
670
|
-
si.geometryBitangent =
|
|
671
|
-
mat2x3
|
|
666
|
+
mat2x3 eL = ez(normal, dp1, dp2, uv0-uv2, uv1-uv2, aS);
|
|
667
|
+
si.geometryTangent = eL[0];
|
|
668
|
+
si.geometryBitangent = eL[1];
|
|
669
|
+
mat2x3 fX = eL;
|
|
672
670
|
#ifdef NUM_ANISOTROPY_MAPS
|
|
673
671
|
if (directionMaterial.x >= 0.0 && mapUvChannel[int(directionMaterial.x)] > 0.5) {
|
|
674
672
|
vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
|
|
675
673
|
vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
|
|
676
674
|
vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
|
|
677
|
-
|
|
675
|
+
fX = ez(normal, dp1, dp2, a-c, b-c, (aS.w == 0.0 ? vec4(0.0) : aS));
|
|
678
676
|
}
|
|
679
677
|
#endif
|
|
680
|
-
si.directionTangent =
|
|
681
|
-
si.directionBitangent =
|
|
678
|
+
si.directionTangent = fX[0];
|
|
679
|
+
si.directionBitangent = fX[1];
|
|
682
680
|
#if defined(USE_COAT_NORMAL_FRAMES) && defined(NUM_COAT_NORMAL_MAPS)
|
|
683
|
-
if (
|
|
684
|
-
int
|
|
685
|
-
mat2x3
|
|
686
|
-
if (mapUvChannel[
|
|
681
|
+
if (pH >= 0.0) {
|
|
682
|
+
int kP = int(pH);
|
|
683
|
+
mat2x3 mG = eL;
|
|
684
|
+
if (mapUvChannel[kP] > 0.5) {
|
|
687
685
|
vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
|
|
688
686
|
vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
|
|
689
687
|
vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
|
|
690
|
-
|
|
691
|
-
|
|
688
|
+
mG = ez(normal, dp1, dp2, a-c, b-c,
|
|
689
|
+
aS.w == 0.0 ? vec4(0.0) : aS);
|
|
692
690
|
}
|
|
693
|
-
vec3 decoded = sampleMap(
|
|
694
|
-
vec3 mapped =
|
|
695
|
-
+
|
|
691
|
+
vec3 decoded = sampleMap(kP, getMapUvSet(kP, uv, cQ)).rgb * 2.0 - 1.0;
|
|
692
|
+
vec3 mapped = mG[0] * decoded.x * directionMaterial.z
|
|
693
|
+
+ mG[1] * decoded.y * directionMaterial.w + normal * decoded.z;
|
|
696
694
|
if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }
|
|
697
695
|
}
|
|
698
696
|
#endif
|
|
699
697
|
}
|
|
700
698
|
|
|
701
699
|
si.uv = uv;
|
|
702
|
-
si.uv1 =
|
|
700
|
+
si.uv1 = cQ;
|
|
703
701
|
|
|
704
702
|
#ifdef USE_TANGENT
|
|
705
703
|
vec3 t0 = texelFetch(tangentBuffer, i0, 0).xyz;
|
|
@@ -710,52 +708,52 @@ si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z *
|
|
|
710
708
|
#if defined(NUM_NORMAL_MAPS)
|
|
711
709
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
712
710
|
vec3 dp2 = tri.p1 - tri.p2;
|
|
713
|
-
vec2
|
|
714
|
-
vec2
|
|
715
|
-
si.normal =
|
|
716
|
-
si.materialIndex, uv, normal, dp1, dp2,
|
|
711
|
+
vec2 oM = uv0 - uv2;
|
|
712
|
+
vec2 oN = uv1 - uv2;
|
|
713
|
+
si.normal = oS(
|
|
714
|
+
si.materialIndex, uv, normal, dp1, dp2, oM, oN
|
|
717
715
|
);
|
|
718
716
|
#else
|
|
719
717
|
si.normal = normal;
|
|
720
718
|
#endif
|
|
721
719
|
}
|
|
722
720
|
|
|
723
|
-
struct
|
|
721
|
+
struct ev {
|
|
724
722
|
float t;
|
|
725
723
|
vec3 barycentric;
|
|
726
724
|
};
|
|
727
725
|
|
|
728
|
-
vec4
|
|
729
|
-
return
|
|
726
|
+
vec4 fetchBVH(int i) {
|
|
727
|
+
return fetchData(bvhBuffer, i, bvhColumns);
|
|
730
728
|
}
|
|
731
729
|
|
|
732
|
-
vec4
|
|
733
|
-
return
|
|
730
|
+
vec4 fetchIns(int i) {
|
|
731
|
+
return fetchData(instancesBuffer, i, instancesColumns);
|
|
734
732
|
}
|
|
735
733
|
|
|
736
734
|
|
|
737
735
|
|
|
738
|
-
uint
|
|
736
|
+
uint rT(uint value) {
|
|
739
737
|
value -= (value >> 1u) & 0x55555555u;
|
|
740
738
|
value = (value & 0x33333333u) + ((value >> 2u) & 0x33333333u);
|
|
741
739
|
value = (value + (value >> 4u)) & 0x0f0f0f0fu;
|
|
742
740
|
return (value * 0x01010101u) >> 24u;
|
|
743
741
|
}
|
|
744
742
|
|
|
745
|
-
vec4
|
|
743
|
+
vec4 eX(uint mo) {
|
|
746
744
|
return vec4(
|
|
747
|
-
float(
|
|
748
|
-
float((
|
|
749
|
-
float((
|
|
750
|
-
float(
|
|
745
|
+
float(mo & 0xffu),
|
|
746
|
+
float((mo >> 8u) & 0xffu),
|
|
747
|
+
float((mo >> 16u) & 0xffu),
|
|
748
|
+
float(mo >> 24u)
|
|
751
749
|
) / 255.0;
|
|
752
750
|
}
|
|
753
751
|
|
|
754
752
|
|
|
755
753
|
|
|
756
754
|
|
|
757
|
-
|
|
758
|
-
|
|
755
|
+
ev fM(vec3 o, vec3 d, fw tri, int dZ, vec3 gH, float tMax) {
|
|
756
|
+
ev ti;
|
|
759
757
|
|
|
760
758
|
|
|
761
759
|
vec3 p0t = tri.p0 - o;
|
|
@@ -763,20 +761,20 @@ vec3 p1t = tri.p1 - o;
|
|
|
763
761
|
vec3 p2t = tri.p2 - o;
|
|
764
762
|
|
|
765
763
|
|
|
766
|
-
if (
|
|
764
|
+
if (dZ == 0) {
|
|
767
765
|
p0t = p0t.yzx;
|
|
768
766
|
p1t = p1t.yzx;
|
|
769
767
|
p2t = p2t.yzx;
|
|
770
|
-
} else if (
|
|
768
|
+
} else if (dZ == 1) {
|
|
771
769
|
p0t = p0t.zxy;
|
|
772
770
|
p1t = p1t.zxy;
|
|
773
771
|
p2t = p2t.zxy;
|
|
774
772
|
}
|
|
775
773
|
|
|
776
774
|
|
|
777
|
-
p0t.xy +=
|
|
778
|
-
p1t.xy +=
|
|
779
|
-
p2t.xy +=
|
|
775
|
+
p0t.xy += gH.xy * p0t.z;
|
|
776
|
+
p1t.xy += gH.xy * p1t.z;
|
|
777
|
+
p2t.xy += gH.xy * p2t.z;
|
|
780
778
|
|
|
781
779
|
|
|
782
780
|
vec3 e = vec3(
|
|
@@ -786,9 +784,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
786
784
|
);
|
|
787
785
|
|
|
788
786
|
#ifdef DEPTH_QUERY_MODE
|
|
789
|
-
vec3
|
|
787
|
+
vec3 sB = abs(vec3(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
790
788
|
+ abs(vec3(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
791
|
-
e = mix(e, vec3(0.0), lessThanEqual(abs(e),
|
|
789
|
+
e = mix(e, vec3(0.0), lessThanEqual(abs(e), sB * 1e-6));
|
|
792
790
|
#endif
|
|
793
791
|
|
|
794
792
|
|
|
@@ -801,19 +799,19 @@ float det = e.x + e.y + e.z;
|
|
|
801
799
|
if (det == 0.0) return ti;
|
|
802
800
|
#endif
|
|
803
801
|
|
|
804
|
-
p0t.z *=
|
|
805
|
-
p1t.z *=
|
|
806
|
-
p2t.z *=
|
|
807
|
-
float
|
|
802
|
+
p0t.z *= gH.z;
|
|
803
|
+
p1t.z *= gH.z;
|
|
804
|
+
p2t.z *= gH.z;
|
|
805
|
+
float sp = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
808
806
|
|
|
809
807
|
|
|
810
|
-
if (abs(
|
|
808
|
+
if (abs(sp) > abs(tMax * det)) {
|
|
811
809
|
return ti;
|
|
812
810
|
}
|
|
813
811
|
|
|
814
|
-
float
|
|
815
|
-
ti.t =
|
|
816
|
-
ti.barycentric = e *
|
|
812
|
+
float tP = 1. / det;
|
|
813
|
+
ti.t = sp * tP;
|
|
814
|
+
ti.barycentric = e * tP;
|
|
817
815
|
|
|
818
816
|
return ti;
|
|
819
817
|
}
|
|
@@ -824,18 +822,18 @@ vec3 max;
|
|
|
824
822
|
};
|
|
825
823
|
|
|
826
824
|
|
|
827
|
-
vec3
|
|
825
|
+
vec3 eW(vec3 d) {
|
|
828
826
|
#ifdef DEPTH_QUERY_MODE
|
|
829
|
-
vec3
|
|
830
|
-
return 1.0 /
|
|
827
|
+
vec3 ah = mix(d, mix(vec3(1e-20), vec3(-1e-20), lessThan(d, vec3(0.0))), lessThan(abs(d), vec3(1e-20)));
|
|
828
|
+
return 1.0 / ah;
|
|
831
829
|
#else
|
|
832
830
|
return 1.0 / d;
|
|
833
831
|
#endif
|
|
834
832
|
}
|
|
835
833
|
|
|
836
|
-
vec3
|
|
834
|
+
vec3 eU(vec3 gb, vec3 o) {
|
|
837
835
|
#ifdef DEPTH_QUERY_MODE
|
|
838
|
-
return abs(
|
|
836
|
+
return abs(gb) * max(vec3(1.0), abs(o)) * 1e-6;
|
|
839
837
|
#else
|
|
840
838
|
return vec3(0.0);
|
|
841
839
|
#endif
|
|
@@ -843,21 +841,21 @@ return vec3(0.0);
|
|
|
843
841
|
|
|
844
842
|
|
|
845
843
|
|
|
846
|
-
float
|
|
844
|
+
float cH(vec3 o, vec3 d, vec3 xU, vec3 xT, float tMax) {
|
|
847
845
|
#ifdef DEPTH_QUERY_MODE
|
|
848
|
-
vec3
|
|
849
|
-
vec3
|
|
850
|
-
vec3
|
|
851
|
-
vec3 padding =
|
|
846
|
+
vec3 gb = eW(d);
|
|
847
|
+
vec3 xg = (xU - o) * gb;
|
|
848
|
+
vec3 xh = (xT - o) * gb;
|
|
849
|
+
vec3 padding = eU(gb, o);
|
|
852
850
|
#else
|
|
853
|
-
vec3
|
|
854
|
-
vec3
|
|
851
|
+
vec3 xg = (xU - o) / d;
|
|
852
|
+
vec3 xh = (xT - o) / d;
|
|
855
853
|
vec3 padding = vec3(0.0);
|
|
856
854
|
#endif
|
|
857
|
-
vec3
|
|
858
|
-
vec3
|
|
859
|
-
float t0 = max(
|
|
860
|
-
float t1 = min(
|
|
855
|
+
vec3 ns = min(xg, xh) - padding;
|
|
856
|
+
vec3 sW = max(xg, xh) + padding;
|
|
857
|
+
float t0 = max(ns.x, max(ns.y, ns.z));
|
|
858
|
+
float t1 = min(sW.x, min(sW.y, sW.z));
|
|
861
859
|
|
|
862
860
|
return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);
|
|
863
861
|
}
|
|
@@ -866,12 +864,12 @@ int maxDimension(vec3 v) {
|
|
|
866
864
|
return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);
|
|
867
865
|
}
|
|
868
866
|
|
|
869
|
-
vec3
|
|
867
|
+
vec3 mU(vec3 d, int dZ) {
|
|
870
868
|
|
|
871
869
|
|
|
872
|
-
if (
|
|
870
|
+
if (dZ == 0) {
|
|
873
871
|
return vec3(-d.y, -d.z, 1.0) / d.x;
|
|
874
|
-
} else if (
|
|
872
|
+
} else if (dZ == 1) {
|
|
875
873
|
return vec3(-d.z, -d.x, 1.0) / d.y;
|
|
876
874
|
} else {
|
|
877
875
|
return vec3(-d.x, -d.y, 1.0) / d.z;
|
|
@@ -886,43 +884,43 @@ if (isEmptyScene) {
|
|
|
886
884
|
return;
|
|
887
885
|
}
|
|
888
886
|
|
|
889
|
-
int
|
|
890
|
-
vec3
|
|
891
|
-
int
|
|
887
|
+
int dZ = maxDimension(abs(ray.d));
|
|
888
|
+
vec3 gH = mU(ray.d, dZ);
|
|
889
|
+
int am;
|
|
892
890
|
|
|
893
891
|
${getBVHTraverseCode(glsl `
|
|
894
892
|
si.triangleIndex = triangleIndex;
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
893
|
+
lR = tri;
|
|
894
|
+
hz = faceNormal;
|
|
895
|
+
aw = hit.barycentric;
|
|
896
|
+
hr = index;
|
|
897
|
+
sd = true;
|
|
898
|
+
am = bK;
|
|
901
899
|
`)}
|
|
902
900
|
|
|
903
|
-
if (
|
|
904
|
-
si.instanceIndex =
|
|
905
|
-
si.materialIndex = int(
|
|
901
|
+
if (sd) {
|
|
902
|
+
si.instanceIndex = am;
|
|
903
|
+
si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
906
904
|
|
|
907
|
-
|
|
905
|
+
hn(si, lR, aw, hr);
|
|
908
906
|
mat4 l2w = mat4(
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
907
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
908
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
909
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 7),
|
|
910
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 8)
|
|
913
911
|
);
|
|
914
912
|
mat4 w2l = mat4(
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
913
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 1),
|
|
914
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
|
|
915
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
916
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
919
917
|
);
|
|
920
|
-
mat3
|
|
921
|
-
si.faceNormal = normalize(
|
|
922
|
-
si.vertexNormal = normalize(
|
|
923
|
-
si.normal = normalize(
|
|
918
|
+
mat3 aG = transpose(mat3(w2l));
|
|
919
|
+
si.faceNormal = normalize(aG * hz);
|
|
920
|
+
si.vertexNormal = normalize(aG * si.vertexNormal);
|
|
921
|
+
si.normal = normalize(aG * si.normal);
|
|
924
922
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
925
|
-
si.coatNormal = normalize(
|
|
923
|
+
si.coatNormal = normalize(aG * si.coatNormal);
|
|
926
924
|
#endif
|
|
927
925
|
#ifdef USE_TANGENT
|
|
928
926
|
if (dot(si.tangent, si.tangent) > 0.0) {
|
|
@@ -947,46 +945,46 @@ return;
|
|
|
947
945
|
}
|
|
948
946
|
|
|
949
947
|
bool doubleSided = true;
|
|
950
|
-
int
|
|
951
|
-
vec3
|
|
952
|
-
int
|
|
948
|
+
int dZ = maxDimension(abs(ray.d));
|
|
949
|
+
vec3 gH = mU(ray.d, dZ);
|
|
950
|
+
int am;
|
|
953
951
|
|
|
954
952
|
${getBVHTraverseCode(glsl `
|
|
955
953
|
si.triangleIndex = triangleIndex;
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
954
|
+
lR = tri;
|
|
955
|
+
hz = faceNormal;
|
|
956
|
+
aw = hit.barycentric;
|
|
957
|
+
hr = index;
|
|
958
|
+
sd = true;
|
|
959
|
+
am = bK;
|
|
962
960
|
`, glsl `
|
|
963
|
-
if (
|
|
961
|
+
if (bK != instanceIndex) {
|
|
964
962
|
continue;
|
|
965
963
|
}
|
|
966
964
|
`, 'maxDistance')}
|
|
967
965
|
|
|
968
|
-
if (
|
|
969
|
-
si.instanceIndex =
|
|
970
|
-
si.materialIndex = int(
|
|
971
|
-
|
|
966
|
+
if (sd) {
|
|
967
|
+
si.instanceIndex = am;
|
|
968
|
+
si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
969
|
+
hn(si, lR, aw, hr);
|
|
972
970
|
mat4 l2w = mat4(
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
971
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
972
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
973
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 7),
|
|
974
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 8)
|
|
977
975
|
);
|
|
978
976
|
mat4 w2l = mat4(
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
977
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 1),
|
|
978
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
|
|
979
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
980
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
983
981
|
);
|
|
984
|
-
mat3
|
|
985
|
-
si.faceNormal = normalize(
|
|
986
|
-
si.vertexNormal = normalize(
|
|
987
|
-
si.normal = normalize(
|
|
982
|
+
mat3 aG = transpose(mat3(w2l));
|
|
983
|
+
si.faceNormal = normalize(aG * hz);
|
|
984
|
+
si.vertexNormal = normalize(aG * si.vertexNormal);
|
|
985
|
+
si.normal = normalize(aG * si.normal);
|
|
988
986
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
989
|
-
si.coatNormal = normalize(
|
|
987
|
+
si.coatNormal = normalize(aG * si.coatNormal);
|
|
990
988
|
#endif
|
|
991
989
|
#ifdef USE_TANGENT
|
|
992
990
|
if (dot(si.tangent, si.tangent) > 0.0) {
|
|
@@ -1002,35 +1000,35 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
|
|
|
1002
1000
|
}
|
|
1003
1001
|
}
|
|
1004
1002
|
|
|
1005
|
-
bool intersectSceneShadow(in Ray ray, float lightDistance, int
|
|
1003
|
+
bool intersectSceneShadow(in Ray ray, float lightDistance, int jR) {
|
|
1006
1004
|
|
|
1007
1005
|
if (isEmptyScene) {
|
|
1008
1006
|
return false;
|
|
1009
1007
|
}
|
|
1010
1008
|
|
|
1011
1009
|
bool doubleSided = true;
|
|
1012
|
-
int
|
|
1013
|
-
vec3
|
|
1010
|
+
int dZ = maxDimension(abs(ray.d));
|
|
1011
|
+
vec3 gH = mU(ray.d, dZ);
|
|
1014
1012
|
|
|
1015
1013
|
${getBVHTraverseCode(glsl `
|
|
1016
1014
|
|
|
1017
1015
|
|
|
1018
|
-
bool
|
|
1016
|
+
bool jA = true;
|
|
1019
1017
|
vec3 barycentric = hit.barycentric;
|
|
1020
1018
|
vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
|
|
1021
1019
|
|
|
1022
|
-
if (
|
|
1020
|
+
if (jA) {
|
|
1023
1021
|
#ifdef HAS_ALPHA
|
|
1024
|
-
int materialIndex = int(
|
|
1025
|
-
ivec2 i0 =
|
|
1026
|
-
ivec2 i1 =
|
|
1027
|
-
ivec2 i2 =
|
|
1022
|
+
int materialIndex = int(af(floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
1023
|
+
ivec2 i0 = gM(index.x, vertexColumns);
|
|
1024
|
+
ivec2 i1 = gM(index.y, vertexColumns);
|
|
1025
|
+
ivec2 i2 = gM(index.z, vertexColumns);
|
|
1028
1026
|
ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
|
|
1029
1027
|
ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
|
|
1030
1028
|
ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
|
|
1031
1029
|
|
|
1032
1030
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
1033
|
-
materialIndex =
|
|
1031
|
+
materialIndex = fh(m0, m1, m2, barycentric);
|
|
1034
1032
|
}
|
|
1035
1033
|
|
|
1036
1034
|
int ii = materialIndex * MAT_DATA_SIZE;
|
|
@@ -1044,12 +1042,12 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
|
|
|
1044
1042
|
vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
|
|
1045
1043
|
vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
|
|
1046
1044
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1047
|
-
vec4
|
|
1048
|
-
int uvProjection = int(
|
|
1045
|
+
vec4 mb = fetchMatData(ii + MAT_ROW_UV);
|
|
1046
|
+
int uvProjection = int(mb.r);
|
|
1049
1047
|
if (uvProjection > 0) {
|
|
1050
|
-
uv =
|
|
1048
|
+
uv = gE(uvProjection, position, hz, mb.zw);
|
|
1051
1049
|
} else {
|
|
1052
|
-
uv *=
|
|
1050
|
+
uv *= mb.zw;
|
|
1053
1051
|
}
|
|
1054
1052
|
|
|
1055
1053
|
alpha *= sampleMap(diffuseMapIndex, uv).a;
|
|
@@ -1063,32 +1061,32 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
|
|
|
1063
1061
|
vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
|
|
1064
1062
|
vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
|
|
1065
1063
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1066
|
-
vec4
|
|
1067
|
-
int uvProjection = int(
|
|
1064
|
+
vec4 mb = fetchMatData(ii + MAT_ROW_UV);
|
|
1065
|
+
int uvProjection = int(mb.r);
|
|
1068
1066
|
if (uvProjection > 0) {
|
|
1069
|
-
uv =
|
|
1067
|
+
uv = gE(uvProjection, position, hz, mb.zw);
|
|
1070
1068
|
} else {
|
|
1071
|
-
uv *=
|
|
1069
|
+
uv *= mb.zw;
|
|
1072
1070
|
}
|
|
1073
1071
|
alpha *= sampleMap(alphaMapIndex, uv).g;
|
|
1074
1072
|
}
|
|
1075
1073
|
#endif
|
|
1076
1074
|
float alphaCutoff = fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).a;
|
|
1077
|
-
alpha =
|
|
1075
|
+
alpha = lJ(
|
|
1078
1076
|
alpha, int(fetchMatData(ii + MAT_ROW_ALPHA).w), alphaCutoff
|
|
1079
1077
|
);
|
|
1080
|
-
if (
|
|
1078
|
+
if (ek(0u) > alpha) {
|
|
1081
1079
|
|
|
1082
1080
|
tMax = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
1083
|
-
|
|
1081
|
+
jA = false;
|
|
1084
1082
|
}
|
|
1085
1083
|
#endif
|
|
1086
1084
|
}
|
|
1087
|
-
if (
|
|
1085
|
+
if (jA) {
|
|
1088
1086
|
return true;
|
|
1089
1087
|
}
|
|
1090
1088
|
`, glsl `
|
|
1091
|
-
if (triangleIndex ==
|
|
1089
|
+
if (triangleIndex == jR) {
|
|
1092
1090
|
continue;
|
|
1093
1091
|
}
|
|
1094
1092
|
`, 'min(max(lightDistance, 0.0), RAY_MAX_DISTANCE)')}
|