@meimu/mutracer 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +4155 -4052
- package/docs/api.md +13 -10
- package/docs/materials.md +17 -26
- package/docs/threejs.md +35 -9
- package/docs/viewer.md +36 -3
- package/lib/Engine.js +18 -1
- package/lib/Engine.js.map +1 -1
- package/lib/main.d.ts +1 -1
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/MaterialTable.d.ts +1 -0
- package/lib/renderer/MaterialTable.js +10 -4
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +6 -6
- package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
- package/lib/renderer/WGPURayTraceOutput.js +14 -14
- package/lib/renderer/WGPURayTracePass.d.ts +2 -0
- package/lib/renderer/WGPURayTracePass.js +17 -9
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +15 -15
- package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
- package/lib/renderer/WebGLRayTracePass.js +8 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/envMapCreation.d.ts +5 -1
- package/lib/renderer/envMapCreation.js +42 -5
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +1 -1
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +323 -315
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +154 -121
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +434 -434
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +42 -41
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +84 -84
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
- package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +133 -133
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
- package/lib/renderer/lightsUtil.js +6 -4
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialChanges.js +1 -1
- package/lib/renderer/materialChanges.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +36 -18
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.js +2 -2
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.js +4 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLightChanges.js +3 -2
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +476 -470
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +95 -60
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +25 -22
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +9 -3
- package/lib/scene/EnvironmentLight.js +9 -2
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/OpenPBRMaterial.d.ts +1 -1
- package/lib/scene/OpenPBRMaterial.js +1 -1
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/Scene.d.ts +4 -0
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SpotLight.d.ts +2 -2
- package/lib/scene/SpotLight.js +1 -1
- package/lib/scene/SpotLight.js.map +1 -1
- package/lib/scene/Texture.d.ts +17 -6
- package/lib/scene/Texture.js +13 -4
- package/lib/scene/Texture.js.map +1 -1
- package/lib/util/fromTHREE.js +151 -29
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometryUpdates.js","sourceRoot":"","sources":["../../src/renderer/geometryUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { writeMaterialIndices } from './materialIndices.js';\nimport { isDeformationUpdate } from '../scene/geometryChanges.js';\nimport Geometry from '../scene/Geometry.js';\nimport { hasGeneratedVertexTangents } from '../util/geometry.js';\nimport { buildBLAS, refitBLAS, type FlattendBVH } from './bvhAccel.js';\nimport { getBvhBounds, updateMeshInstances } from './prepareMeshBVH.js';\nimport Mesh from '../scene/Mesh.js';\n\ntype Prepared = ReturnType<typeof updateMeshInstances>;\nconst vertexAttributes = ['position', 'normal', 'uv', 'uv1', 'color', 'tangent', 'materialIndex'] as const;\nconst bindingIndices = new WeakMap<Prepared, { source: Map<Geometry, Prepared['instanceBindings']>;\n prepared: Map<Geometry, Prepared['instanceBindings']> }>();\nfunction indices(prepared: Prepared) {\n let maps = bindingIndices.get(prepared);\n if (!maps) {\n maps = { source: new Map(), prepared: new Map() };\n for (const binding of prepared.instanceBindings) {\n for (const [map, geometry] of [[maps.source, binding.mesh.geometry], [maps.prepared, binding.geometry]] as const) {\n let bindings = map.get(geometry);\n if (!bindings) map.set(geometry, bindings = []);\n bindings.push(binding);\n }\n }\n bindingIndices.set(prepared, maps);\n }\n return maps;\n}\n\n/** Displaced geometry must be prepared as a whole. */\nexport function canUpdateGeometries(prepared: Prepared, geometries: readonly Geometry[]) {\n return geometries.every(geometry => {\n const bindings = indices(prepared).source.get(geometry) ?? [];\n return bindings.length > 0 && bindings.every(b => !b.mesh.materials.some(m => m.displacementMap) &&\n b.geometry.position.array === geometry.position.array);\n });\n}\n\n/** Rewrites only a geometry's existing region, preserving global material indices. */\nfunction copyRegion(source: Geometry, merged: Geometry, region: Prepared['geometryRegions'] extends Map<Geometry, infer R> ? R : never, topologyChanged: boolean, deformationOnly: boolean) {\n const { vertexOffset, indexOffset, materialIndices } = region;\n const count = source.vertexCount;\n for (const name of vertexAttributes) {\n if (name === 'materialIndex' || deformationOnly && name !== 'position' && name !== 'normal' && name !== 'tangent') continue;\n const target = merged[name]; if (!target) continue;\n const attribute = name === 'uv1' ? source.uv1 ?? source.uv : source[name];\n const offset = vertexOffset * target.itemSize;\n if (attribute && attribute.itemSize !== target.itemSize) {\n for (let v = 0; v < count; v++) for (let c = 0; c < target.itemSize; c++) {\n target.array[offset + v * target.itemSize + c] = c < attribute.itemSize ? attribute.array[v * attribute.itemSize + c] : name === 'tangent' && !hasGeneratedVertexTangents(source) ? 2 : 0;\n }\n }\n else if (attribute) target.array.set(attribute.array, offset);\n else target.array.fill(0, offset, offset + count * target.itemSize);\n }\n if (!topologyChanged) return;\n writeMaterialIndices(source, materialIndices, merged.materialIndex!.array, vertexOffset);\n for (let i = 0; i < source.indices.array.length; i++) merged.indices.array[indexOffset + i] = source.indices.array[i] + vertexOffset;\n}\n\n/** Constant-time topology detection; markUpdated also covers in-place index edits. */\nexport function geometryTopologyChanged(prepared: Prepared | undefined, source: Geometry) {\n const state = prepared?.geometryStates.get(source);\n return !!state && (state.topologyVersion !== source.topologyVersion ||\n state.indices !== source.indices.array || state.indexCount !== source.indices.array.length);\n}\n\n/** Refits/rebuilds changed BLASes and refreshes all shared instances' cached bounds. */\nexport function updatePreparedGeometries(prepared: Prepared, changed: ReadonlySet<Geometry>) {\n const vertices: { first: number; count: number; topologyChanged: boolean; deformationOnly: boolean }[] = [];\n const blases: { blas: FlattendBVH; offset: number }[] = [];\n const meshes = new Set<Mesh>();\n let resized = false, relocated = false, offset = 0;\n const updated = new Map<Geometry, FlattendBVH>();\n prepared.geometries.forEach((geometry, i) => {\n const source = indices(prepared).prepared.get(geometry)?.[0].mesh.geometry ?? geometry;\n const previous = prepared.blases[i].bvh;\n if (changed.has(source)) {\n const region = prepared.geometryRegions.get(geometry)!;\n const topologyChanged = geometryTopologyChanged(prepared, source);\n const deformationOnly = !topologyChanged && isDeformationUpdate(source);\n let bvh = updated.get(source);\n if (!bvh) {\n bvh = getGeometryBvh(source);\n if (topologyChanged || !bvh || source.dynamic && bvh.builder !== 'builtin' || !refitBLAS(bvh, source)) {\n bvh = buildBLAS(source);\n }\n setGeometryBvh(source, bvh); updated.set(source, bvh);\n }\n setGeometryBvh(geometry, bvh); geometry.version = source.version;\n prepared.blases[i].bvh = bvh;\n resized ||= previous.buffer.byteLength !== bvh.buffer.byteLength;\n relocated ||= previous.buffer.byteLength !== bvh.buffer.byteLength || previous.layout !== bvh.layout;\n copyRegion(source, prepared.geometry, region, topologyChanged, deformationOnly);\n const count = source.vertexCount, previousVertices = vertices[vertices.length - 1];\n if (previousVertices && previousVertices.first + previousVertices.count === region.vertexOffset && previousVertices.topologyChanged === topologyChanged && previousVertices.deformationOnly === deformationOnly) previousVertices.count += count;\n else vertices.push({first: region.vertexOffset, count, topologyChanged, deformationOnly});\n blases.push({blas: bvh, offset});\n for (const binding of indices(prepared).prepared.get(geometry) ?? []) {\n binding.bvhBounds = getBvhBounds(geometry); meshes.add(binding.mesh);\n }\n }\n offset += prepared.blases[i].bvh.buffer.byteLength;\n });\n for (const source of changed) prepared.geometryStates.set(source, { topologyVersion: source.topologyVersion,\n indices: source.indices.array, indexCount: source.indices.array.length });\n return { vertices, blases, meshes, resized, relocated };\n}\n\n/** Packs the same interleaved vertex layout for full and partial GPU uploads. */\nexport function packVertexAttributes(geometry: Geometry, output: Float32Array, stride: number,\n offsets: readonly number[], first: number, count: number, includeMaterialIndex = true, deformationOnly = false) {\n for (let k = 0; k < vertexAttributes.length; k++) {\n if (k === 6 && !includeMaterialIndex || deformationOnly && k >= 2 && k <= 4) continue;\n const attribute = geometry[vertexAttributes[k]];\n if (!attribute) continue;\n const array = attribute.array, size = attribute.itemSize;\n let destination = first * stride + offsets[k], source = first * size;\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n for (let c = 0; c < size; c++) output[destination + c] = array[source + c];\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"geometryUpdates.js","sourceRoot":"","sources":["../../src/renderer/geometryUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { writeMaterialIndices } from './materialIndices.js';\nimport { isDeformationUpdate } from '../scene/geometryChanges.js';\nimport Geometry from '../scene/Geometry.js';\nimport { hasGeneratedVertexTangents } from '../util/geometry.js';\nimport { buildBLAS, refitBLAS, type FlattendBVH } from './bvhAccel.js';\nimport { getBvhBounds, updateMeshInstances } from './prepareMeshBVH.js';\nimport Mesh from '../scene/Mesh.js';\n\ntype Prepared = ReturnType<typeof updateMeshInstances>;\nconst vertexAttributes = ['position', 'normal', 'uv', 'uv1', 'color', 'tangent', 'materialIndex'] as const;\nconst bindingIndices = new WeakMap<Prepared, { source: Map<Geometry, Prepared['instanceBindings']>;\n prepared: Map<Geometry, Prepared['instanceBindings']> }>();\nfunction indices(prepared: Prepared) {\n let maps = bindingIndices.get(prepared);\n if (!maps) {\n maps = { source: new Map(), prepared: new Map() };\n for (const binding of prepared.instanceBindings) {\n for (const [map, geometry] of [[maps.source, binding.mesh.geometry], [maps.prepared, binding.geometry]] as const) {\n let bindings = map.get(geometry);\n if (!bindings) map.set(geometry, bindings = []);\n bindings.push(binding);\n }\n }\n bindingIndices.set(prepared, maps);\n }\n return maps;\n}\n\n/** Displaced geometry must be prepared as a whole. */\nexport function canUpdateGeometries(prepared: Prepared, geometries: readonly Geometry[]) {\n return geometries.every(geometry => {\n const bindings = indices(prepared).source.get(geometry) ?? [];\n return bindings.length > 0 && bindings.every(b => !b.mesh.materials.some(m => m.displacementMap) &&\n b.geometry.position.array === geometry.position.array);\n });\n}\n\n/** Rewrites only a geometry's existing region, preserving global material indices. */\nfunction copyRegion(source: Geometry, merged: Geometry, region: Prepared['geometryRegions'] extends Map<Geometry, infer R> ? R : never, topologyChanged: boolean, deformationOnly: boolean) {\n const { vertexOffset, indexOffset, materialIndices } = region;\n const count = source.vertexCount;\n for (const name of vertexAttributes) {\n if (name === 'materialIndex' || deformationOnly && name !== 'position' && name !== 'normal' && name !== 'tangent') continue;\n const target = merged[name]; if (!target) continue;\n const attribute = name === 'uv1' ? source.uv1 ?? source.uv : source[name];\n const offset = vertexOffset * target.itemSize;\n if (attribute && attribute.itemSize !== target.itemSize) {\n for (let v = 0; v < count; v++) for (let c = 0; c < target.itemSize; c++) {\n target.array[offset + v * target.itemSize + c] = c < attribute.itemSize ? attribute.array[v * attribute.itemSize + c] : name === 'tangent' && !hasGeneratedVertexTangents(source) ? 2 : 0;\n }\n }\n else if (attribute) target.array.set(attribute.array, offset);\n else target.array.fill(name === 'color' ? 1 : 0, offset, offset + count * target.itemSize);\n }\n if (!topologyChanged) return;\n writeMaterialIndices(source, materialIndices, merged.materialIndex!.array, vertexOffset);\n for (let i = 0; i < source.indices.array.length; i++) merged.indices.array[indexOffset + i] = source.indices.array[i] + vertexOffset;\n}\n\n/** Constant-time topology detection; markUpdated also covers in-place index edits. */\nexport function geometryTopologyChanged(prepared: Prepared | undefined, source: Geometry) {\n const state = prepared?.geometryStates.get(source);\n return !!state && (state.topologyVersion !== source.topologyVersion ||\n state.indices !== source.indices.array || state.indexCount !== source.indices.array.length);\n}\n\n/** Refits/rebuilds changed BLASes and refreshes all shared instances' cached bounds. */\nexport function updatePreparedGeometries(prepared: Prepared, changed: ReadonlySet<Geometry>) {\n const vertices: { first: number; count: number; topologyChanged: boolean; deformationOnly: boolean }[] = [];\n const blases: { blas: FlattendBVH; offset: number }[] = [];\n const meshes = new Set<Mesh>();\n let resized = false, relocated = false, offset = 0;\n const updated = new Map<Geometry, FlattendBVH>();\n prepared.geometries.forEach((geometry, i) => {\n const source = indices(prepared).prepared.get(geometry)?.[0].mesh.geometry ?? geometry;\n const previous = prepared.blases[i].bvh;\n if (changed.has(source)) {\n const region = prepared.geometryRegions.get(geometry)!;\n const topologyChanged = geometryTopologyChanged(prepared, source);\n const deformationOnly = !topologyChanged && isDeformationUpdate(source);\n let bvh = updated.get(source);\n if (!bvh) {\n bvh = getGeometryBvh(source);\n if (topologyChanged || !bvh || source.dynamic && bvh.builder !== 'builtin' || !refitBLAS(bvh, source)) {\n bvh = buildBLAS(source);\n }\n setGeometryBvh(source, bvh); updated.set(source, bvh);\n }\n setGeometryBvh(geometry, bvh); geometry.version = source.version;\n prepared.blases[i].bvh = bvh;\n resized ||= previous.buffer.byteLength !== bvh.buffer.byteLength;\n relocated ||= previous.buffer.byteLength !== bvh.buffer.byteLength || previous.layout !== bvh.layout;\n copyRegion(source, prepared.geometry, region, topologyChanged, deformationOnly);\n const count = source.vertexCount, previousVertices = vertices[vertices.length - 1];\n if (previousVertices && previousVertices.first + previousVertices.count === region.vertexOffset && previousVertices.topologyChanged === topologyChanged && previousVertices.deformationOnly === deformationOnly) previousVertices.count += count;\n else vertices.push({first: region.vertexOffset, count, topologyChanged, deformationOnly});\n blases.push({blas: bvh, offset});\n for (const binding of indices(prepared).prepared.get(geometry) ?? []) {\n binding.bvhBounds = getBvhBounds(geometry); meshes.add(binding.mesh);\n }\n }\n offset += prepared.blases[i].bvh.buffer.byteLength;\n });\n for (const source of changed) prepared.geometryStates.set(source, { topologyVersion: source.topologyVersion,\n indices: source.indices.array, indexCount: source.indices.array.length });\n return { vertices, blases, meshes, resized, relocated };\n}\n\n/** Packs the same interleaved vertex layout for full and partial GPU uploads. */\nexport function packVertexAttributes(geometry: Geometry, output: Float32Array, stride: number,\n offsets: readonly number[], first: number, count: number, includeMaterialIndex = true, deformationOnly = false) {\n for (let k = 0; k < vertexAttributes.length; k++) {\n if (k === 6 && !includeMaterialIndex || deformationOnly && k >= 2 && k <= 4) continue;\n const attribute = geometry[vertexAttributes[k]];\n if (!attribute) continue;\n const array = attribute.array, size = attribute.itemSize;\n let destination = first * stride + offsets[k], source = first * size;\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n for (let c = 0; c < size; c++) output[destination + c] = array[source + c];\n }\n }\n}\n"]}
|
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
4
4
|
// Shared primary-ray construction keeps beauty and catcher coverage aligned.
|
|
5
5
|
export default /* glsl */ `
|
|
6
|
-
Ray
|
|
7
|
-
vec4 origin = viewProjectionInv * vec4(
|
|
8
|
-
vec4 target = viewProjectionInv * vec4(
|
|
6
|
+
Ray hC(vec2 fH) {
|
|
7
|
+
vec4 origin = viewProjectionInv * vec4(fH * 2.0 - 1.0, -1.0, 1.0);
|
|
8
|
+
vec4 target = viewProjectionInv * vec4(fH * 2.0 - 1.0, 1.0, 1.0);
|
|
9
9
|
Ray cam;
|
|
10
|
-
|
|
10
|
+
iC(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));
|
|
11
11
|
|
|
12
12
|
return cam;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
vec2
|
|
15
|
+
vec2 oK(vec2 p) {
|
|
16
16
|
p = 2.0 * p - 1.0;
|
|
17
17
|
bool greater = abs(p.x) > abs(p.y);
|
|
18
18
|
float r = greater ? p.x : p.y;
|
|
@@ -20,16 +20,16 @@ float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);
|
|
|
20
20
|
return r * vec2(cos(theta), sin(theta));
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
Ray
|
|
24
|
-
Ray cam =
|
|
23
|
+
Ray nM() {
|
|
24
|
+
Ray cam = hC(v_Texcoord + sa());
|
|
25
25
|
if (cameraApertureRadius > 0.0) {
|
|
26
26
|
|
|
27
27
|
vec3 eye = viewInv[3].xyz;
|
|
28
|
-
vec3
|
|
29
|
-
vec3
|
|
30
|
-
vec2
|
|
31
|
-
vec3 origin = vec3(viewInv * vec4(
|
|
32
|
-
|
|
28
|
+
vec3 oj = -normalize(viewInv[2].xyz);
|
|
29
|
+
vec3 qy = eye + cam.d * (cameraFocusDistance / dot(cam.d, oj));
|
|
30
|
+
vec2 rK = cameraApertureRadius * oK(fp(CAMERA_LENS));
|
|
31
|
+
vec3 origin = vec3(viewInv * vec4(rK, 0.0, 1.0));
|
|
32
|
+
iC(cam, origin, normalize(qy - origin));
|
|
33
33
|
}
|
|
34
34
|
return cam;
|
|
35
35
|
}
|
|
@@ -6,20 +6,26 @@
|
|
|
6
6
|
import { createShaderMixin, glsl, Shader } from '../../shader.js';
|
|
7
7
|
export default createShaderMixin({
|
|
8
8
|
uniforms: {
|
|
9
|
+
environmentRotation: Shader.uniform('mat3', [1, 0, 0, 0, 1, 0, 0, 0, 1]),
|
|
9
10
|
envMap: Shader.uniform('sampler2D'),
|
|
10
11
|
envMapDistribution: Shader.uniform('sampler2D'),
|
|
11
12
|
backgroundMap: Shader.uniform('sampler2D'),
|
|
13
|
+
backgroundMapTransform: Shader.uniform('vec4', [1, 0, 1, 0]),
|
|
12
14
|
groundedBackgroundParams: Shader.uniform('vec4'),
|
|
13
15
|
groundedBackgroundCenter: Shader.uniform('vec2')
|
|
14
16
|
},
|
|
15
17
|
main: glsl `
|
|
16
|
-
vec2
|
|
17
|
-
float phi = mod(atan(-
|
|
18
|
-
float theta = acos(
|
|
18
|
+
vec2 eL(vec3 gh) {
|
|
19
|
+
float phi = mod(atan(-gh.z, -gh.x), TWOPI);
|
|
20
|
+
float theta = acos(clamp(gh.y, -1.0, 1.0));
|
|
19
21
|
return vec2(phi * 0.5 * INVPI, theta * INVPI);
|
|
20
22
|
}
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
vec2 cY(vec3 mP) {
|
|
25
|
+
return eL(transpose(environmentRotation) * mP);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
float qB(float u, out int vOffset, out float pdf) {
|
|
23
29
|
ivec2 size = textureSize(envMap, 0);
|
|
24
30
|
|
|
25
31
|
int left = 0;
|
|
@@ -45,7 +51,7 @@ pdf = s0.y;
|
|
|
45
51
|
return (float(vOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.y);
|
|
46
52
|
}
|
|
47
53
|
|
|
48
|
-
float
|
|
54
|
+
float qA(float u, int vOffset, out float pdf) {
|
|
49
55
|
ivec2 size = textureSize(envMap, 0);
|
|
50
56
|
|
|
51
57
|
int left = 0;
|
|
@@ -59,120 +65,120 @@ left = mid + 1;
|
|
|
59
65
|
right = mid;
|
|
60
66
|
}
|
|
61
67
|
}
|
|
62
|
-
int
|
|
68
|
+
int oR = left - 1;
|
|
63
69
|
|
|
64
70
|
|
|
65
71
|
|
|
66
|
-
vec2 s0 = texelFetch(envMapDistribution, ivec2(1 +
|
|
67
|
-
vec2 s1 = texelFetch(envMapDistribution, ivec2(1 +
|
|
72
|
+
vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + oR, vOffset), 0).xy;
|
|
73
|
+
vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + oR + 1, vOffset), 0).xy;
|
|
68
74
|
|
|
69
75
|
pdf = s0.y;
|
|
70
76
|
|
|
71
|
-
return (float(
|
|
77
|
+
return (float(oR) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);
|
|
72
78
|
}
|
|
73
79
|
|
|
74
80
|
|
|
75
|
-
vec3
|
|
76
|
-
vec2
|
|
81
|
+
vec3 oL(vec2 random, out vec2 uv, out float pdf) {
|
|
82
|
+
vec2 he;
|
|
77
83
|
int vOffset;
|
|
78
84
|
|
|
79
|
-
uv.y =
|
|
80
|
-
uv.x =
|
|
85
|
+
uv.y = qB(random.x, vOffset, he.y);
|
|
86
|
+
uv.x = qA(random.y, vOffset, he.x);
|
|
81
87
|
|
|
82
88
|
float phi = uv.x * TWOPI;
|
|
83
89
|
float theta = uv.y * PI;
|
|
84
90
|
float cc = cos(theta);
|
|
85
91
|
float sinTheta = sin(theta);
|
|
86
|
-
float
|
|
87
|
-
float
|
|
92
|
+
float ul = cos(phi);
|
|
93
|
+
float uw = sin(phi);
|
|
88
94
|
|
|
89
|
-
vec3 dir = vec3(-sinTheta *
|
|
95
|
+
vec3 dir = vec3(-sinTheta * ul, cc, -sinTheta * uw);
|
|
90
96
|
|
|
91
|
-
pdf =
|
|
97
|
+
pdf = he.x * he.y * INVPI2 / (2.0 * sinTheta);
|
|
92
98
|
|
|
93
|
-
return dir;
|
|
99
|
+
return environmentRotation * dir;
|
|
94
100
|
}
|
|
95
101
|
|
|
96
|
-
float
|
|
102
|
+
float iB(vec2 uv) {
|
|
97
103
|
vec2 size = vec2(textureSize(envMap, 0));
|
|
98
104
|
|
|
99
105
|
float sinTheta = sin(uv.y * PI);
|
|
100
106
|
|
|
101
107
|
uv *= size;
|
|
102
108
|
|
|
103
|
-
float
|
|
104
|
-
float
|
|
109
|
+
float sL = texelFetch(envMapDistribution, ivec2(1.0 + uv.x, uv.y), 0).y;
|
|
110
|
+
float sM = texelFetch(envMapDistribution, ivec2(0, uv.y), 0).y;
|
|
105
111
|
|
|
106
|
-
return
|
|
112
|
+
return sL * sM * INVPI2 / (2.0 * sinTheta);
|
|
107
113
|
}
|
|
108
114
|
|
|
109
|
-
float dq(vec3
|
|
110
|
-
float
|
|
111
|
-
if (
|
|
115
|
+
float dq(vec3 sN, float height, float radius) {
|
|
116
|
+
float fR = length(sN);
|
|
117
|
+
if (fR < 0.00001) {
|
|
112
118
|
return -radius;
|
|
113
119
|
}
|
|
114
120
|
|
|
115
|
-
float
|
|
116
|
-
float
|
|
121
|
+
float iG = radius * sN.y / fR;
|
|
122
|
+
float iq = -1.5 * height;
|
|
117
123
|
float ev;
|
|
118
|
-
if (
|
|
124
|
+
if (iG >= 0.0) {
|
|
119
125
|
ev = radius;
|
|
120
|
-
} else if (
|
|
121
|
-
ev = -height *
|
|
126
|
+
} else if (iG < iq) {
|
|
127
|
+
ev = -height * fR / sN.y;
|
|
122
128
|
} else {
|
|
123
129
|
float dW = 1.0
|
|
124
|
-
-
|
|
130
|
+
- iG * iG / (3.0 * iq * iq);
|
|
125
131
|
ev = radius * dW;
|
|
126
132
|
}
|
|
127
|
-
return
|
|
133
|
+
return fR - ev;
|
|
128
134
|
}
|
|
129
135
|
|
|
130
|
-
vec3
|
|
136
|
+
vec3 eT(vec3 origin, vec3 d) {
|
|
131
137
|
#ifdef USE_GROUNDED_BACKGROUND
|
|
132
138
|
float height = groundedBackgroundParams.x;
|
|
133
139
|
float radius = groundedBackgroundParams.y;
|
|
134
|
-
float
|
|
140
|
+
float vN = groundedBackgroundParams.z;
|
|
135
141
|
vec3 bY = normalize(d);
|
|
136
142
|
vec3 bB = origin - vec3(
|
|
137
143
|
groundedBackgroundCenter.x,
|
|
138
|
-
|
|
144
|
+
vN + height,
|
|
139
145
|
groundedBackgroundCenter.y
|
|
140
146
|
);
|
|
141
147
|
|
|
142
148
|
|
|
143
149
|
|
|
144
|
-
float
|
|
145
|
-
float ej =
|
|
150
|
+
float eJ = dot(bB, bY);
|
|
151
|
+
float ej = eJ * eJ
|
|
146
152
|
- dot(bB, bB) + radius * radius;
|
|
147
153
|
if (ej > 0.0) {
|
|
148
|
-
float cC = -
|
|
154
|
+
float cC = -eJ + sqrt(ej);
|
|
149
155
|
if (
|
|
150
156
|
cC > 0.0
|
|
151
157
|
&& dq(bB, height, radius) <= 0.0
|
|
152
158
|
) {
|
|
153
|
-
vec3
|
|
154
|
-
if (
|
|
155
|
-
return normalize(
|
|
159
|
+
vec3 nO = bB + bY * cC;
|
|
160
|
+
if (nO.y >= 0.0) {
|
|
161
|
+
return normalize(nO);
|
|
156
162
|
}
|
|
157
163
|
|
|
158
164
|
if (bY.y < -0.00001 && radius > 1.5 * height) {
|
|
159
|
-
float
|
|
160
|
-
vec3
|
|
161
|
-
float
|
|
165
|
+
float hT = (-height - bB.y) / bY.y;
|
|
166
|
+
vec3 nE = bB + bY * hT;
|
|
167
|
+
float om = (2.0 / 3.0)
|
|
162
168
|
* sqrt(radius * radius - 2.25 * height * height);
|
|
163
|
-
if (
|
|
164
|
-
return normalize(
|
|
169
|
+
if (hT > 0.0 && length(nE.xz) <= om) {
|
|
170
|
+
return normalize(nE);
|
|
165
171
|
}
|
|
166
172
|
}
|
|
167
173
|
|
|
168
174
|
float cN = 0.0;
|
|
169
175
|
for (int i = 0; i < 14; i++) {
|
|
170
|
-
float
|
|
171
|
-
vec3
|
|
172
|
-
if (dq(
|
|
173
|
-
cC =
|
|
176
|
+
float fh = (cN + cC) * 0.5;
|
|
177
|
+
vec3 pL = bB + bY * fh;
|
|
178
|
+
if (dq(pL, height, radius) > 0.0) {
|
|
179
|
+
cC = fh;
|
|
174
180
|
} else {
|
|
175
|
-
cN =
|
|
181
|
+
cN = fh;
|
|
176
182
|
}
|
|
177
183
|
}
|
|
178
184
|
vec3 hit = bB + bY * ((cN + cC) * 0.5);
|
|
@@ -184,9 +190,15 @@ return d;
|
|
|
184
190
|
}
|
|
185
191
|
|
|
186
192
|
vec4 cx(vec3 origin, vec3 d) {
|
|
187
|
-
d =
|
|
188
|
-
|
|
189
|
-
|
|
193
|
+
d = eT(origin, d);
|
|
194
|
+
#ifdef USE_BACKGROUND
|
|
195
|
+
vec4 t = backgroundMapTransform;
|
|
196
|
+
d = vec3(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);
|
|
197
|
+
vec4 aW = textureLinear(backgroundMap, eL(d));
|
|
198
|
+
return vec4(aW.rgb * t.z, aW.a);
|
|
199
|
+
#else
|
|
200
|
+
return textureLinear(backgroundMap, cY(d));
|
|
201
|
+
#endif
|
|
190
202
|
}`
|
|
191
203
|
});
|
|
192
204
|
//# sourceMappingURL=envMap.glsl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envMap.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/envMap.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,sFAAsF;AACtF,uHAAuH;AAEvH,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElE,eAAe,iBAAiB,CAAC;IAC/B,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACnC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC/C,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAChD,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACjD;IACD,IAAI,EAAE,IAAI,CAAA
|
|
1
|
+
{"version":3,"file":"envMap.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/envMap.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,sFAAsF;AACtF,uHAAuH;AAEvH,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElE,eAAe,iBAAiB,CAAC;IAC/B,QAAQ,EAAE;QACR,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QAClE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACnC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC/C,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QACzD,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAChD,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACjD;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyLV;CACD,CAAC,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\n// Sample the environment map using a cumulative distribution function as described in\n// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Sampling_Light_Sources.html#InfiniteAreaLights\n\nimport { createShaderMixin, glsl, Shader } from '../../shader.js';\n\nexport default createShaderMixin({\n uniforms: {\n environmentRotation: Shader.uniform('mat3', [1,0,0, 0,1,0, 0,0,1]),\n envMap: Shader.uniform('sampler2D'),\n envMapDistribution: Shader.uniform('sampler2D'),\n backgroundMap: Shader.uniform('sampler2D'),\n backgroundMapTransform: Shader.uniform('vec4', [1,0,1,0]),\n groundedBackgroundParams: Shader.uniform('vec4'),\n groundedBackgroundCenter: Shader.uniform('vec2')\n },\n main: glsl`\nvec2 cartesianToEquirect(vec3 pointOnSphere) {\n float phi = mod(atan(-pointOnSphere.z, -pointOnSphere.x), TWOPI);\n float theta = acos(clamp(pointOnSphere.y, -1.0, 1.0));\n return vec2(phi * 0.5 * INVPI, theta * INVPI);\n}\n\nvec2 environmentUv(vec3 worldDirection) {\n return cartesianToEquirect(transpose(environmentRotation) * worldDirection);\n}\n\nfloat getEnvmapV(float u, out int vOffset, out float pdf) {\n ivec2 size = textureSize(envMap, 0);\n\n int left = 0;\n int right = size.y + 1; // cdf length is the length of the env map + 1\n while (left < right) {\n int mid = (left + right) >> 1;\n float s = texelFetch(envMapDistribution, ivec2(0, mid), 0).x;\n if (s <= u) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n vOffset = left - 1;\n\n // x channel is cumulative distribution of env map luminance\n // y channel is partial probability density of env map luminance\n vec2 s0 = texelFetch(envMapDistribution, ivec2(0, vOffset), 0).xy;\n vec2 s1 = texelFetch(envMapDistribution, ivec2(0, vOffset + 1), 0).xy;\n\n pdf = s0.y;\n\n return (float(vOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.y);\n}\n\nfloat getEnvmapU(float u, int vOffset, out float pdf) {\n ivec2 size = textureSize(envMap, 0);\n\n int left = 0;\n int right = size.x + 1; // cdf length is the length of the env map + 1\n while (left < right) {\n int mid = (left + right) >> 1;\n float s = texelFetch(envMapDistribution, ivec2(1 + mid, vOffset), 0).x;\n if (s <= u) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n int uOffset = left - 1;\n\n // x channel is cumulative distribution of env map luminance\n // y channel is partial probability density of env map luminance\n vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + uOffset, vOffset), 0).xy;\n vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + uOffset + 1, vOffset), 0).xy;\n\n pdf = s0.y;\n\n return (float(uOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);\n}\n\n// Perform two binary searches to find light direction.\nvec3 sampleEnvmap(vec2 random, out vec2 uv, out float pdf) {\n vec2 partialPdf;\n int vOffset;\n\n uv.y = getEnvmapV(random.x, vOffset, partialPdf.y);\n uv.x = getEnvmapU(random.y, vOffset, partialPdf.x);\n\n float phi = uv.x * TWOPI;\n float theta = uv.y * PI;\n float cosTheta = cos(theta);\n float sinTheta = sin(theta);\n float cosPhi = cos(phi);\n float sinPhi = sin(phi);\n\n vec3 dir = vec3(-sinTheta * cosPhi, cosTheta, -sinTheta * sinPhi);\n\n pdf = partialPdf.x * partialPdf.y * INVPI2 / (2.0 * sinTheta);\n\n return environmentRotation * dir;\n}\n\nfloat envMapPdf(vec2 uv) {\n vec2 size = vec2(textureSize(envMap, 0));\n\n float sinTheta = sin(uv.y * PI);\n\n uv *= size;\n\n float partialX = texelFetch(envMapDistribution, ivec2(1.0 + uv.x, uv.y), 0).y;\n float partialY = texelFetch(envMapDistribution, ivec2(0, uv.y), 0).y;\n\n return partialX * partialY * INVPI2 / (2.0 * sinTheta);\n}\n\nfloat groundedSurfaceDistance(vec3 point, float height, float radius) {\n float pointLength = length(point);\n if (pointLength < 0.00001) {\n return -radius;\n }\n\n float originalY = radius * point.y / pointLength;\n float transitionY = -1.5 * height;\n float surfaceRadius;\n if (originalY >= 0.0) {\n surfaceRadius = radius;\n } else if (originalY < transitionY) {\n surfaceRadius = -height * pointLength / point.y;\n } else {\n float factor = 1.0\n - originalY * originalY / (3.0 * transitionY * transitionY);\n surfaceRadius = radius * factor;\n }\n return pointLength - surfaceRadius;\n}\n\nvec3 groundedBackgroundDirection(vec3 origin, vec3 d) {\n#ifdef USE_GROUNDED_BACKGROUND\n float height = groundedBackgroundParams.x;\n float radius = groundedBackgroundParams.y;\n float groundY = groundedBackgroundParams.z;\n vec3 rayDirection = normalize(d);\n vec3 localOrigin = origin - vec3(\n groundedBackgroundCenter.x,\n groundY + height,\n groundedBackgroundCenter.y\n );\n\n // The grounded skybox is a deformed sphere. Find the point where the ray\n // exits that surface so its texture lookup matches the rasterized geometry.\n float projectedOrigin = dot(localOrigin, rayDirection);\n float discriminant = projectedOrigin * projectedOrigin\n - dot(localOrigin, localOrigin) + radius * radius;\n if (discriminant > 0.0) {\n float farDistance = -projectedOrigin + sqrt(discriminant);\n if (\n farDistance > 0.0\n && groundedSurfaceDistance(localOrigin, height, radius) <= 0.0\n ) {\n vec3 sphereHit = localOrigin + rayDirection * farDistance;\n if (sphereHit.y >= 0.0) {\n return normalize(sphereHit);\n }\n\n if (rayDirection.y < -0.00001 && radius > 1.5 * height) {\n float groundDistance = (-height - localOrigin.y) / rayDirection.y;\n vec3 groundHit = localOrigin + rayDirection * groundDistance;\n float groundRadius = (2.0 / 3.0)\n * sqrt(radius * radius - 2.25 * height * height);\n if (groundDistance > 0.0 && length(groundHit.xz) <= groundRadius) {\n return normalize(groundHit);\n }\n }\n\n float nearDistance = 0.0;\n for (int i = 0; i < 14; i++) {\n float middleDistance = (nearDistance + farDistance) * 0.5;\n vec3 middlePoint = localOrigin + rayDirection * middleDistance;\n if (groundedSurfaceDistance(middlePoint, height, radius) > 0.0) {\n farDistance = middleDistance;\n } else {\n nearDistance = middleDistance;\n }\n }\n vec3 hit = localOrigin + rayDirection * ((nearDistance + farDistance) * 0.5);\n return normalize(hit);\n }\n }\n#endif\n return d;\n}\n\nvec4 sampleBackgroundFromRay(vec3 origin, vec3 d) {\n d = groundedBackgroundDirection(origin, d);\n#ifdef USE_BACKGROUND\n vec4 t = backgroundMapTransform;\n d = vec3(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);\n vec4 backgroundSample = textureLinear(backgroundMap, cartesianToEquirect(d));\n return vec4(backgroundSample.rgb * t.z, backgroundSample.a);\n#else\n return textureLinear(backgroundMap, environmentUv(d));\n#endif\n}`\n});\n"]}
|