@meimu/mutracer 0.3.0 → 0.3.1
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/CHANGELOG.md +222 -0
- package/LICENSES/FidelityFX-FSR.txt +19 -0
- package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
- package/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +6260 -5580
- package/docs/api.md +45 -18
- package/docs/materials.md +4 -2
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +3 -0
- package/docs/sampling.md +4 -0
- package/docs/technical/acceleration.md +52 -0
- package/docs/technical/aovs.md +79 -0
- package/docs/technical/caustics.md +109 -0
- package/docs/technical/continuous-spectrum.md +29 -0
- package/docs/technical/display-upscale.md +82 -0
- package/docs/technical/openpbr.md +99 -0
- package/docs/technical/pbrt-import.md +168 -0
- package/docs/technical/tiling.md +74 -0
- package/docs/technical/webgl.md +53 -0
- package/docs/viewer.md +11 -1
- package/lib/Display.d.ts +19 -5
- package/lib/Display.js +10 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -1
- package/lib/Engine.js +30 -2
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +20 -11
- package/lib/Render.js +32 -7
- package/lib/Render.js.map +1 -1
- package/lib/main.d.ts +3 -1
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/renderer/AovPrimitiveCache.js +39 -8
- package/lib/renderer/AovPrimitiveCache.js.map +1 -1
- package/lib/renderer/DisplayPostProcess.d.ts +8 -3
- package/lib/renderer/DisplayPostProcess.js +51 -18
- package/lib/renderer/DisplayPostProcess.js.map +1 -1
- package/lib/renderer/MaterialData.js +7 -2
- package/lib/renderer/MaterialData.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +7 -1
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +2 -2
- package/lib/renderer/TileRender.js +128 -7
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +6 -1
- package/lib/renderer/WGPUAov.js +108 -14
- package/lib/renderer/WGPUAov.js.map +1 -1
- package/lib/renderer/WGPUCanvasSurface.js +12 -1
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPURayTraceOutput.js +12 -12
- package/lib/renderer/WGPURayTracePass.d.ts +17 -4
- package/lib/renderer/WGPURayTracePass.js +194 -71
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +46 -40
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLAov.js +3 -3
- package/lib/renderer/WebGLAov.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
- package/lib/renderer/WebGLFullQuadPass.js +8 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
- package/lib/renderer/WebGLRayTracePass.js +115 -111
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +10 -3
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +57 -57
- package/lib/renderer/aov.d.ts +13 -1
- package/lib/renderer/aov.js +21 -2
- package/lib/renderer/aov.js.map +1 -1
- package/lib/renderer/aovDisplay.js +2 -2
- package/lib/renderer/aovDisplay.js.map +1 -1
- package/lib/renderer/binnedSahBvh.d.ts +2 -1
- package/lib/renderer/binnedSahBvh.js +24 -17
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +3 -1
- package/lib/renderer/bvhAccel.js +36 -6
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +1 -1
- package/lib/renderer/cameraUniform.js +6 -2
- package/lib/renderer/cameraUniform.js.map +1 -1
- package/lib/renderer/compactVertices.d.ts +14 -0
- package/lib/renderer/compactVertices.js +124 -0
- package/lib/renderer/compactVertices.js.map +1 -0
- package/lib/renderer/easu.d.ts +11 -0
- package/lib/renderer/easu.js +156 -0
- package/lib/renderer/easu.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +1 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +3 -2
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +44 -36
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
- package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
- package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
- package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
- 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 +12 -6
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.js +233 -170
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
- package/lib/renderer/openPbrEnergyLut.js +18 -1
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/pathLimits.d.ts +5 -4
- package/lib/renderer/pathLimits.js +6 -5
- package/lib/renderer/pathLimits.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +2 -0
- package/lib/renderer/prepareMeshBVH.js +5 -3
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +1 -1
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -0
- package/lib/renderer/renderPipeline.js +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +1 -1
- package/lib/renderer/researchTransport.js.map +1 -1
- package/lib/renderer/sceneAssembly.d.ts +1 -1
- package/lib/renderer/sceneAssembly.js +4 -3
- package/lib/renderer/sceneAssembly.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.d.ts +1 -1
- package/lib/renderer/sceneChangeDetector.js +3 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- 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/scenePreparation.d.ts +3 -2
- package/lib/renderer/scenePreparation.js +18 -2
- package/lib/renderer/scenePreparation.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.js +2 -2
- package/lib/renderer/staticBvhPreparation.d.ts +9 -0
- package/lib/renderer/staticBvhPreparation.js +8 -2
- package/lib/renderer/staticBvhPreparation.js.map +1 -1
- package/lib/renderer/surfaceHit.d.ts +10 -0
- package/lib/renderer/surfaceHit.js +22 -0
- package/lib/renderer/surfaceHit.js.map +1 -0
- package/lib/renderer/tangentRequirements.d.ts +2 -0
- package/lib/renderer/tangentRequirements.js +7 -0
- package/lib/renderer/tangentRequirements.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +4 -0
- package/lib/renderer/textureAtlas.js +48 -2
- package/lib/renderer/textureAtlas.js.map +1 -1
- package/lib/renderer/webgl.js +4 -0
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglVertexAttributes.d.ts +17 -0
- package/lib/renderer/webglVertexAttributes.js +44 -0
- package/lib/renderer/webglVertexAttributes.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +2 -2
- package/lib/renderer/wgpuMaterialConstants.js +4 -3
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
- package/lib/renderer/wgpuSceneUniform.js +2 -2
- package/lib/renderer/wgpuSceneUniform.js.map +1 -1
- package/lib/renderer/wgpuShaderSource.d.ts +15 -0
- package/lib/renderer/wgpuShaderSource.js +1 -1
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
- package/lib/renderer/wgsl/causticLight.compute.js +121 -119
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
- package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/easu.wgsl.js +80 -0
- package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.js +89 -89
- package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Scene.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 +21 -14
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +5 -2
- package/lib/oidnBundledWeights.cdn.d.ts +0 -2
- package/lib/oidnBundledWeights.cdn.js +0 -5
- package/lib/oidnBundledWeights.cdn.js.map +0 -1
- package/lib/renderer/bvh.worker.d.ts +0 -1
- package/lib/renderer/bvh.worker.js +0 -16
- package/lib/renderer/bvh.worker.js.map +0 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
- package/lib/renderer/bvhWorkerBuild.js +0 -17
- package/lib/renderer/bvhWorkerBuild.js.map +0 -1
- package/lib/renderer/lightCore.d.ts +0 -12
- package/lib/renderer/lightCore.js +0 -13
- package/lib/renderer/lightCore.js.map +0 -1
- package/lib/renderer/materialCore.d.ts +0 -8
- package/lib/renderer/materialCore.js +0 -9
- package/lib/renderer/materialCore.js.map +0 -1
- package/lib/scene/PixelTexture.d.ts +0 -6
- package/lib/scene/PixelTexture.js +0 -10
- package/lib/scene/PixelTexture.js.map +0 -1
- package/lib/util/studioLighting.d.ts +0 -18
- package/lib/util/studioLighting.js +0 -36
- package/lib/util/studioLighting.js.map +0 -1
|
@@ -12,25 +12,25 @@ int triangleIndex = primitiveOffset + k;
|
|
|
12
12
|
${skipTriangleCode}
|
|
13
13
|
vec4 r3 = fetchBVH(triangleIndex);
|
|
14
14
|
ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;
|
|
15
|
-
|
|
15
|
+
fL tri = fL(
|
|
16
16
|
fetchData(positionBuffer, index.x, vertexColumns).xyz,
|
|
17
17
|
fetchData(positionBuffer, index.y, vertexColumns).xyz,
|
|
18
18
|
fetchData(positionBuffer, index.z, vertexColumns).xyz
|
|
19
19
|
);
|
|
20
|
-
|
|
20
|
+
eF hit = fY(o, d, tri, ei, gZ, 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
|
|
27
|
+
int lc = int(af(
|
|
28
28
|
floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)
|
|
29
29
|
).x);
|
|
30
|
-
bool
|
|
31
|
-
|
|
30
|
+
bool jm = fetchMatData(
|
|
31
|
+
lc * MAT_DATA_SIZE + MAT_ROW_ALPHA
|
|
32
32
|
).z > 0.5;
|
|
33
|
-
if (!doubleSided && !
|
|
33
|
+
if (!doubleSided && !jm && dot(faceNormal, d) > 0.0) {
|
|
34
34
|
continue;
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -41,31 +41,31 @@ ${handleHitCode}
|
|
|
41
41
|
return glsl `
|
|
42
42
|
ivec2 stack[STACK_SIZE];
|
|
43
43
|
int top = -1;
|
|
44
|
-
int
|
|
44
|
+
int vQ = -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
|
|
50
|
+
bool tD = false;
|
|
51
|
+
vec3 hU;
|
|
52
52
|
vec3 aw;
|
|
53
|
-
ivec3
|
|
53
|
+
ivec3 hL;
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
fL mL;
|
|
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 AI = 0;
|
|
62
|
+
while(top >= 0 && AI < 5000) {
|
|
63
|
+
AI++;
|
|
64
64
|
ivec2 node = stack[top--];
|
|
65
65
|
|
|
66
66
|
int bK = node.y;
|
|
67
67
|
|
|
68
|
-
if (bK !=
|
|
68
|
+
if (bK != vQ) {
|
|
69
69
|
if (bK < 0) {
|
|
70
70
|
o = ray.o;
|
|
71
71
|
d = ray.d;
|
|
@@ -80,111 +80,111 @@ fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
|
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
|
+
ei = maxDimension(abs(d));
|
|
84
|
+
gZ = nV(d, ei);
|
|
85
|
+
vQ = bK;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
int bufferOff = bK < 0 ? 0 : blasOffset;
|
|
89
|
-
uint
|
|
90
|
-
int
|
|
91
|
-
int
|
|
89
|
+
uint fW = bK < 0 ? 0u : floatBitsToUint(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).x);
|
|
90
|
+
int hj = int(fW >> 30u);
|
|
91
|
+
int fc = int(fW & 0x3fffffffu);
|
|
92
92
|
int primitiveCount = 0;
|
|
93
93
|
int primitiveOffset = 0;
|
|
94
94
|
|
|
95
|
-
if (
|
|
96
|
-
uint
|
|
97
|
-
if ((
|
|
98
|
-
primitiveCount = int((
|
|
99
|
-
primitiveOffset = bufferOff +
|
|
95
|
+
if (hj == 3) {
|
|
96
|
+
uint iE = uint(node.x);
|
|
97
|
+
if ((iE & 0x80000000u) != 0u) {
|
|
98
|
+
primitiveCount = int((iE >> 23u) & 0xffu);
|
|
99
|
+
primitiveOffset = bufferOff + fc + int(iE & 0x007fffffu);
|
|
100
100
|
}
|
|
101
101
|
else {
|
|
102
102
|
int i = node.x + bufferOff;
|
|
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(
|
|
103
|
+
vec4 kj = fetchBVH(i);
|
|
104
|
+
vec4 fR = fetchBVH(i + 1);
|
|
105
|
+
vec4 oG = fetchBVH(i + 2);
|
|
106
|
+
vec4 oH = fetchBVH(i + 3);
|
|
107
|
+
vec4 oI = fetchBVH(i + 4);
|
|
108
|
+
uint header = floatBitsToUint(kj.w);
|
|
109
|
+
int uc = int(header << 24u) >> 24;
|
|
110
|
+
int ud = int((header >> 8u) << 24u) >> 24;
|
|
111
|
+
int ue = int((header >> 16u) << 24u) >> 24;
|
|
112
|
+
vec3 ih = vec3(
|
|
113
|
+
uintBitsToFloat(uint(uc + 127) << 23u),
|
|
114
|
+
uintBitsToFloat(uint(ud + 127) << 23u),
|
|
115
|
+
uintBitsToFloat(uint(ue + 127) << 23u)
|
|
116
116
|
);
|
|
117
|
-
uint childBase = floatBitsToUint(
|
|
118
|
-
uint
|
|
117
|
+
uint childBase = floatBitsToUint(fR.x);
|
|
118
|
+
uint qE = floatBitsToUint(fR.y);
|
|
119
119
|
uint internalMask = header >> 24u;
|
|
120
|
-
uint
|
|
120
|
+
uint yl = (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 gX[12] = uint[12](
|
|
124
|
+
floatBitsToUint(oG.x), floatBitsToUint(oG.y),
|
|
125
|
+
floatBitsToUint(oG.z), floatBitsToUint(oG.w),
|
|
126
|
+
floatBitsToUint(oH.x), floatBitsToUint(oH.y),
|
|
127
|
+
floatBitsToUint(oH.z), floatBitsToUint(oH.w),
|
|
128
|
+
floatBitsToUint(oI.x), floatBitsToUint(oI.y),
|
|
129
|
+
floatBitsToUint(oI.z), floatBitsToUint(oI.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) ^ yl;
|
|
134
|
+
uint vF = slot >= 4u
|
|
135
|
+
? floatBitsToUint(fR.w)
|
|
136
|
+
: floatBitsToUint(fR.z);
|
|
137
|
+
uint meta = (vF >> ((slot & 3u) * 8u)) & 0xffu;
|
|
138
138
|
if (meta == 0u) continue;
|
|
139
|
-
uint
|
|
140
|
-
uint
|
|
141
|
-
vec3
|
|
142
|
-
float((
|
|
143
|
-
float((
|
|
144
|
-
float((
|
|
139
|
+
uint nr = (slot & 3u) * 8u;
|
|
140
|
+
uint me = slot >> 2u;
|
|
141
|
+
vec3 wS = vec3(
|
|
142
|
+
float((gX[me] >> nr) & 0xffu),
|
|
143
|
+
float((gX[2u + me] >> nr) & 0xffu),
|
|
144
|
+
float((gX[4u + me] >> nr) & 0xffu)
|
|
145
145
|
);
|
|
146
|
-
vec3
|
|
147
|
-
float((
|
|
148
|
-
float((
|
|
149
|
-
float((
|
|
146
|
+
vec3 wR = vec3(
|
|
147
|
+
float((gX[6u + me] >> nr) & 0xffu),
|
|
148
|
+
float((gX[8u + me] >> nr) & 0xffu),
|
|
149
|
+
float((gX[10u + me] >> nr) & 0xffu)
|
|
150
150
|
);
|
|
151
|
-
vec3
|
|
152
|
-
vec3
|
|
153
|
-
if (
|
|
154
|
-
uint
|
|
155
|
-
if (
|
|
156
|
-
uint
|
|
157
|
-
uint
|
|
151
|
+
vec3 zp = kj.xyz + wS * ih;
|
|
152
|
+
vec3 zo = kj.xyz + wR * ih;
|
|
153
|
+
if (bP(o, d, zp, zo, tMax) <= 0.0) continue;
|
|
154
|
+
uint kl = meta & 0x1fu;
|
|
155
|
+
if (kl >= 24u) {
|
|
156
|
+
uint oZ = internalMask & ((1u << slot) - 1u);
|
|
157
|
+
uint wb = childBase + tl(oZ);
|
|
158
158
|
stack[++top] = ivec2(
|
|
159
|
-
|
|
159
|
+
fc + int(wb * 5u), bK
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
162
|
else {
|
|
163
|
-
uint triangleCount =
|
|
164
|
-
uint
|
|
165
|
-
uint
|
|
163
|
+
uint triangleCount = tl(meta >> 5u);
|
|
164
|
+
uint ut = qE + kl;
|
|
165
|
+
uint zC = 0x80000000u |
|
|
166
166
|
(triangleCount << 23u) |
|
|
167
|
-
(
|
|
168
|
-
stack[++top] = ivec2(int(
|
|
167
|
+
(ut & 0x007fffffu);
|
|
168
|
+
stack[++top] = ivec2(int(zC), bK);
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
-
else if (
|
|
173
|
+
else if (hj == 2) {
|
|
174
174
|
int i = node.x + bufferOff;
|
|
175
|
-
vec4
|
|
176
|
-
vec4
|
|
177
|
-
vec4
|
|
178
|
-
vec4
|
|
179
|
-
primitiveCount = int(floatBitsToUint(
|
|
175
|
+
vec4 zr = fetchBVH(i);
|
|
176
|
+
vec4 zs = fetchBVH(i + 1);
|
|
177
|
+
vec4 zt = fetchBVH(i + 2);
|
|
178
|
+
vec4 zu = fetchBVH(i + 3);
|
|
179
|
+
primitiveCount = int(floatBitsToUint(zt.w));
|
|
180
180
|
if (primitiveCount > 0) {
|
|
181
|
-
primitiveOffset = bufferOff +
|
|
181
|
+
primitiveOffset = bufferOff + fc + int(floatBitsToUint(zu.w));
|
|
182
182
|
}
|
|
183
183
|
else {
|
|
184
|
-
int left =
|
|
185
|
-
int right =
|
|
186
|
-
float d0 =
|
|
187
|
-
float d1 =
|
|
184
|
+
int left = fc + int(floatBitsToUint(zr.w) * 4u);
|
|
185
|
+
int right = fc + int(floatBitsToUint(zs.w) * 4u);
|
|
186
|
+
float d0 = bP(o, d, zr.xyz, zs.xyz, tMax);
|
|
187
|
+
float d1 = bP(o, d, zt.xyz, zu.xyz, tMax);
|
|
188
188
|
if (d0 > d1) {
|
|
189
189
|
if (d0 > 0.0) stack[++top] = ivec2(left, bK);
|
|
190
190
|
if (d1 > 0.0) stack[++top] = ivec2(right, bK);
|
|
@@ -195,62 +195,62 @@ 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 = bufferOff +
|
|
198
|
+
else if (hj == 1) {
|
|
199
|
+
uint iE = uint(node.x);
|
|
200
|
+
if ((iE & 0x80000000u) != 0u) {
|
|
201
|
+
primitiveCount = int((iE >> 23u) & 0xffu);
|
|
202
|
+
primitiveOffset = bufferOff + fc + int(iE & 0x007fffffu);
|
|
203
203
|
}
|
|
204
204
|
else {
|
|
205
205
|
int i = node.x + bufferOff;
|
|
206
|
-
vec4
|
|
207
|
-
vec4
|
|
208
|
-
vec4
|
|
209
|
-
vec4
|
|
210
|
-
vec3 nodeMin =
|
|
211
|
-
vec3
|
|
212
|
-
uint
|
|
213
|
-
floatBitsToUint(
|
|
214
|
-
floatBitsToUint(
|
|
206
|
+
vec4 xS = fetchBVH(i);
|
|
207
|
+
vec4 tR = fetchBVH(i + 1);
|
|
208
|
+
vec4 rW = fetchBVH(i + 2);
|
|
209
|
+
vec4 pL = fetchBVH(i + 3);
|
|
210
|
+
vec3 nodeMin = xS.xyz;
|
|
211
|
+
vec3 ej = vec3(xS.w, tR.x, tR.y);
|
|
212
|
+
uint nH[4] = uint[4](
|
|
213
|
+
floatBitsToUint(tR.z), floatBitsToUint(tR.w),
|
|
214
|
+
floatBitsToUint(rW.x), floatBitsToUint(rW.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 yV = fh(floatBitsToUint(rW.z));
|
|
217
|
+
vec4 yW = fh(floatBitsToUint(rW.w));
|
|
218
|
+
vec4 yX = fh(floatBitsToUint(pL.x));
|
|
219
|
+
vec4 yS = fh(floatBitsToUint(pL.y));
|
|
220
|
+
vec4 yT = fh(floatBitsToUint(pL.z));
|
|
221
|
+
vec4 yU = fh(floatBitsToUint(pL.w));
|
|
222
|
+
vec3 invD = traversalInverse(d);
|
|
223
|
+
vec3 padding = ff(invD, o);
|
|
224
|
+
vec4 tx0 = (nodeMin.x + yV * ej.x - o.x) * invD.x;
|
|
225
|
+
vec4 tx1 = (nodeMin.x + yS * ej.x - o.x) * invD.x;
|
|
226
|
+
vec4 ty0 = (nodeMin.y + yW * ej.y - o.y) * invD.y;
|
|
227
|
+
vec4 ty1 = (nodeMin.y + yT * ej.y - o.y) * invD.y;
|
|
228
|
+
vec4 tz0 = (nodeMin.z + yX * ej.z - o.z) * invD.z;
|
|
229
|
+
vec4 tz1 = (nodeMin.z + yU * ej.z - o.z) * invD.z;
|
|
230
|
+
vec4 ot = max(max((min(tx0, tx1) - vec4(padding.x)), (min(ty0, ty1) - vec4(padding.y))), (min(tz0, tz1) - vec4(padding.z)));
|
|
231
|
+
vec4 uA = min(min((max(tx0, tx1) + vec4(padding.x)), (max(ty0, ty1) + vec4(padding.y))), (max(tz0, tz1) + vec4(padding.z)));
|
|
232
|
+
vec4 distance = mix(uA, ot, greaterThan(ot, vec4(0.0)));
|
|
233
|
+
distance = mix(distance, vec4(-1.0), greaterThan(ot, min(uA, vec4(tMax))));
|
|
234
|
+
float fi[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 ee = -1.0;
|
|
239
|
+
int eq = -1;
|
|
240
240
|
for (int child = 0; child < 4; child++) {
|
|
241
|
-
if (
|
|
242
|
-
|
|
243
|
-
|
|
241
|
+
if (nH[child] != 0u && fi[child] > ee) {
|
|
242
|
+
ee = fi[child];
|
|
243
|
+
eq = child;
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
|
-
if (
|
|
247
|
-
uint
|
|
248
|
-
int
|
|
249
|
-
if ((
|
|
250
|
-
|
|
246
|
+
if (eq >= 0 && ee > 0.0) {
|
|
247
|
+
uint ph = nH[eq];
|
|
248
|
+
int kv = int(ph);
|
|
249
|
+
if ((ph & 0x80000000u) == 0u) {
|
|
250
|
+
kv += fc;
|
|
251
251
|
}
|
|
252
|
-
stack[++top] = ivec2(
|
|
253
|
-
|
|
252
|
+
stack[++top] = ivec2(kv, bK);
|
|
253
|
+
fi[eq] = -1.0;
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
}
|
|
@@ -258,14 +258,14 @@ eY[ej] = -1.0;
|
|
|
258
258
|
else {
|
|
259
259
|
int i = node.x + bufferOff;
|
|
260
260
|
vec4 r1 = fetchBVH(i);
|
|
261
|
-
int
|
|
261
|
+
int bh = floatBitsToInt(r1.w);
|
|
262
262
|
|
|
263
|
-
if (
|
|
263
|
+
if (bh >= 0) {
|
|
264
264
|
int left = node.x + 2;
|
|
265
|
-
int right =
|
|
265
|
+
int right = bh + fc;
|
|
266
266
|
|
|
267
|
-
float d0 =
|
|
268
|
-
float d1 =
|
|
267
|
+
float d0 = bP(o, d, fetchBVH(left + bufferOff).xyz, fetchBVH(left + 1 + bufferOff).xyz, tMax);
|
|
268
|
+
float d1 = bP(o, d, fetchBVH(right + bufferOff).xyz, fetchBVH(right + 1 + bufferOff).xyz, tMax);
|
|
269
269
|
if (d0 > d1) {
|
|
270
270
|
if (d0 > 0.0) {
|
|
271
271
|
stack[++top] = ivec2(left, bK);
|
|
@@ -285,13 +285,16 @@ stack[++top] = ivec2(left, bK);
|
|
|
285
285
|
}
|
|
286
286
|
else {
|
|
287
287
|
if (bK < 0) {
|
|
288
|
-
for (int k = 0; k < -
|
|
288
|
+
for (int k = 0; k < -bh; k++) {
|
|
289
289
|
vec4 r3 = fetchBVH(i + 2 + k);
|
|
290
|
+
int box = floatBitsToInt(r3.w);
|
|
291
|
+
if (bP(ray.o, ray.d, fetchBVH(box).xyz, fetchBVH(box + 1).xyz, tMax) > 0.0) {
|
|
290
292
|
stack[++top] = ivec2(floatBitsToInt(r3.y), floatBitsToInt(r3.x));
|
|
291
293
|
}
|
|
292
294
|
}
|
|
295
|
+
}
|
|
293
296
|
else {
|
|
294
|
-
primitiveCount = -
|
|
297
|
+
primitiveCount = -bh;
|
|
295
298
|
primitiveOffset = i + 2;
|
|
296
299
|
}
|
|
297
300
|
}
|
|
@@ -303,31 +306,31 @@ ${intersectTriangles}
|
|
|
303
306
|
`;
|
|
304
307
|
}
|
|
305
308
|
export default createShaderMixin({
|
|
309
|
+
defines: {
|
|
310
|
+
VERTEX_ATTRIBUTE_STRIDE: 2
|
|
311
|
+
},
|
|
306
312
|
uniforms: {
|
|
307
313
|
positionBuffer: Shader.uniform('sampler2D'),
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
uv1Buffer: Shader.uniform('sampler2D'),
|
|
312
|
-
colorBuffer: Shader.uniform('sampler2D'),
|
|
313
|
-
materialIndexBuffer: Shader.uniform('sampler2D'),
|
|
314
|
+
// Interleaved shading attributes; layout in webglVertexAttributes.ts.
|
|
315
|
+
vertexAttributes: Shader.uniform('sampler2D'),
|
|
316
|
+
// TLAS, BLASes and then the instance records.
|
|
314
317
|
bvhBuffer: Shader.uniform('sampler2D'),
|
|
315
|
-
instancesBuffer: Shader.uniform('sampler2D'),
|
|
316
318
|
bvhColumns: Shader.uniform('int', 1),
|
|
317
319
|
vertexColumns: Shader.uniform('int', 1),
|
|
318
|
-
|
|
320
|
+
vertexAttributeColumns: Shader.uniform('int', 1),
|
|
321
|
+
instancesOffset: Shader.uniform('int', 0),
|
|
319
322
|
blasOffset: Shader.uniform('int'),
|
|
320
323
|
isEmptyScene: Shader.uniform('bool')
|
|
321
324
|
},
|
|
322
325
|
main: glsl `
|
|
323
326
|
|
|
324
|
-
struct
|
|
327
|
+
struct fL {
|
|
325
328
|
vec3 p0;
|
|
326
329
|
vec3 p1;
|
|
327
330
|
vec3 p2;
|
|
328
331
|
};
|
|
329
332
|
#ifdef NUM_LIGHTS
|
|
330
|
-
float
|
|
333
|
+
float hM(float rad, vec3 pos, Ray r) {
|
|
331
334
|
vec3 op = pos - r.o;
|
|
332
335
|
float eps = 0.001;
|
|
333
336
|
float b = dot(op, r.d);
|
|
@@ -347,7 +350,7 @@ return t2;
|
|
|
347
350
|
return INF;
|
|
348
351
|
}
|
|
349
352
|
|
|
350
|
-
float
|
|
353
|
+
float oU(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
|
|
351
354
|
float dt = dot(r.d, n);
|
|
352
355
|
float t = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
353
356
|
|
|
@@ -376,7 +379,7 @@ float oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
|
|
|
376
379
|
return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
|
|
377
380
|
}
|
|
378
381
|
|
|
379
|
-
float
|
|
382
|
+
float iB(Ray r, Light light, out LightSampleRec lightSample) {
|
|
380
383
|
|
|
381
384
|
|
|
382
385
|
|
|
@@ -393,15 +396,15 @@ vec3 normal = normalize(cross(u, v));
|
|
|
393
396
|
if (dot(normal, r.d) > 0.)
|
|
394
397
|
return INF;
|
|
395
398
|
|
|
396
|
-
d =
|
|
399
|
+
d = oU(pos, u, v, normal, r);
|
|
397
400
|
if (d < 0.) {
|
|
398
401
|
d = INF;
|
|
399
402
|
}
|
|
400
403
|
else {
|
|
401
|
-
float
|
|
404
|
+
float cv = dot(-r.d, normal);
|
|
402
405
|
float spread = light.spread;
|
|
403
|
-
if (
|
|
404
|
-
lightSample.pdf = (d * d) / (light.area *
|
|
406
|
+
if (cv >= cos(spread * PI / 2.0)) {
|
|
407
|
+
lightSample.pdf = (d * d) / (light.area * cv);
|
|
405
408
|
lightSample.emission = light.emission;
|
|
406
409
|
}
|
|
407
410
|
}
|
|
@@ -410,10 +413,10 @@ lightSample.emission = light.emission;
|
|
|
410
413
|
#ifdef HAS_SPHERE_LIGHTS
|
|
411
414
|
if (type == SPHERE_LIGHT) {
|
|
412
415
|
if (light.radius <= 0.0) {
|
|
413
|
-
vec3
|
|
414
|
-
float projection = dot(
|
|
415
|
-
vec3
|
|
416
|
-
if (projection <= EPS || dot(
|
|
416
|
+
vec3 lj = light.position - r.o;
|
|
417
|
+
float projection = dot(lj, r.d);
|
|
418
|
+
vec3 bf = lj - projection * r.d;
|
|
419
|
+
if (projection <= EPS || dot(bf, bf) > 1e-8) return INF;
|
|
417
420
|
d = projection;
|
|
418
421
|
lightSample.direction = r.d;
|
|
419
422
|
lightSample.normal = -r.d;
|
|
@@ -421,7 +424,7 @@ lightSample.dist = d;
|
|
|
421
424
|
lightSample.pdf = 1.0;
|
|
422
425
|
lightSample.isDelta = true;
|
|
423
426
|
} else {
|
|
424
|
-
d =
|
|
427
|
+
d = hM(light.radius, light.position, r);
|
|
425
428
|
lightSample.isDelta = false;
|
|
426
429
|
}
|
|
427
430
|
if (d < 0.) {
|
|
@@ -440,10 +443,10 @@ lightSample.emission = light.radius <= 0.0
|
|
|
440
443
|
#ifdef HAS_SPOT_LIGHTS
|
|
441
444
|
if (type == SPOT_LIGHT) {
|
|
442
445
|
if (light.radius <= 0.0) {
|
|
443
|
-
vec3
|
|
444
|
-
float projection = dot(
|
|
445
|
-
vec3
|
|
446
|
-
if (projection <= EPS || dot(
|
|
446
|
+
vec3 lj = light.position - r.o;
|
|
447
|
+
float projection = dot(lj, r.d);
|
|
448
|
+
vec3 bf = lj - projection * r.d;
|
|
449
|
+
if (projection <= EPS || dot(bf, bf) > 1e-8) return INF;
|
|
447
450
|
d = projection;
|
|
448
451
|
lightSample.direction = r.d;
|
|
449
452
|
lightSample.normal = -r.d;
|
|
@@ -451,17 +454,17 @@ lightSample.dist = d;
|
|
|
451
454
|
lightSample.pdf = 1.0;
|
|
452
455
|
lightSample.isDelta = true;
|
|
453
456
|
} else {
|
|
454
|
-
d =
|
|
457
|
+
d = hM(light.radius, light.position, r);
|
|
455
458
|
lightSample.isDelta = false;
|
|
456
459
|
}
|
|
457
460
|
if (d != INF) {
|
|
458
|
-
vec3
|
|
459
|
-
float
|
|
460
|
-
if (
|
|
461
|
+
vec3 zA = r.o + d * r.d;
|
|
462
|
+
float od = evaluateSpotEmissionMultiplier(light, normalize(r.o - zA));
|
|
463
|
+
if (od <= 0.0) return INF;
|
|
461
464
|
if (light.radius > 0.0) {
|
|
462
465
|
lightSample.pdf = sphereSolidAnglePdf(r.o, light.position, light.radius);
|
|
463
466
|
}
|
|
464
|
-
lightSample.emission = light.emission *
|
|
467
|
+
lightSample.emission = light.emission * od * (light.radius <= 0.0
|
|
465
468
|
? 1.0 / max(d * d, 1e-8)
|
|
466
469
|
: 1.0);
|
|
467
470
|
}
|
|
@@ -472,7 +475,7 @@ return d;
|
|
|
472
475
|
}
|
|
473
476
|
#endif
|
|
474
477
|
|
|
475
|
-
int
|
|
478
|
+
int fv(ivec4 m0, ivec4 m1, ivec4 m2, vec3 bary) {
|
|
476
479
|
vec2 m00 = af(m0.x);
|
|
477
480
|
vec2 m01 = af(m0.y);
|
|
478
481
|
vec2 m02 = af(m0.z);
|
|
@@ -492,86 +495,102 @@ float w20 = m20.y * bary.z;
|
|
|
492
495
|
float w21 = m21.y * bary.z;
|
|
493
496
|
float w22 = m22.y * bary.z;
|
|
494
497
|
|
|
495
|
-
float
|
|
498
|
+
float hB = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
496
499
|
|
|
497
|
-
w00 = w00 /
|
|
498
|
-
w01 = w01 /
|
|
499
|
-
w02 = w02 /
|
|
500
|
-
w10 = w10 /
|
|
501
|
-
w11 = w11 /
|
|
502
|
-
w12 = w12 /
|
|
503
|
-
w20 = w20 /
|
|
504
|
-
w21 = w21 /
|
|
505
|
-
w22 = w22 /
|
|
500
|
+
w00 = w00 / hB;
|
|
501
|
+
w01 = w01 / hB + w00;
|
|
502
|
+
w02 = w02 / hB + w01;
|
|
503
|
+
w10 = w10 / hB + w02;
|
|
504
|
+
w11 = w11 / hB + w10;
|
|
505
|
+
w12 = w12 / hB + w11;
|
|
506
|
+
w20 = w20 / hB + w12;
|
|
507
|
+
w21 = w21 / hB + w20;
|
|
508
|
+
w22 = w22 / hB + w21;
|
|
506
509
|
|
|
507
|
-
float rand =
|
|
508
|
-
float
|
|
510
|
+
float rand = cm(0u);
|
|
511
|
+
float oV;
|
|
509
512
|
if (rand < w00) {
|
|
510
|
-
|
|
513
|
+
oV = m00.x;
|
|
511
514
|
} else if (rand < w01) {
|
|
512
|
-
|
|
515
|
+
oV = m01.x;
|
|
513
516
|
} else if (rand < w02) {
|
|
514
|
-
|
|
517
|
+
oV = m02.x;
|
|
515
518
|
} else if (rand < w10) {
|
|
516
|
-
|
|
519
|
+
oV = m10.x;
|
|
517
520
|
} else if (rand < w11) {
|
|
518
|
-
|
|
521
|
+
oV = m11.x;
|
|
519
522
|
} else if (rand < w12) {
|
|
520
|
-
|
|
523
|
+
oV = m12.x;
|
|
521
524
|
} else if (rand < w20) {
|
|
522
|
-
|
|
525
|
+
oV = m20.x;
|
|
523
526
|
} else if (rand < w21) {
|
|
524
|
-
|
|
527
|
+
oV = m21.x;
|
|
525
528
|
} else {
|
|
526
|
-
|
|
529
|
+
oV = m22.x;
|
|
527
530
|
}
|
|
528
|
-
return int(
|
|
531
|
+
return int(oV);
|
|
529
532
|
}
|
|
530
533
|
|
|
531
534
|
|
|
532
535
|
vec4 fetchIns(int i);
|
|
533
536
|
|
|
537
|
+
vec4 bs(int vertex, int slot) {
|
|
538
|
+
return fetchData(vertexAttributes, vertex * VERTEX_ATTRIBUTE_STRIDE + slot, vertexAttributeColumns);
|
|
539
|
+
}
|
|
540
|
+
vec3 fetchVertexNormal(int vertex) { return bs(vertex, 0).xyz; }
|
|
541
|
+
vec2 er(int vertex) { return bs(vertex, 1).xy; }
|
|
542
|
+
ivec4 dT(int vertex) {
|
|
543
|
+
return ivec4(bs(vertex, 0).w, bs(vertex, 1).zw, 0.0);
|
|
544
|
+
}
|
|
545
|
+
vec2 dK(int vertex) {
|
|
546
|
+
#ifdef USE_UV1
|
|
547
|
+
return bs(vertex, VERTEX_UV1_SLOT).xy;
|
|
548
|
+
#else
|
|
549
|
+
return vec2(0.0);
|
|
550
|
+
#endif
|
|
551
|
+
}
|
|
552
|
+
#ifdef USE_TANGENT
|
|
553
|
+
vec4 ef(int vertex) { return bs(vertex, VERTEX_TANGENT_SLOT); }
|
|
554
|
+
#endif
|
|
534
555
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
556
|
+
|
|
557
|
+
mat2x3 eI(vec3 normal, vec3 dp1, vec3 dp2, vec2 pU, vec2 pV, vec4 aT) {
|
|
558
|
+
float determinant = pU.x * pV.y - pU.y * pV.x;
|
|
559
|
+
vec3 t = aT.xyz;
|
|
538
560
|
vec3 b = vec3(0.0);
|
|
539
561
|
|
|
540
|
-
float
|
|
562
|
+
float sO = abs(aT.w) > 1.5 ? 0.0 : aT.w;
|
|
541
563
|
if (abs(determinant) > 1e-12) {
|
|
542
|
-
vec3 dt = (dp1 *
|
|
543
|
-
vec3 db = (dp2 *
|
|
564
|
+
vec3 dt = (dp1 * pV.y - dp2 * pU.y) / determinant;
|
|
565
|
+
vec3 db = (dp2 * pU.x - dp1 * pV.x) / determinant;
|
|
544
566
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
545
|
-
if (
|
|
567
|
+
if (sO == 0.0) { sO = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
|
|
546
568
|
}
|
|
547
569
|
t -= normal * dot(normal, t);
|
|
548
570
|
if (dot(t, t) < 1e-8) {
|
|
549
|
-
float
|
|
550
|
-
float
|
|
551
|
-
float xy = normal.x * normal.y *
|
|
552
|
-
t = vec3(1.0 +
|
|
553
|
-
b = vec3(xy,
|
|
571
|
+
float iP = (normal.z >= 0.0 ? 1.0 : -1.0);
|
|
572
|
+
float cA = -1.0 / (iP + normal.z);
|
|
573
|
+
float xy = normal.x * normal.y * cA;
|
|
574
|
+
t = vec3(1.0 + iP * normal.x * normal.x * cA, iP * xy, -iP * normal.x);
|
|
575
|
+
b = vec3(xy, iP + normal.y * normal.y * cA, -normal.y);
|
|
554
576
|
}
|
|
555
577
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
556
|
-
return mat2x3(t, b * (
|
|
578
|
+
return mat2x3(t, b * (sO < 0.0 ? -1.0 : 1.0));
|
|
557
579
|
}
|
|
558
580
|
|
|
559
|
-
void
|
|
581
|
+
void hI(inout SurfaceInteraction si, fL tri, vec3 barycentric, ivec3 index) {
|
|
560
582
|
si.hit = true;
|
|
561
583
|
si.position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
|
|
562
|
-
ivec2 i0 = gM(index.x, vertexColumns);
|
|
563
|
-
ivec2 i1 = gM(index.y, vertexColumns);
|
|
564
|
-
ivec2 i2 = gM(index.z, vertexColumns);
|
|
565
584
|
si.vertexColor = vec3(1.0);
|
|
566
585
|
#ifdef USE_VERTEX_COLOR
|
|
567
|
-
si.vertexColor = barycentric.x *
|
|
568
|
-
+ barycentric.y *
|
|
569
|
-
+ barycentric.z *
|
|
586
|
+
si.vertexColor = barycentric.x * bs(index.x, VERTEX_COLOR_SLOT).rgb
|
|
587
|
+
+ barycentric.y * bs(index.y, VERTEX_COLOR_SLOT).rgb
|
|
588
|
+
+ barycentric.z * bs(index.z, VERTEX_COLOR_SLOT).rgb;
|
|
570
589
|
#endif
|
|
571
590
|
|
|
572
|
-
vec3 n0 =
|
|
573
|
-
vec3 n1 =
|
|
574
|
-
vec3 n2 =
|
|
591
|
+
vec3 n0 = fetchVertexNormal(index.x);
|
|
592
|
+
vec3 n1 = fetchVertexNormal(index.y);
|
|
593
|
+
vec3 n2 = fetchVertexNormal(index.z);
|
|
575
594
|
vec3 normal = normalize(barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2);
|
|
576
595
|
si.vertexNormal = normal;
|
|
577
596
|
|
|
@@ -580,14 +599,14 @@ si.vertexNormal = normal;
|
|
|
580
599
|
|
|
581
600
|
|
|
582
601
|
vec3 geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
583
|
-
vec3
|
|
602
|
+
vec3 le = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
|
|
584
603
|
float a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
585
604
|
float b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
586
605
|
float c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
587
606
|
float h = a * barycentric.x * (barycentric.x - 1.0)
|
|
588
607
|
+ (a + b + c) * barycentric.x * barycentric.y
|
|
589
608
|
+ b * barycentric.y * (barycentric.y - 1.0);
|
|
590
|
-
if (dot(
|
|
609
|
+
if (dot(le, geometricNormal) > 0.0) {
|
|
591
610
|
float h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
592
611
|
float h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
593
612
|
float h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -605,120 +624,119 @@ h1 = max(dot(si.position - tri.p1, n1) + h1, 0.0);
|
|
|
605
624
|
h2 = max(dot(si.position - tri.p2, n2) + h2, 0.0);
|
|
606
625
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
607
626
|
}
|
|
608
|
-
si.shadowOffset =
|
|
609
|
-
|
|
627
|
+
si.shadowOffset = le * h;
|
|
610
628
|
|
|
611
|
-
ivec4 m0 =
|
|
612
|
-
ivec4 m1 =
|
|
613
|
-
ivec4 m2 =
|
|
629
|
+
ivec4 m0 = dT(index.x);
|
|
630
|
+
ivec4 m1 = dT(index.y);
|
|
631
|
+
ivec4 m2 = dT(index.z);
|
|
614
632
|
|
|
615
633
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
616
|
-
si.materialIndex =
|
|
634
|
+
si.materialIndex = fv(m0, m1, m2, barycentric);
|
|
617
635
|
}
|
|
618
636
|
|
|
619
|
-
vec2 uv0 =
|
|
620
|
-
vec2 uv1 =
|
|
621
|
-
vec2 uv2 =
|
|
637
|
+
vec2 uv0 = er(index.x);
|
|
638
|
+
vec2 uv1 = er(index.y);
|
|
639
|
+
vec2 uv2 = er(index.z);
|
|
622
640
|
#if defined(NUM_DIFFUSE_MAPS) || defined(NUM_NORMAL_MAPS) || defined(NUM_METALLIC_ROUGHNESS_MAPS) || defined(NUM_ROUGHNESS_MAPS) || defined(NUM_METALNESS_MAPS) || defined(NUM_EMISSIVE_MAPS) || defined(NUM_THIN_FILM_MAPS) || defined(NUM_ANISOTROPY_MAPS) || defined(NUM_COAT_NORMAL_MAPS)
|
|
623
641
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
624
|
-
vec2 secondaryUv0 =
|
|
625
|
-
vec2 secondaryUv1 =
|
|
626
|
-
vec2 secondaryUv2 =
|
|
627
|
-
vec2
|
|
642
|
+
vec2 secondaryUv0 = dK(index.x);
|
|
643
|
+
vec2 secondaryUv1 = dK(index.y);
|
|
644
|
+
vec2 secondaryUv2 = dK(index.z);
|
|
645
|
+
vec2 cT = barycentric.x * secondaryUv0
|
|
628
646
|
+ barycentric.y * secondaryUv1
|
|
629
647
|
+ barycentric.z * secondaryUv2;
|
|
630
648
|
|
|
631
|
-
vec4
|
|
632
|
-
int uvProjection = int(
|
|
649
|
+
vec4 mU = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
|
|
650
|
+
int uvProjection = int(mU.r);
|
|
633
651
|
if (uvProjection > 0) {
|
|
634
|
-
uv =
|
|
635
|
-
|
|
652
|
+
uv = gW(uvProjection, si.position, normal, mU.zw);
|
|
653
|
+
cT = uv;
|
|
636
654
|
} else {
|
|
637
|
-
uv *=
|
|
638
|
-
|
|
655
|
+
uv *= mU.zw;
|
|
656
|
+
cT *= mU.zw;
|
|
639
657
|
}
|
|
640
658
|
#else
|
|
641
659
|
vec2 uv = vec2(0.0);
|
|
642
|
-
vec2
|
|
660
|
+
vec2 cT = vec2(0.0);
|
|
643
661
|
#endif
|
|
644
662
|
|
|
645
663
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
646
664
|
si.coatNormal = normal;
|
|
647
665
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
648
|
-
float
|
|
666
|
+
float qK = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
|
|
649
667
|
#endif
|
|
650
668
|
#endif
|
|
651
669
|
vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);
|
|
652
|
-
float
|
|
653
|
-
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 ||
|
|
670
|
+
float wB = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
|
|
671
|
+
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || wB != 0.0
|
|
654
672
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
655
673
|
|| fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_COAT).w > 0.0
|
|
656
674
|
#endif
|
|
657
675
|
) {
|
|
658
676
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
659
677
|
vec3 dp2 = tri.p1 - tri.p2;
|
|
660
|
-
vec4
|
|
678
|
+
vec4 aT = vec4(0.0);
|
|
661
679
|
#ifdef USE_TANGENT
|
|
662
|
-
|
|
663
|
-
+ barycentric.y *
|
|
664
|
-
+ barycentric.z *
|
|
680
|
+
aT = barycentric.x * ef(index.x)
|
|
681
|
+
+ barycentric.y * ef(index.y)
|
|
682
|
+
+ barycentric.z * ef(index.z);
|
|
665
683
|
#endif
|
|
666
|
-
mat2x3
|
|
667
|
-
si.geometryTangent =
|
|
668
|
-
si.geometryBitangent =
|
|
669
|
-
mat2x3
|
|
684
|
+
mat2x3 eV = eI(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
|
|
685
|
+
si.geometryTangent = eV[0];
|
|
686
|
+
si.geometryBitangent = eV[1];
|
|
687
|
+
mat2x3 gp = eV;
|
|
670
688
|
#ifdef NUM_ANISOTROPY_MAPS
|
|
671
689
|
if (directionMaterial.x >= 0.0 && mapUvChannel[int(directionMaterial.x)] > 0.5) {
|
|
672
|
-
vec2 a =
|
|
673
|
-
vec2 b =
|
|
674
|
-
vec2 c =
|
|
675
|
-
|
|
690
|
+
vec2 a = dK(index.x);
|
|
691
|
+
vec2 b = dK(index.y);
|
|
692
|
+
vec2 c = dK(index.z);
|
|
693
|
+
gp = eI(normal, dp1, dp2, a-c, b-c, (aT.w == 0.0 ? vec4(0.0) : aT));
|
|
676
694
|
}
|
|
677
695
|
#endif
|
|
678
|
-
si.directionTangent =
|
|
679
|
-
si.directionBitangent =
|
|
696
|
+
si.directionTangent = gp[0];
|
|
697
|
+
si.directionBitangent = gp[1];
|
|
680
698
|
#if defined(USE_COAT_NORMAL_FRAMES) && defined(NUM_COAT_NORMAL_MAPS)
|
|
681
|
-
if (
|
|
682
|
-
int
|
|
683
|
-
mat2x3
|
|
684
|
-
if (mapUvChannel[
|
|
685
|
-
vec2 a =
|
|
686
|
-
vec2 b =
|
|
687
|
-
vec2 c =
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
}
|
|
691
|
-
vec3 decoded = sampleMap(
|
|
692
|
-
vec3 mapped =
|
|
693
|
-
+
|
|
699
|
+
if (qK >= 0.0) {
|
|
700
|
+
int lI = int(qK);
|
|
701
|
+
mat2x3 nI = eV;
|
|
702
|
+
if (mapUvChannel[lI] > 0.5) {
|
|
703
|
+
vec2 a = dK(index.x);
|
|
704
|
+
vec2 b = dK(index.y);
|
|
705
|
+
vec2 c = dK(index.z);
|
|
706
|
+
nI = eI(normal, dp1, dp2, a-c, b-c,
|
|
707
|
+
aT.w == 0.0 ? vec4(0.0) : aT);
|
|
708
|
+
}
|
|
709
|
+
vec3 decoded = sampleMap(lI, getMapUvSet(lI, uv, cT)).rgb * 2.0 - 1.0;
|
|
710
|
+
vec3 mapped = nI[0] * decoded.x * directionMaterial.z
|
|
711
|
+
+ nI[1] * decoded.y * directionMaterial.w + normal * decoded.z;
|
|
694
712
|
if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }
|
|
695
713
|
}
|
|
696
714
|
#endif
|
|
697
715
|
}
|
|
698
716
|
|
|
699
717
|
si.uv = uv;
|
|
700
|
-
si.uv1 =
|
|
718
|
+
si.uv1 = cT;
|
|
701
719
|
|
|
702
720
|
#ifdef USE_TANGENT
|
|
703
|
-
vec3 t0 =
|
|
704
|
-
vec3 t1 =
|
|
705
|
-
vec3 t2 =
|
|
721
|
+
vec3 t0 = ef(index.x).xyz;
|
|
722
|
+
vec3 t1 = ef(index.y).xyz;
|
|
723
|
+
vec3 t2 = ef(index.z).xyz;
|
|
706
724
|
si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z * t2);
|
|
707
725
|
#endif
|
|
708
726
|
#if defined(NUM_NORMAL_MAPS)
|
|
709
727
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
710
728
|
vec3 dp2 = tri.p1 - tri.p2;
|
|
711
|
-
vec2
|
|
712
|
-
vec2
|
|
713
|
-
si.normal =
|
|
714
|
-
si.materialIndex, uv, normal, dp1, dp2,
|
|
729
|
+
vec2 pU = uv0 - uv2;
|
|
730
|
+
vec2 pV = uv1 - uv2;
|
|
731
|
+
si.normal = qa(
|
|
732
|
+
si.materialIndex, uv, normal, dp1, dp2, pU, pV
|
|
715
733
|
);
|
|
716
734
|
#else
|
|
717
735
|
si.normal = normal;
|
|
718
736
|
#endif
|
|
719
737
|
}
|
|
720
738
|
|
|
721
|
-
struct
|
|
739
|
+
struct eF {
|
|
722
740
|
float t;
|
|
723
741
|
vec3 barycentric;
|
|
724
742
|
};
|
|
@@ -728,32 +746,32 @@ return fetchData(bvhBuffer, i, bvhColumns);
|
|
|
728
746
|
}
|
|
729
747
|
|
|
730
748
|
vec4 fetchIns(int i) {
|
|
731
|
-
return fetchData(
|
|
749
|
+
return fetchData(bvhBuffer, instancesOffset + i, bvhColumns);
|
|
732
750
|
}
|
|
733
751
|
|
|
734
752
|
|
|
735
753
|
|
|
736
|
-
uint
|
|
754
|
+
uint tl(uint value) {
|
|
737
755
|
value -= (value >> 1u) & 0x55555555u;
|
|
738
756
|
value = (value & 0x33333333u) + ((value >> 2u) & 0x33333333u);
|
|
739
757
|
value = (value + (value >> 4u)) & 0x0f0f0f0fu;
|
|
740
758
|
return (value * 0x01010101u) >> 24u;
|
|
741
759
|
}
|
|
742
760
|
|
|
743
|
-
vec4
|
|
761
|
+
vec4 fh(uint nk) {
|
|
744
762
|
return vec4(
|
|
745
|
-
float(
|
|
746
|
-
float((
|
|
747
|
-
float((
|
|
748
|
-
float(
|
|
763
|
+
float(nk & 0xffu),
|
|
764
|
+
float((nk >> 8u) & 0xffu),
|
|
765
|
+
float((nk >> 16u) & 0xffu),
|
|
766
|
+
float(nk >> 24u)
|
|
749
767
|
) / 255.0;
|
|
750
768
|
}
|
|
751
769
|
|
|
752
770
|
|
|
753
771
|
|
|
754
772
|
|
|
755
|
-
|
|
756
|
-
|
|
773
|
+
eF fY(vec3 o, vec3 d, fL tri, int ei, vec3 gZ, float tMax) {
|
|
774
|
+
eF ti;
|
|
757
775
|
|
|
758
776
|
|
|
759
777
|
vec3 p0t = tri.p0 - o;
|
|
@@ -761,20 +779,20 @@ vec3 p1t = tri.p1 - o;
|
|
|
761
779
|
vec3 p2t = tri.p2 - o;
|
|
762
780
|
|
|
763
781
|
|
|
764
|
-
if (
|
|
782
|
+
if (ei == 0) {
|
|
765
783
|
p0t = p0t.yzx;
|
|
766
784
|
p1t = p1t.yzx;
|
|
767
785
|
p2t = p2t.yzx;
|
|
768
|
-
} else if (
|
|
786
|
+
} else if (ei == 1) {
|
|
769
787
|
p0t = p0t.zxy;
|
|
770
788
|
p1t = p1t.zxy;
|
|
771
789
|
p2t = p2t.zxy;
|
|
772
790
|
}
|
|
773
791
|
|
|
774
792
|
|
|
775
|
-
p0t.xy +=
|
|
776
|
-
p1t.xy +=
|
|
777
|
-
p2t.xy +=
|
|
793
|
+
p0t.xy += gZ.xy * p0t.z;
|
|
794
|
+
p1t.xy += gZ.xy * p1t.z;
|
|
795
|
+
p2t.xy += gZ.xy * p2t.z;
|
|
778
796
|
|
|
779
797
|
|
|
780
798
|
vec3 e = vec3(
|
|
@@ -784,9 +802,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
784
802
|
);
|
|
785
803
|
|
|
786
804
|
#ifdef DEPTH_QUERY_MODE
|
|
787
|
-
vec3
|
|
805
|
+
vec3 ua = abs(vec3(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
788
806
|
+ abs(vec3(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
789
|
-
e = mix(e, vec3(0.0), lessThanEqual(abs(e),
|
|
807
|
+
e = mix(e, vec3(0.0), lessThanEqual(abs(e), ua * 1e-6));
|
|
790
808
|
#endif
|
|
791
809
|
|
|
792
810
|
|
|
@@ -799,19 +817,19 @@ float det = e.x + e.y + e.z;
|
|
|
799
817
|
if (det == 0.0) return ti;
|
|
800
818
|
#endif
|
|
801
819
|
|
|
802
|
-
p0t.z *=
|
|
803
|
-
p1t.z *=
|
|
804
|
-
p2t.z *=
|
|
805
|
-
float
|
|
820
|
+
p0t.z *= gZ.z;
|
|
821
|
+
p1t.z *= gZ.z;
|
|
822
|
+
p2t.z *= gZ.z;
|
|
823
|
+
float tQ = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
806
824
|
|
|
807
825
|
|
|
808
|
-
if (abs(
|
|
826
|
+
if (abs(tQ) > abs(tMax * det)) {
|
|
809
827
|
return ti;
|
|
810
828
|
}
|
|
811
829
|
|
|
812
|
-
float
|
|
813
|
-
ti.t =
|
|
814
|
-
ti.barycentric = e *
|
|
830
|
+
float vu = 1. / det;
|
|
831
|
+
ti.t = tQ * vu;
|
|
832
|
+
ti.barycentric = e * vu;
|
|
815
833
|
|
|
816
834
|
return ti;
|
|
817
835
|
}
|
|
@@ -822,7 +840,7 @@ vec3 max;
|
|
|
822
840
|
};
|
|
823
841
|
|
|
824
842
|
|
|
825
|
-
vec3
|
|
843
|
+
vec3 traversalInverse(vec3 d) {
|
|
826
844
|
#ifdef DEPTH_QUERY_MODE
|
|
827
845
|
vec3 ah = mix(d, mix(vec3(1e-20), vec3(-1e-20), lessThan(d, vec3(0.0))), lessThan(abs(d), vec3(1e-20)));
|
|
828
846
|
return 1.0 / ah;
|
|
@@ -831,9 +849,9 @@ return 1.0 / d;
|
|
|
831
849
|
#endif
|
|
832
850
|
}
|
|
833
851
|
|
|
834
|
-
vec3
|
|
852
|
+
vec3 ff(vec3 invD, vec3 o) {
|
|
835
853
|
#ifdef DEPTH_QUERY_MODE
|
|
836
|
-
return abs(
|
|
854
|
+
return abs(invD) * max(vec3(1.0), abs(o)) * 1e-6;
|
|
837
855
|
#else
|
|
838
856
|
return vec3(0.0);
|
|
839
857
|
#endif
|
|
@@ -841,21 +859,21 @@ return vec3(0.0);
|
|
|
841
859
|
|
|
842
860
|
|
|
843
861
|
|
|
844
|
-
float
|
|
862
|
+
float bP(vec3 o, vec3 d, vec3 zT, vec3 zS, float tMax) {
|
|
845
863
|
#ifdef DEPTH_QUERY_MODE
|
|
846
|
-
vec3
|
|
847
|
-
vec3
|
|
848
|
-
vec3
|
|
849
|
-
vec3 padding =
|
|
864
|
+
vec3 invD = traversalInverse(d);
|
|
865
|
+
vec3 zi = (zT - o) * invD;
|
|
866
|
+
vec3 zj = (zS - o) * invD;
|
|
867
|
+
vec3 padding = ff(invD, o);
|
|
850
868
|
#else
|
|
851
|
-
vec3
|
|
852
|
-
vec3
|
|
869
|
+
vec3 zi = (zT - o) / d;
|
|
870
|
+
vec3 zj = (zS - o) / d;
|
|
853
871
|
vec3 padding = vec3(0.0);
|
|
854
872
|
#endif
|
|
855
|
-
vec3
|
|
856
|
-
vec3
|
|
857
|
-
float t0 = max(
|
|
858
|
-
float t1 = min(
|
|
873
|
+
vec3 ot = min(zi, zj) - padding;
|
|
874
|
+
vec3 uA = max(zi, zj) + padding;
|
|
875
|
+
float t0 = max(ot.x, max(ot.y, ot.z));
|
|
876
|
+
float t1 = min(uA.x, min(uA.y, uA.z));
|
|
859
877
|
|
|
860
878
|
return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);
|
|
861
879
|
}
|
|
@@ -864,12 +882,12 @@ int maxDimension(vec3 v) {
|
|
|
864
882
|
return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);
|
|
865
883
|
}
|
|
866
884
|
|
|
867
|
-
vec3
|
|
885
|
+
vec3 nV(vec3 d, int ei) {
|
|
868
886
|
|
|
869
887
|
|
|
870
|
-
if (
|
|
888
|
+
if (ei == 0) {
|
|
871
889
|
return vec3(-d.y, -d.z, 1.0) / d.x;
|
|
872
|
-
} else if (
|
|
890
|
+
} else if (ei == 1) {
|
|
873
891
|
return vec3(-d.z, -d.x, 1.0) / d.y;
|
|
874
892
|
} else {
|
|
875
893
|
return vec3(-d.x, -d.y, 1.0) / d.z;
|
|
@@ -884,25 +902,25 @@ if (isEmptyScene) {
|
|
|
884
902
|
return;
|
|
885
903
|
}
|
|
886
904
|
|
|
887
|
-
int
|
|
888
|
-
vec3
|
|
905
|
+
int ei = maxDimension(abs(ray.d));
|
|
906
|
+
vec3 gZ = nV(ray.d, ei);
|
|
889
907
|
int am;
|
|
890
908
|
|
|
891
909
|
${getBVHTraverseCode(glsl `
|
|
892
910
|
si.triangleIndex = triangleIndex;
|
|
893
|
-
|
|
894
|
-
|
|
911
|
+
mL = tri;
|
|
912
|
+
hU = faceNormal;
|
|
895
913
|
aw = hit.barycentric;
|
|
896
|
-
|
|
897
|
-
|
|
914
|
+
hL = index;
|
|
915
|
+
tD = true;
|
|
898
916
|
am = bK;
|
|
899
917
|
`)}
|
|
900
918
|
|
|
901
|
-
if (
|
|
919
|
+
if (tD) {
|
|
902
920
|
si.instanceIndex = am;
|
|
903
921
|
si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
904
922
|
|
|
905
|
-
|
|
923
|
+
hI(si, mL, aw, hL);
|
|
906
924
|
mat4 l2w = mat4(
|
|
907
925
|
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
908
926
|
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
@@ -915,12 +933,12 @@ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
|
|
|
915
933
|
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
916
934
|
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
917
935
|
);
|
|
918
|
-
mat3
|
|
919
|
-
si.faceNormal = normalize(
|
|
920
|
-
si.vertexNormal = normalize(
|
|
921
|
-
si.normal = normalize(
|
|
936
|
+
mat3 aH = transpose(mat3(w2l));
|
|
937
|
+
si.faceNormal = normalize(aH * hU);
|
|
938
|
+
si.vertexNormal = normalize(aH * si.vertexNormal);
|
|
939
|
+
si.normal = normalize(aH * si.normal);
|
|
922
940
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
923
|
-
si.coatNormal = normalize(
|
|
941
|
+
si.coatNormal = normalize(aH * si.coatNormal);
|
|
924
942
|
#endif
|
|
925
943
|
#ifdef USE_TANGENT
|
|
926
944
|
if (dot(si.tangent, si.tangent) > 0.0) {
|
|
@@ -945,17 +963,17 @@ return;
|
|
|
945
963
|
}
|
|
946
964
|
|
|
947
965
|
bool doubleSided = true;
|
|
948
|
-
int
|
|
949
|
-
vec3
|
|
966
|
+
int ei = maxDimension(abs(ray.d));
|
|
967
|
+
vec3 gZ = nV(ray.d, ei);
|
|
950
968
|
int am;
|
|
951
969
|
|
|
952
970
|
${getBVHTraverseCode(glsl `
|
|
953
971
|
si.triangleIndex = triangleIndex;
|
|
954
|
-
|
|
955
|
-
|
|
972
|
+
mL = tri;
|
|
973
|
+
hU = faceNormal;
|
|
956
974
|
aw = hit.barycentric;
|
|
957
|
-
|
|
958
|
-
|
|
975
|
+
hL = index;
|
|
976
|
+
tD = true;
|
|
959
977
|
am = bK;
|
|
960
978
|
`, glsl `
|
|
961
979
|
if (bK != instanceIndex) {
|
|
@@ -963,10 +981,10 @@ continue;
|
|
|
963
981
|
}
|
|
964
982
|
`, 'maxDistance')}
|
|
965
983
|
|
|
966
|
-
if (
|
|
984
|
+
if (tD) {
|
|
967
985
|
si.instanceIndex = am;
|
|
968
986
|
si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
969
|
-
|
|
987
|
+
hI(si, mL, aw, hL);
|
|
970
988
|
mat4 l2w = mat4(
|
|
971
989
|
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
972
990
|
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
@@ -979,12 +997,12 @@ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
|
|
|
979
997
|
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
980
998
|
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
981
999
|
);
|
|
982
|
-
mat3
|
|
983
|
-
si.faceNormal = normalize(
|
|
984
|
-
si.vertexNormal = normalize(
|
|
985
|
-
si.normal = normalize(
|
|
1000
|
+
mat3 aH = transpose(mat3(w2l));
|
|
1001
|
+
si.faceNormal = normalize(aH * hU);
|
|
1002
|
+
si.vertexNormal = normalize(aH * si.vertexNormal);
|
|
1003
|
+
si.normal = normalize(aH * si.normal);
|
|
986
1004
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
987
|
-
si.coatNormal = normalize(
|
|
1005
|
+
si.coatNormal = normalize(aH * si.coatNormal);
|
|
988
1006
|
#endif
|
|
989
1007
|
#ifdef USE_TANGENT
|
|
990
1008
|
if (dot(si.tangent, si.tangent) > 0.0) {
|
|
@@ -1000,35 +1018,32 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
|
|
|
1000
1018
|
}
|
|
1001
1019
|
}
|
|
1002
1020
|
|
|
1003
|
-
bool intersectSceneShadow(in Ray ray, float lightDistance, int
|
|
1021
|
+
bool intersectSceneShadow(in Ray ray, float lightDistance, int kx) {
|
|
1004
1022
|
|
|
1005
1023
|
if (isEmptyScene) {
|
|
1006
1024
|
return false;
|
|
1007
1025
|
}
|
|
1008
1026
|
|
|
1009
1027
|
bool doubleSided = true;
|
|
1010
|
-
int
|
|
1011
|
-
vec3
|
|
1028
|
+
int ei = maxDimension(abs(ray.d));
|
|
1029
|
+
vec3 gZ = nV(ray.d, ei);
|
|
1012
1030
|
|
|
1013
1031
|
${getBVHTraverseCode(glsl `
|
|
1014
1032
|
|
|
1015
1033
|
|
|
1016
|
-
bool
|
|
1034
|
+
bool kc = true;
|
|
1017
1035
|
vec3 barycentric = hit.barycentric;
|
|
1018
1036
|
vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
|
|
1019
1037
|
|
|
1020
|
-
if (
|
|
1038
|
+
if (kc) {
|
|
1021
1039
|
#ifdef HAS_ALPHA
|
|
1022
1040
|
int materialIndex = int(af(floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
|
|
1027
|
-
ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
|
|
1028
|
-
ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
|
|
1041
|
+
ivec4 m0 = dT(index.x);
|
|
1042
|
+
ivec4 m1 = dT(index.y);
|
|
1043
|
+
ivec4 m2 = dT(index.z);
|
|
1029
1044
|
|
|
1030
1045
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
1031
|
-
materialIndex =
|
|
1046
|
+
materialIndex = fv(m0, m1, m2, barycentric);
|
|
1032
1047
|
}
|
|
1033
1048
|
|
|
1034
1049
|
int ii = materialIndex * MAT_DATA_SIZE;
|
|
@@ -1038,16 +1053,16 @@ float alpha = fetchMatData(ii + MAT_ROW_ALPHA_FILM).r;
|
|
|
1038
1053
|
if (mapAlphaUsage == ${mapAlphaUsageConstants.alpha + ''}) {
|
|
1039
1054
|
int diffuseMapIndex = int(fetchMatData(ii + MAT_ROW_METALLIC_MAPS).z);
|
|
1040
1055
|
if (diffuseMapIndex >= 0) {
|
|
1041
|
-
vec2 uv0 =
|
|
1042
|
-
vec2 uv1 =
|
|
1043
|
-
vec2 uv2 =
|
|
1056
|
+
vec2 uv0 = er(index.x);
|
|
1057
|
+
vec2 uv1 = er(index.y);
|
|
1058
|
+
vec2 uv2 = er(index.z);
|
|
1044
1059
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1045
|
-
vec4
|
|
1046
|
-
int uvProjection = int(
|
|
1060
|
+
vec4 mU = fetchMatData(ii + MAT_ROW_UV);
|
|
1061
|
+
int uvProjection = int(mU.r);
|
|
1047
1062
|
if (uvProjection > 0) {
|
|
1048
|
-
uv =
|
|
1063
|
+
uv = gW(uvProjection, position, hU, mU.zw);
|
|
1049
1064
|
} else {
|
|
1050
|
-
uv *=
|
|
1065
|
+
uv *= mU.zw;
|
|
1051
1066
|
}
|
|
1052
1067
|
|
|
1053
1068
|
alpha *= sampleMap(diffuseMapIndex, uv).a;
|
|
@@ -1057,36 +1072,36 @@ alpha *= sampleMap(diffuseMapIndex, uv).a;
|
|
|
1057
1072
|
#ifdef NUM_ALPHA_MAPS
|
|
1058
1073
|
int alphaMapIndex = int(fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).z);
|
|
1059
1074
|
if (alphaMapIndex >= 0) {
|
|
1060
|
-
vec2 uv0 =
|
|
1061
|
-
vec2 uv1 =
|
|
1062
|
-
vec2 uv2 =
|
|
1075
|
+
vec2 uv0 = er(index.x);
|
|
1076
|
+
vec2 uv1 = er(index.y);
|
|
1077
|
+
vec2 uv2 = er(index.z);
|
|
1063
1078
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1064
|
-
vec4
|
|
1065
|
-
int uvProjection = int(
|
|
1079
|
+
vec4 mU = fetchMatData(ii + MAT_ROW_UV);
|
|
1080
|
+
int uvProjection = int(mU.r);
|
|
1066
1081
|
if (uvProjection > 0) {
|
|
1067
|
-
uv =
|
|
1082
|
+
uv = gW(uvProjection, position, hU, mU.zw);
|
|
1068
1083
|
} else {
|
|
1069
|
-
uv *=
|
|
1084
|
+
uv *= mU.zw;
|
|
1070
1085
|
}
|
|
1071
1086
|
alpha *= sampleMap(alphaMapIndex, uv).g;
|
|
1072
1087
|
}
|
|
1073
1088
|
#endif
|
|
1074
1089
|
float alphaCutoff = fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).a;
|
|
1075
|
-
alpha =
|
|
1090
|
+
alpha = mB(
|
|
1076
1091
|
alpha, int(fetchMatData(ii + MAT_ROW_ALPHA).w), alphaCutoff
|
|
1077
1092
|
);
|
|
1078
|
-
if (
|
|
1093
|
+
if (cm(0u) > alpha) {
|
|
1079
1094
|
|
|
1080
1095
|
tMax = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
1081
|
-
|
|
1096
|
+
kc = false;
|
|
1082
1097
|
}
|
|
1083
1098
|
#endif
|
|
1084
1099
|
}
|
|
1085
|
-
if (
|
|
1100
|
+
if (kc) {
|
|
1086
1101
|
return true;
|
|
1087
1102
|
}
|
|
1088
1103
|
`, glsl `
|
|
1089
|
-
if (triangleIndex ==
|
|
1104
|
+
if (triangleIndex == kx) {
|
|
1090
1105
|
continue;
|
|
1091
1106
|
}
|
|
1092
1107
|
`, 'min(max(lightDistance, 0.0), RAY_MAX_DISTANCE)')}
|