@tinypoly/gpu-renderer 0.0.0-stage → 0.0.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/ARCHITECTURE.md +339 -0
- package/LICENSE +21 -0
- package/README.md +284 -2
- package/dist/accumulator.d.ts +27 -0
- package/dist/accumulator.d.ts.map +1 -0
- package/dist/accumulator.js +57 -0
- package/dist/accumulator.js.map +1 -0
- package/dist/bvh.d.ts +26 -0
- package/dist/bvh.d.ts.map +1 -0
- package/dist/bvh.js +296 -0
- package/dist/bvh.js.map +1 -0
- package/dist/bvhBuilder.d.ts +72 -0
- package/dist/bvhBuilder.d.ts.map +1 -0
- package/dist/bvhBuilder.js +126 -0
- package/dist/bvhBuilder.js.map +1 -0
- package/dist/bvhWorker.d.ts +2 -0
- package/dist/bvhWorker.d.ts.map +1 -0
- package/dist/bvhWorker.js +8 -0
- package/dist/bvhWorker.js.map +1 -0
- package/dist/camera.d.ts +29 -0
- package/dist/camera.d.ts.map +1 -0
- package/dist/camera.js +48 -0
- package/dist/camera.js.map +1 -0
- package/dist/canvas.d.ts +9 -0
- package/dist/canvas.d.ts.map +1 -0
- package/dist/canvas.js +11 -0
- package/dist/canvas.js.map +1 -0
- package/dist/denoise.d.ts +69 -0
- package/dist/denoise.d.ts.map +1 -0
- package/dist/denoise.js +455 -0
- package/dist/denoise.js.map +1 -0
- package/dist/device.d.ts +37 -0
- package/dist/device.d.ts.map +1 -0
- package/dist/device.js +52 -0
- package/dist/device.js.map +1 -0
- package/dist/dispatchScheduler.d.ts +43 -0
- package/dist/dispatchScheduler.d.ts.map +1 -0
- package/dist/dispatchScheduler.js +49 -0
- package/dist/dispatchScheduler.js.map +1 -0
- package/dist/environment.d.ts +39 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +168 -0
- package/dist/environment.js.map +1 -0
- package/dist/frameLayout.d.ts +4 -0
- package/dist/frameLayout.d.ts.map +1 -0
- package/dist/frameLayout.js +58 -0
- package/dist/frameLayout.js.map +1 -0
- package/dist/geometry.d.ts +75 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +799 -0
- package/dist/geometry.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/lights.d.ts +64 -0
- package/dist/lights.d.ts.map +1 -0
- package/dist/lights.js +264 -0
- package/dist/lights.js.map +1 -0
- package/dist/materialLayout.d.ts +143 -0
- package/dist/materialLayout.d.ts.map +1 -0
- package/dist/materialLayout.js +297 -0
- package/dist/materialLayout.js.map +1 -0
- package/dist/math.d.ts +10 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +40 -0
- package/dist/math.js.map +1 -0
- package/dist/pathTracePass.d.ts +27 -0
- package/dist/pathTracePass.d.ts.map +1 -0
- package/dist/pathTracePass.js +83 -0
- package/dist/pathTracePass.js.map +1 -0
- package/dist/planarCapture.d.ts +38 -0
- package/dist/planarCapture.d.ts.map +1 -0
- package/dist/planarCapture.js +163 -0
- package/dist/planarCapture.js.map +1 -0
- package/dist/presentPass.d.ts +31 -0
- package/dist/presentPass.d.ts.map +1 -0
- package/dist/presentPass.js +78 -0
- package/dist/presentPass.js.map +1 -0
- package/dist/renderer.d.ts +209 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +847 -0
- package/dist/renderer.js.map +1 -0
- package/dist/sceneAssets.d.ts +24 -0
- package/dist/sceneAssets.d.ts.map +1 -0
- package/dist/sceneAssets.js +77 -0
- package/dist/sceneAssets.js.map +1 -0
- package/dist/sceneUpload.d.ts +61 -0
- package/dist/sceneUpload.d.ts.map +1 -0
- package/dist/sceneUpload.js +98 -0
- package/dist/sceneUpload.js.map +1 -0
- package/dist/shaderModule.d.ts +7 -0
- package/dist/shaderModule.d.ts.map +1 -0
- package/dist/shaderModule.js +19 -0
- package/dist/shaderModule.js.map +1 -0
- package/dist/shaderProgram.d.ts +124 -0
- package/dist/shaderProgram.d.ts.map +1 -0
- package/dist/shaderProgram.js +1030 -0
- package/dist/shaderProgram.js.map +1 -0
- package/dist/structLayout.d.ts +28 -0
- package/dist/structLayout.d.ts.map +1 -0
- package/dist/structLayout.js +58 -0
- package/dist/structLayout.js.map +1 -0
- package/dist/texturePack.d.ts +54 -0
- package/dist/texturePack.d.ts.map +1 -0
- package/dist/texturePack.js +86 -0
- package/dist/texturePack.js.map +1 -0
- package/dist/upstream.d.ts +7 -0
- package/dist/upstream.d.ts.map +1 -0
- package/dist/upstream.js +11 -0
- package/dist/upstream.js.map +1 -0
- package/dist/volumetric.d.ts +10 -0
- package/dist/volumetric.d.ts.map +1 -0
- package/dist/volumetric.js +34 -0
- package/dist/volumetric.js.map +1 -0
- package/dist/wgsl/bsdf.wgsl.d.ts +13 -0
- package/dist/wgsl/bsdf.wgsl.d.ts.map +1 -0
- package/dist/wgsl/bsdf.wgsl.js +619 -0
- package/dist/wgsl/bsdf.wgsl.js.map +1 -0
- package/dist/wgsl/bvh.wgsl.d.ts +3 -0
- package/dist/wgsl/bvh.wgsl.d.ts.map +1 -0
- package/dist/wgsl/bvh.wgsl.js +218 -0
- package/dist/wgsl/bvh.wgsl.js.map +1 -0
- package/dist/wgsl/common.wgsl.d.ts +3 -0
- package/dist/wgsl/common.wgsl.d.ts.map +1 -0
- package/dist/wgsl/common.wgsl.js +193 -0
- package/dist/wgsl/common.wgsl.js.map +1 -0
- package/dist/wgsl/environment.wgsl.d.ts +10 -0
- package/dist/wgsl/environment.wgsl.d.ts.map +1 -0
- package/dist/wgsl/environment.wgsl.js +145 -0
- package/dist/wgsl/environment.wgsl.js.map +1 -0
- package/dist/wgsl/lights.wgsl.d.ts +10 -0
- package/dist/wgsl/lights.wgsl.d.ts.map +1 -0
- package/dist/wgsl/lights.wgsl.js +434 -0
- package/dist/wgsl/lights.wgsl.js.map +1 -0
- package/dist/wgsl/pathTrace.wgsl.d.ts +14 -0
- package/dist/wgsl/pathTrace.wgsl.d.ts.map +1 -0
- package/dist/wgsl/pathTrace.wgsl.js +1020 -0
- package/dist/wgsl/pathTrace.wgsl.js.map +1 -0
- package/dist/wgsl/present.wgsl.d.ts +7 -0
- package/dist/wgsl/present.wgsl.d.ts.map +1 -0
- package/dist/wgsl/present.wgsl.js +154 -0
- package/dist/wgsl/present.wgsl.js.map +1 -0
- package/dist/wgsl/random.wgsl.d.ts +9 -0
- package/dist/wgsl/random.wgsl.d.ts.map +1 -0
- package/dist/wgsl/random.wgsl.js +91 -0
- package/dist/wgsl/random.wgsl.js.map +1 -0
- package/dist/wgsl/sampling.wgsl.d.ts +3 -0
- package/dist/wgsl/sampling.wgsl.d.ts.map +1 -0
- package/dist/wgsl/sampling.wgsl.js +31 -0
- package/dist/wgsl/sampling.wgsl.js.map +1 -0
- package/dist/wgsl/shaderSupport.wgsl.d.ts +6 -0
- package/dist/wgsl/shaderSupport.wgsl.d.ts.map +1 -0
- package/dist/wgsl/shaderSupport.wgsl.js +120 -0
- package/dist/wgsl/shaderSupport.wgsl.js.map +1 -0
- package/dist/wgsl/surface.wgsl.d.ts +10 -0
- package/dist/wgsl/surface.wgsl.d.ts.map +1 -0
- package/dist/wgsl/surface.wgsl.js +794 -0
- package/dist/wgsl/surface.wgsl.js.map +1 -0
- package/dist/wgsl/texture.wgsl.d.ts +11 -0
- package/dist/wgsl/texture.wgsl.d.ts.map +1 -0
- package/dist/wgsl/texture.wgsl.js +132 -0
- package/dist/wgsl/texture.wgsl.js.map +1 -0
- package/package.json +77 -3
- package/src/accumulator.ts +64 -0
- package/src/bvh.ts +336 -0
- package/src/bvhBuilder.ts +178 -0
- package/src/bvhWorker.ts +13 -0
- package/src/camera.ts +77 -0
- package/src/canvas.ts +13 -0
- package/src/denoise.ts +514 -0
- package/src/device.ts +81 -0
- package/src/dispatchScheduler.ts +71 -0
- package/src/environment.ts +233 -0
- package/src/frameLayout.ts +59 -0
- package/src/geometry.ts +1067 -0
- package/src/index.ts +64 -0
- package/src/lights.ts +365 -0
- package/src/materialLayout.ts +408 -0
- package/src/math.ts +48 -0
- package/src/pathTracePass.ts +97 -0
- package/src/planarCapture.ts +225 -0
- package/src/presentPass.ts +99 -0
- package/src/renderer.ts +1145 -0
- package/src/sceneAssets.ts +118 -0
- package/src/sceneUpload.ts +185 -0
- package/src/shaderModule.ts +19 -0
- package/src/shaderProgram.ts +1370 -0
- package/src/structLayout.ts +93 -0
- package/src/texturePack.ts +152 -0
- package/src/upstream.ts +56 -0
- package/src/volumetric.ts +42 -0
- package/src/wgsl/bsdf.wgsl.ts +618 -0
- package/src/wgsl/bvh.wgsl.ts +217 -0
- package/src/wgsl/common.wgsl.ts +193 -0
- package/src/wgsl/environment.wgsl.ts +144 -0
- package/src/wgsl/lights.wgsl.ts +433 -0
- package/src/wgsl/pathTrace.wgsl.ts +1019 -0
- package/src/wgsl/present.wgsl.ts +153 -0
- package/src/wgsl/random.wgsl.ts +90 -0
- package/src/wgsl/sampling.wgsl.ts +30 -0
- package/src/wgsl/shaderSupport.wgsl.ts +119 -0
- package/src/wgsl/surface.wgsl.ts +793 -0
- package/src/wgsl/texture.wgsl.ts +131 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shaderProgram.js","sourceRoot":"","sources":["../src/shaderProgram.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One description of a struct, from which both the WGSL declaration and the TypeScript writer come. The kernel's
|
|
3
|
+
* `Material` and `Frame` structs have dozens of fields each; keeping their word offsets by hand in two languages is the
|
|
4
|
+
* kind of mistake that compiles on both sides and then reads the wrong float on the device, where nothing can be printed.
|
|
5
|
+
*
|
|
6
|
+
* The alignment rules are WGSL's own for the host-shareable types used here.
|
|
7
|
+
*/
|
|
8
|
+
export type FieldType = "f32" | "u32" | "vec2u" | "vec4f" | "mat4f";
|
|
9
|
+
export interface StructField {
|
|
10
|
+
name: string;
|
|
11
|
+
type: FieldType;
|
|
12
|
+
/** One line of documentation, carried into the generated WGSL. */
|
|
13
|
+
doc?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface StructLayout {
|
|
16
|
+
name: string;
|
|
17
|
+
/** The WGSL declaration. */
|
|
18
|
+
wgsl: string;
|
|
19
|
+
/** Size in 32 bit words, rounded up to the struct's alignment, which is also its array stride. */
|
|
20
|
+
words: number;
|
|
21
|
+
/** Where each field starts, in words. */
|
|
22
|
+
offsets: Record<string, number>;
|
|
23
|
+
types: Record<string, FieldType>;
|
|
24
|
+
}
|
|
25
|
+
export declare function layoutStruct(name: string, fields: readonly StructField[]): StructLayout;
|
|
26
|
+
/** Writes named values into a struct's words. Missing fields stay zero; unknown ones are an error. */
|
|
27
|
+
export declare function writeStruct(layout: StructLayout, target: ArrayBuffer, wordOffset: number, values: Record<string, number | readonly number[] | ArrayLike<number> | boolean>): void;
|
|
28
|
+
//# sourceMappingURL=structLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structLayout.d.ts","sourceRoot":"","sources":["../src/structLayout.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,kGAAkG;IAClG,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC;AAYD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,YAAY,CA2BvF;AAED,sGAAsG;AACtG,wBAAgB,WAAW,CACzB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,QAqBjF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const SPEC = {
|
|
2
|
+
f32: { words: 1, align: 1, wgsl: "f32" },
|
|
3
|
+
u32: { words: 1, align: 1, wgsl: "u32" },
|
|
4
|
+
vec2u: { words: 2, align: 2, wgsl: "vec2<u32>" },
|
|
5
|
+
vec4f: { words: 4, align: 4, wgsl: "vec4<f32>" },
|
|
6
|
+
mat4f: { words: 16, align: 4, wgsl: "mat4x4<f32>" },
|
|
7
|
+
};
|
|
8
|
+
const roundUp = (value, align) => Math.ceil(value / align) * align;
|
|
9
|
+
export function layoutStruct(name, fields) {
|
|
10
|
+
const offsets = {};
|
|
11
|
+
const types = {};
|
|
12
|
+
const lines = [];
|
|
13
|
+
let at = 0;
|
|
14
|
+
let align = 1;
|
|
15
|
+
for (const field of fields) {
|
|
16
|
+
const spec = SPEC[field.type];
|
|
17
|
+
if (field.name in offsets)
|
|
18
|
+
throw new Error(`Duplicate field ${field.name} in ${name}.`);
|
|
19
|
+
at = roundUp(at, spec.align);
|
|
20
|
+
offsets[field.name] = at;
|
|
21
|
+
types[field.name] = field.type;
|
|
22
|
+
at += spec.words;
|
|
23
|
+
align = Math.max(align, spec.align);
|
|
24
|
+
if (field.doc)
|
|
25
|
+
lines.push(` // ${field.doc}`);
|
|
26
|
+
lines.push(` ${field.name}: ${spec.wgsl},`);
|
|
27
|
+
}
|
|
28
|
+
// A struct holding a vec4 is aligned to 16 bytes; anything smaller to 4, which a uniform still pads to 16.
|
|
29
|
+
const words = roundUp(at, Math.max(align, 4));
|
|
30
|
+
return { name, wgsl: `struct ${name} {\n${lines.join("\n")}\n};\n`, words, offsets, types };
|
|
31
|
+
}
|
|
32
|
+
/** Writes named values into a struct's words. Missing fields stay zero; unknown ones are an error. */
|
|
33
|
+
export function writeStruct(layout, target, wordOffset, values) {
|
|
34
|
+
const floats = new Float32Array(target);
|
|
35
|
+
const words = new Uint32Array(target);
|
|
36
|
+
for (const [name, value] of Object.entries(values)) {
|
|
37
|
+
const offset = layout.offsets[name];
|
|
38
|
+
if (offset === undefined)
|
|
39
|
+
throw new Error(`${layout.name} has no field ${name}.`);
|
|
40
|
+
const at = wordOffset + offset;
|
|
41
|
+
const type = layout.types[name];
|
|
42
|
+
if (type === "u32" || type === "vec2u") {
|
|
43
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
44
|
+
words[at] = Number(value) >>> 0;
|
|
45
|
+
else
|
|
46
|
+
for (let i = 0; i < Math.min(value.length, SPEC[type].words); i++)
|
|
47
|
+
words[at + i] = value[i] >>> 0;
|
|
48
|
+
}
|
|
49
|
+
else if (typeof value === "number" || typeof value === "boolean") {
|
|
50
|
+
floats[at] = Number(value);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
for (let i = 0; i < Math.min(value.length, SPEC[type].words); i++)
|
|
54
|
+
floats[at + i] = value[i];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=structLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structLayout.js","sourceRoot":"","sources":["../src/structLayout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { SerializedScene, SerializedTexture } from "./upstream.js";
|
|
2
|
+
/**
|
|
3
|
+
* Every texture of a scene in one storage buffer, led by a table saying where each one lives. Core WebGPU has no binding
|
|
4
|
+
* arrays and `texture_2d_array` wants one size and one format for every layer, which a Three.js scene does not provide,
|
|
5
|
+
* so the texels are read by hand. See the decision in ARCHITECTURE.md.
|
|
6
|
+
*
|
|
7
|
+
* Byte textures keep their eight bits per channel, four to a word, and are decoded from sRGB as they are read. Float
|
|
8
|
+
* textures keep all four, because their range is the reason they are float at all.
|
|
9
|
+
*/
|
|
10
|
+
export interface PackedTextures {
|
|
11
|
+
/**
|
|
12
|
+
* One buffer for all of it: `TEXTURE_WORDS` words per texture first, as `TextureInfo` in `wgsl/common.wgsl.ts`, then
|
|
13
|
+
* the texels each entry points at. A byte texture takes one word per texel, RGBA in the low to high bytes; a float
|
|
14
|
+
* texture takes four, each the bits of one linear channel. Keeping the two in one binding is what holds the shader
|
|
15
|
+
* inside the eight storage buffers a WebGPU device has to offer.
|
|
16
|
+
*/
|
|
17
|
+
data: Uint32Array;
|
|
18
|
+
count: number;
|
|
19
|
+
/** The index in the table of each texture, by the id the materials refer to it with. */
|
|
20
|
+
indexOf: Map<string, number>;
|
|
21
|
+
/** Where the words a caller appended begin, which is how the environment's distribution rides along. */
|
|
22
|
+
extraOffset: number;
|
|
23
|
+
}
|
|
24
|
+
/** Textures and raw words that are not part of the scene snapshot, such as the environment and its distribution. */
|
|
25
|
+
export interface TextureExtras {
|
|
26
|
+
textures?: readonly SerializedTexture[];
|
|
27
|
+
words?: Uint32Array;
|
|
28
|
+
}
|
|
29
|
+
/** Sixteen words per entry: see `TextureInfo` in `wgsl/common.wgsl.ts`. */
|
|
30
|
+
export declare const TEXTURE_WORDS = 16;
|
|
31
|
+
/** What a material's map index means when the material has no such map. */
|
|
32
|
+
export declare const NO_TEXTURE = 4294967295;
|
|
33
|
+
/** Three's own wrap constants, which the shader compares against. */
|
|
34
|
+
declare const REPEAT = 1000;
|
|
35
|
+
declare const MIRRORED_REPEAT = 1002;
|
|
36
|
+
/** How many UV sets the geometry carries, and so the highest channel a texture may ask for. */
|
|
37
|
+
export declare const UV_CHANNELS = 2;
|
|
38
|
+
/**
|
|
39
|
+
* Where everything will go, before anything is written: which index each texture gets and where the words after the
|
|
40
|
+
* texels begin. Materials and lights point into that tail by absolute offset, so they need it before the buffer exists.
|
|
41
|
+
*/
|
|
42
|
+
export interface TexturePlan {
|
|
43
|
+
textures: SerializedTexture[];
|
|
44
|
+
indexOf: Map<string, number>;
|
|
45
|
+
tableWords: number;
|
|
46
|
+
/** Where the words appended after the texels begin. */
|
|
47
|
+
extraOffset: number;
|
|
48
|
+
}
|
|
49
|
+
export declare function planTextures(scene: SerializedScene, extraTextures?: readonly SerializedTexture[]): TexturePlan;
|
|
50
|
+
export declare function packTextures(scene: SerializedScene, extras?: TextureExtras): PackedTextures;
|
|
51
|
+
/** The buffer a plan describes, with `extraWords` appended at its `extraOffset`. */
|
|
52
|
+
export declare function writeTextures(plan: TexturePlan, extraWords: Uint32Array): PackedTextures;
|
|
53
|
+
export { MIRRORED_REPEAT, REPEAT };
|
|
54
|
+
//# sourceMappingURL=texturePack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texturePack.d.ts","sourceRoot":"","sources":["../src/texturePack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAExE;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,wGAAwG;IACxG,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,oHAAoH;AACpH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACxC,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,2EAA2E;AAC3E,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,2EAA2E;AAC3E,eAAO,MAAM,UAAU,aAAa,CAAC;AASrC,qEAAqE;AACrE,QAAA,MAAM,MAAM,OAAO,CAAC;AACpB,QAAA,MAAM,eAAe,OAAO,CAAC;AAE7B,+FAA+F;AAC/F,eAAO,MAAM,WAAW,IAAI,CAAC;AAY7B;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,aAAa,GAAE,SAAS,iBAAiB,EAAO,GAAG,WAAW,CAalH;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,GAAE,aAAkB,GAAG,cAAc,CAE/F;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,GAAG,cAAc,CAwDxF;AAED,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/** Sixteen words per entry: see `TextureInfo` in `wgsl/common.wgsl.ts`. */
|
|
2
|
+
export const TEXTURE_WORDS = 16;
|
|
3
|
+
/** What a material's map index means when the material has no such map. */
|
|
4
|
+
export const NO_TEXTURE = 0xffffffff;
|
|
5
|
+
const TEXTURE_FLOAT = 1;
|
|
6
|
+
const TEXTURE_SRGB = 2;
|
|
7
|
+
const TEXTURE_NEAREST = 4;
|
|
8
|
+
const TEXTURE_FLIP_Y = 8;
|
|
9
|
+
/** An environment map whose mapping bends the view ray instead of mirroring it. */
|
|
10
|
+
const TEXTURE_REFRACTION = 16;
|
|
11
|
+
/** Three's own wrap constants, which the shader compares against. */
|
|
12
|
+
const REPEAT = 1000;
|
|
13
|
+
const MIRRORED_REPEAT = 1002;
|
|
14
|
+
/** How many UV sets the geometry carries, and so the highest channel a texture may ask for. */
|
|
15
|
+
export const UV_CHANNELS = 2;
|
|
16
|
+
const texelCount = (texture) => Math.max(0, texture.width) * Math.max(0, texture.height);
|
|
17
|
+
const isFloat = (texture) => texture.data instanceof Float32Array;
|
|
18
|
+
/**
|
|
19
|
+
* Whether the shader has to decode this texture's colour from sRGB. Only byte textures can still be encoded: a float
|
|
20
|
+
* texture was converted to linear when the scene was serialized, and had its colour space rewritten to say so.
|
|
21
|
+
*/
|
|
22
|
+
const isEncoded = (texture) => !isFloat(texture) && texture.colorSpace === "srgb";
|
|
23
|
+
export function planTextures(scene, extraTextures = []) {
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
// A texture id appears once, whoever refers to it; the first copy wins.
|
|
26
|
+
const textures = [...scene.textures ?? [], ...extraTextures]
|
|
27
|
+
.filter(texture => texelCount(texture) > 0 && texture.data.length >= texelCount(texture) * 4)
|
|
28
|
+
.filter(texture => !seen.has(texture.id) && !!seen.add(texture.id));
|
|
29
|
+
const indexOf = new Map(textures.map((texture, index) => [texture.id, index]));
|
|
30
|
+
const tableWords = Math.max(1, textures.length) * TEXTURE_WORDS;
|
|
31
|
+
const texelWords = textures.reduce((sum, texture) => sum + texelCount(texture) * (isFloat(texture) ? 4 : 1), 0);
|
|
32
|
+
return { textures, indexOf, tableWords, extraOffset: tableWords + texelWords };
|
|
33
|
+
}
|
|
34
|
+
export function packTextures(scene, extras = {}) {
|
|
35
|
+
return writeTextures(planTextures(scene, extras.textures), extras.words ?? new Uint32Array(0));
|
|
36
|
+
}
|
|
37
|
+
/** The buffer a plan describes, with `extraWords` appended at its `extraOffset`. */
|
|
38
|
+
export function writeTextures(plan, extraWords) {
|
|
39
|
+
const { textures, indexOf, tableWords } = plan;
|
|
40
|
+
// WebGPU rejects an empty binding, and a scene with no textures at all is ordinary.
|
|
41
|
+
const data = new Uint32Array(Math.max(4, plan.extraOffset + extraWords.length));
|
|
42
|
+
const words = data;
|
|
43
|
+
const floats = new Float32Array(data.buffer);
|
|
44
|
+
let texelAt = tableWords;
|
|
45
|
+
textures.forEach((texture, index) => {
|
|
46
|
+
const at = index * TEXTURE_WORDS;
|
|
47
|
+
const texels = texelCount(texture);
|
|
48
|
+
const float = isFloat(texture);
|
|
49
|
+
words[at] = texture.width;
|
|
50
|
+
words[at + 1] = texture.height;
|
|
51
|
+
words[at + 2] = texelAt;
|
|
52
|
+
words[at + 3] = (float ? TEXTURE_FLOAT : 0)
|
|
53
|
+
| (isEncoded(texture) ? TEXTURE_SRGB : 0)
|
|
54
|
+
| (texture.nearest ? TEXTURE_NEAREST : 0)
|
|
55
|
+
| (texture.flipY ? TEXTURE_FLIP_Y : 0)
|
|
56
|
+
| (texture.refraction ? TEXTURE_REFRACTION : 0);
|
|
57
|
+
words[at + 4] = texture.wrapS;
|
|
58
|
+
words[at + 5] = texture.wrapT;
|
|
59
|
+
words[at + 6] = Math.min(Math.max(0, texture.channel | 0), UV_CHANNELS - 1);
|
|
60
|
+
words[at + 7] = 0;
|
|
61
|
+
// Three's Matrix3 arrives column major, so a row of the affine transform reads across the columns.
|
|
62
|
+
const matrix = texture.matrix?.length === 9 ? texture.matrix : [1, 0, 0, 0, 1, 0, 0, 0, 1];
|
|
63
|
+
floats.set([matrix[0], matrix[3], matrix[6], 0], at + 8);
|
|
64
|
+
floats.set([matrix[1], matrix[4], matrix[7], 0], at + 12);
|
|
65
|
+
if (float) {
|
|
66
|
+
// The channels keep their bits and the shader reads them back as floats.
|
|
67
|
+
floats.set(texture.data.subarray(0, texels * 4), texelAt);
|
|
68
|
+
texelAt += texels * 4;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const source = texture.data;
|
|
72
|
+
for (let texel = 0; texel < texels; texel++) {
|
|
73
|
+
const offset = texel * 4;
|
|
74
|
+
words[texelAt + texel] = source[offset]
|
|
75
|
+
| (source[offset + 1] << 8)
|
|
76
|
+
| (source[offset + 2] << 16)
|
|
77
|
+
| (source[offset + 3] << 24);
|
|
78
|
+
}
|
|
79
|
+
texelAt += texels;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
data.set(extraWords, texelAt);
|
|
83
|
+
return { data, count: textures.length, indexOf, extraOffset: texelAt };
|
|
84
|
+
}
|
|
85
|
+
export { MIRRORED_REPEAT, REPEAT };
|
|
86
|
+
//# sourceMappingURL=texturePack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texturePack.js","sourceRoot":"","sources":["../src/texturePack.ts"],"names":[],"mappings":"AA+BA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEhC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;AAErC,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,mFAAmF;AACnF,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,qEAAqE;AACrE,MAAM,MAAM,GAAG,IAAI,CAAC;AACpB,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,+FAA+F;AAC/F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAE7B,MAAM,UAAU,GAAG,CAAC,OAA0B,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AAE5G,MAAM,OAAO,GAAG,CAAC,OAA0B,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,YAAY,YAAY,CAAC;AAErF;;;GAGG;AACH,MAAM,SAAS,GAAG,CAAC,OAA0B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM,CAAC;AAcrG,MAAM,UAAU,YAAY,CAAC,KAAsB,EAAE,gBAA8C,EAAE;IACnG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,wEAAwE;IACxE,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG,aAAa,CAAC;SACzD,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SAC5F,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC;IAChE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAsB,EAAE,SAAwB,EAAE;IAC7E,OAAO,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,aAAa,CAAC,IAAiB,EAAE,UAAuB;IACtE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE/C,oFAAoF;IACpF,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,IAAI,CAAC;IACnB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,OAAO,GAAG,UAAU,CAAC;IAEzB,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAClC,MAAM,EAAE,GAAG,KAAK,GAAG,aAAa,CAAC;QACjC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAE/B,KAAK,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAC1B,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/B,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;QACxB,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;cACvC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;cACvC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;cACvC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;cACpC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9B,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9B,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QAC5E,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAElB,mGAAmG;QACnG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3F,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAE1D,IAAI,KAAK,EAAE,CAAC;YACV,yEAAyE;YACzE,MAAM,CAAC,GAAG,CAAE,OAAO,CAAC,IAAqB,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5E,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,OAAO,CAAC,IAAkB,CAAC;YAE1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;gBAEzB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;sBACnC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;sBACzB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;sBAC1B,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACjC,CAAC;YAED,OAAO,IAAI,MAAM,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE9B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACzE,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { DEFAULT_RENDER_ENVIRONMENT, DEFAULT_RENDER_SETTINGS, mergeSettings, sceneSignature, serializeCamera, serializeScene, } from "@tinypoly/cpu-renderer";
|
|
2
|
+
export type { Bucket, CameraState, Listener, RenderBackgroundMode, RenderCamera, RenderEnvironment, RenderImage, RenderPhase, RenderPixels, RenderScene, RenderSettings, RenderSettingsInput, RenderToneMapping, SerializedScene, SerializedSceneResult, } from "@tinypoly/cpu-renderer";
|
|
3
|
+
export { EventEmitter } from "@tinypoly/cpu-renderer/engine";
|
|
4
|
+
export { encodeColor, srgbToLinear } from "@tinypoly/cpu-renderer/engine";
|
|
5
|
+
export { CpuComputePipeline, CpuEnvironment, CpuShader, matrixValue, sampleTexture, } from "@tinypoly/cpu-renderer/engine";
|
|
6
|
+
export type { SerializedFog, SerializedLight, SerializedMaterial, SerializedMesh, SerializedShader, SerializedTexture, UniformValue, } from "@tinypoly/cpu-renderer/engine";
|
|
7
|
+
//# sourceMappingURL=upstream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EACV,MAAM,EACN,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAK1E,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,GACb,MAAM,+BAA+B,CAAC"}
|
package/dist/upstream.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Everything this renderer takes from @tinypoly/cpu-renderer passes through here, so a version bump has one place to
|
|
2
|
+
// audit. The sibling package owns the scene snapshot, the settings and the tone mapping; this one owns the GPU.
|
|
3
|
+
export { DEFAULT_RENDER_ENVIRONMENT, DEFAULT_RENDER_SETTINGS, mergeSettings, sceneSignature, serializeCamera, serializeScene, } from "@tinypoly/cpu-renderer";
|
|
4
|
+
// The engine entry point is the lower level one, and the sibling's README warns that it moves more often.
|
|
5
|
+
export { EventEmitter } from "@tinypoly/cpu-renderer/engine";
|
|
6
|
+
export { encodeColor, srgbToLinear } from "@tinypoly/cpu-renderer/engine";
|
|
7
|
+
// The GLSL interpreter runs vertex shaders here, where a vertex's position has to be known before the hierarchy is
|
|
8
|
+
// built; the same interpreter bakes a procedural sky and a material's compute simulation, exactly as the CPU renderer
|
|
9
|
+
// does. Only fragment shaders are translated to WGSL, because only they run per sample.
|
|
10
|
+
export { CpuComputePipeline, CpuEnvironment, CpuShader, matrixValue, sampleTexture, } from "@tinypoly/cpu-renderer/engine";
|
|
11
|
+
//# sourceMappingURL=upstream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstream.js","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,gHAAgH;AAEhH,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,wBAAwB,CAAC;AAqBhC,0GAA0G;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE1E,mHAAmH;AACnH,sHAAsH;AACtH,wFAAwF;AACxF,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SerializedLight } from "./upstream.js";
|
|
2
|
+
/**
|
|
3
|
+
* The CPU renderer's volumetric lights (`userData.cpuRenderer.volumetric` on a point or spot light): light scattered by
|
|
4
|
+
* the air along every view ray, marched as `volumetricLight.js` marches it and added over the image the same way. The
|
|
5
|
+
* kernel reads one record of `VOLUMETRIC_WORDS` floats per light from the texture buffer's tail.
|
|
6
|
+
*/
|
|
7
|
+
export declare const VOLUMETRIC_WORDS = 20;
|
|
8
|
+
/** The records, or an empty array when no light scatters. */
|
|
9
|
+
export declare function packVolumetricLights(lights: readonly SerializedLight[]): Float32Array;
|
|
10
|
+
//# sourceMappingURL=volumetric.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volumetric.d.ts","sourceRoot":"","sources":["../src/volumetric.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAUnC,6DAA6D;AAC7D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,YAAY,CAuBrF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CPU renderer's volumetric lights (`userData.cpuRenderer.volumetric` on a point or spot light): light scattered by
|
|
3
|
+
* the air along every view ray, marched as `volumetricLight.js` marches it and added over the image the same way. The
|
|
4
|
+
* kernel reads one record of `VOLUMETRIC_WORDS` floats per light from the texture buffer's tail.
|
|
5
|
+
*/
|
|
6
|
+
export const VOLUMETRIC_WORDS = 20;
|
|
7
|
+
const clamp = (value, low = 0, high = 1) => Math.min(high, Math.max(low, value));
|
|
8
|
+
function normalize(v) {
|
|
9
|
+
const length = Math.hypot(v[0], v[1], v[2]) || 1;
|
|
10
|
+
return [v[0] / length, v[1] / length, v[2] / length];
|
|
11
|
+
}
|
|
12
|
+
/** The records, or an empty array when no light scatters. */
|
|
13
|
+
export function packVolumetricLights(lights) {
|
|
14
|
+
const volumetric = lights.filter(light => light.volumetric && (light.type === "PointLight" || light.type === "SpotLight"));
|
|
15
|
+
const records = new Float32Array(volumetric.length * VOLUMETRIC_WORDS);
|
|
16
|
+
volumetric.forEach((light, index) => {
|
|
17
|
+
const density = Math.max(0, light.medium?.density ?? 0.01);
|
|
18
|
+
const spread = clamp(light.medium?.spread ?? 0);
|
|
19
|
+
// Scattered light reaches past the cone: up to 1.5 rad (86 degrees) off the axis with a full spread.
|
|
20
|
+
const outer = light.angle + spread * Math.max(0, 1.5 - light.angle);
|
|
21
|
+
const axis = normalize([0, 1, 2].map(k => light.target[k] - light.position[k]));
|
|
22
|
+
const radius = light.distance > 0 ? light.distance : -3 * Math.log(0.0001);
|
|
23
|
+
const spot = light.type === "SpotLight";
|
|
24
|
+
records.set([
|
|
25
|
+
...light.position, spot ? 1 : 0,
|
|
26
|
+
...axis, radius,
|
|
27
|
+
...light.color.map(channel => channel * light.intensity), density,
|
|
28
|
+
light.angle, light.penumbra, light.distance, outer,
|
|
29
|
+
spread, clamp(light.medium?.anisotropy ?? 0, -0.95, 0.95), light.castShadow ? 1 : 0, 0,
|
|
30
|
+
], index * VOLUMETRIC_WORDS);
|
|
31
|
+
});
|
|
32
|
+
return records;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=volumetric.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volumetric.js","sourceRoot":"","sources":["../src/volumetric.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Material evaluation and the sampling the CPU renderer has no need for. Its `material.js` only ever asks what a surface
|
|
3
|
+
* reflects towards a light it already knows about; a path tracer also has to ask the opposite question, which direction
|
|
4
|
+
* to continue in, and with what density it chose it.
|
|
5
|
+
*
|
|
6
|
+
* The lobes evaluate as Three r185's direct lighting does (`lights_physical_pars_fragment`, `BRDF_BlinnPhong`, the toon
|
|
7
|
+
* ramp): GGX with its multiple scattering term, anisotropy, sheen and its energy compensation, a clearcoat on its own
|
|
8
|
+
* normal, and an iridescent film blended into the Fresnel. They are sampled with the standard methods for each: cosine
|
|
9
|
+
* for the diffuse lobe, the visible normal distribution (Heitz 2018) for GGX, anisotropic or not, and the Blinn-Phong
|
|
10
|
+
* lobe for Phong, mixed by how much each lobe reflects.
|
|
11
|
+
*/
|
|
12
|
+
export declare const BSDF_WGSL = "\n/** How a surface answers a direction: what it reflects, and how likely sampling was to have chosen it. */\nstruct BsdfEval {\n // The bidirectional distribution times the cosine at the surface, which is what a contribution is multiplied by.\n value: vec3<f32>,\n // Solid angle density of this direction under this renderer's own sampling, for the power heuristic.\n pdf: f32,\n};\n\nstruct BsdfSample {\n direction: vec3<f32>,\n // The distribution over its own density: what the path's throughput is multiplied by.\n weight: vec3<f32>,\n pdf: f32,\n valid: bool,\n // The diffuse lobe chose the direction, rather than a specular one: which of the denoiser's two signals it feeds.\n diffuse: bool,\n};\n\nfn luminanceOf(color: vec3<f32>) -> f32 {\n return dot(color, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\nfn max3(color: vec3<f32>) -> f32 {\n return max(color.r, max(color.g, color.b));\n}\n\n/** Schlick's approximation, as in Three: the reflectance always reaches one at a grazing angle. */\nfn fresnelSchlick(f0: vec3<f32>, cosine: f32) -> vec3<f32> {\n return schlick3(f0, 1.0, cosine);\n}\n\n/** Reflectance at normal incidence: the dielectric's own, turned towards the base colour as the surface turns metal. */\nfn surfaceF0(surface: Surface) -> vec3<f32> {\n return mix(surface.specularColor, surface.albedo, surface.metalness);\n}\n\n/** GGX, with alpha the square of the roughness, as Three parameterises it. */\nfn ggxDistribution(alpha2: f32, nh: f32) -> f32 {\n let denominator = nh * nh * (alpha2 - 1.0) + 1.0;\n\n return alpha2 / (PI * denominator * denominator);\n}\n\n/** Smith's height correlated visibility, which already carries the 1/(4 nl nv) the lobe would otherwise need. */\nfn ggxVisibility(alpha2: f32, nl: f32, nv: f32) -> f32 {\n return 0.5 / (nl * sqrt(nv * nv * (1.0 - alpha2) + alpha2) + nv * sqrt(nl * nl * (1.0 - alpha2) + alpha2) + 1e-7);\n}\n\n/** The separable masking term, which is the one the visible normal sampling is built on. */\nfn ggxMasking(alpha2: f32, nv: f32) -> f32 {\n return 2.0 * nv / (nv + sqrt(alpha2 + (1.0 - alpha2) * nv * nv));\n}\n\n/** Karis' analytic fit of the GGX directional albedo (Three's DFGApprox): the scale and bias applied to F0 and F90. */\nfn dfgApprox(roughness: f32, nv: f32) -> vec2<f32> {\n let r = roughness * vec4<f32>(-1.0, -0.0275, -0.572, 0.022) + vec4<f32>(1.0, 0.0425, 1.04, -0.04);\n let a004 = min(r.x * r.x, exp2(-9.28 * nv)) * r.x + r.y;\n\n return vec2<f32>(-1.04, 1.04) * a004 + r.zw;\n}\n\n/** Three's IBLSheenBRDF: the Charlie sheen lobe integrated over the hemisphere. */\nfn sheenAlbedo(cosine: f32, roughness: f32) -> f32 {\n let r2 = roughness * roughness;\n let inverse = 1.0 / (roughness + 0.1);\n let a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * inverse;\n let b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * inverse;\n\n return clamp(exp(a * clamp(cosine, 0.0, 1.0) + b), 0.0, 1.0);\n}\n\n/** Three's D_Charlie times V_Neubelt. */\nfn sheenLobe(roughness: f32, nh: f32, nv: f32, nl: f32) -> f32 {\n let inverse = 1.0 / (roughness * roughness);\n let sin2h = max(1.0 - nh * nh, 0.0078125);\n let distribution = (2.0 + inverse) * pow(sin2h, inverse * 0.5) / (2.0 * PI);\n\n return distribution * clamp(1.0 / (4.0 * (nl + nv - nl * nv)), 0.0, 1.0);\n}\n\n/** The frame the specular lobe is defined in: Three's anisotropy direction when there is one, any frame otherwise. */\nfn specularBasis(surface: Surface) -> mat3x3<f32> {\n let normal = surface.normal;\n\n if (surface.anisotropy > 0.0) {\n let t = surface.anisotropyT - normal * dot(normal, surface.anisotropyT);\n let tangent = normalize(t);\n\n if (all(tangent == tangent) && dot(t, t) > 1e-12) {\n return mat3x3<f32>(tangent, cross(normal, tangent), normal);\n }\n }\n\n return orthonormalBasis(normal);\n}\n\n/** The GGX roughness along the frame's two axes: Three's alphaT along the anisotropy, alpha across it. */\nfn specularAlphas(surface: Surface) -> vec2<f32> {\n let alpha = surface.roughness * surface.roughness;\n\n if (surface.anisotropy > 0.0) {\n return vec2<f32>(max(surface.alphaT, 1e-4), max(alpha, 1e-4));\n }\n\n return vec2<f32>(max(alpha, 1e-4));\n}\n\n/** Anisotropic GGX in the lobe's own frame; with equal alphas it is exactly the isotropic distribution. */\nfn ggxAnisotropic(h: vec3<f32>, alphas: vec2<f32>) -> f32 {\n let x = h.x / alphas.x;\n let y = h.y / alphas.y;\n let d = x * x + y * y + h.z * h.z;\n\n return 1.0 / (PI * alphas.x * alphas.y * d * d);\n}\n\n/** Smith's masking of one direction, in the lobe's frame. */\nfn ggxMaskingAnisotropic(v: vec3<f32>, alphas: vec2<f32>) -> f32 {\n let projected = alphas.x * alphas.x * v.x * v.x + alphas.y * alphas.y * v.y * v.y;\n\n return 2.0 * v.z / (v.z + sqrt(v.z * v.z + projected));\n}\n\n/** Three's V_GGX_SmithCorrelated_Anisotropic, in the lobe's frame. */\nfn ggxVisibilityAnisotropic(l: vec3<f32>, v: vec3<f32>, alphas: vec2<f32>) -> f32 {\n let gv = l.z * length(vec3<f32>(alphas.x * v.x, alphas.y * v.y, v.z));\n let gl = v.z * length(vec3<f32>(alphas.x * l.x, alphas.y * l.y, l.z));\n\n return 0.5 / max(gv + gl, 1e-7);\n}\n\n/**\n * A half vector drawn from the distribution of normals the view direction can actually see (Heitz 2018), which is what\n * keeps the specular lobe from wasting samples on microfacets facing away. The view is in the lobe's frame.\n */\nfn sampleVisibleNormal(view: vec3<f32>, alphas: vec2<f32>, u: vec2<f32>) -> vec3<f32> {\n let stretched = normalize(vec3<f32>(alphas.x * view.x, alphas.y * view.y, view.z));\n let lengthSquared = stretched.x * stretched.x + stretched.y * stretched.y;\n let t1 = select(\n vec3<f32>(1.0, 0.0, 0.0),\n vec3<f32>(-stretched.y, stretched.x, 0.0) * inverseSqrt(max(lengthSquared, 1e-20)),\n lengthSquared > 1e-20);\n let t2 = cross(stretched, t1);\n let radius = sqrt(u.x);\n let angle = 2.0 * PI * u.y;\n let px = radius * cos(angle);\n let raw = radius * sin(angle);\n let lift = 0.5 * (1.0 + stretched.z);\n let py = (1.0 - lift) * sqrt(max(0.0, 1.0 - px * px)) + lift * raw;\n let normal = t1 * px + t2 * py + stretched * sqrt(max(0.0, 1.0 - px * px - py * py));\n\n return normalize(vec3<f32>(alphas.x * normal.x, alphas.y * normal.y, max(normal.z, 1e-6)));\n}\n\n/** What the clearcoat takes back from everything under it, seen from this view: Three's (1 - clearcoat * Fcc). */\nfn coatTransmittance(surface: Surface, view: vec3<f32>) -> f32 {\n if (surface.clearcoat <= 0.0) {\n return 1.0;\n }\n\n let nv = clamp(dot(surface.clearcoatNormal, view), 0.0, 1.0);\n\n return 1.0 - surface.clearcoat * schlick3(vec3<f32>(0.04), 1.0, nv).x;\n}\n\n/** How often each lobe is chosen, as (diffuse, specular, clearcoat): by how much of the reflection each accounts for. */\nfn lobeWeights(surface: Surface, view: vec3<f32>) -> vec3<f32> {\n let nv = max(dot(surface.normal, view), 1e-4);\n\n if (surface.kind == KIND_PHONG) {\n let diffuse = luminanceOf(surface.albedo) + 0.02;\n let specular = luminanceOf(surface.specularColor) * surface.specularStrength * (surface.shininess * 0.125 + 1.0) + 0.02;\n\n return vec3<f32>(diffuse, specular, 0.0) / (diffuse + specular);\n }\n\n if ((surface.flags & MATERIAL_PBR) == 0u) {\n return vec3<f32>(1.0, 0.0, 0.0);\n }\n\n let base = coatTransmittance(surface, view);\n // The floors keep every lobe reachable: the diffuse one also carries the sheen and the multiple scattering term.\n let diffuse = (luminanceOf(surface.albedo * (1.0 - surface.metalness)) + max3(surface.sheenColor)) * base + 0.02;\n let specular = luminanceOf(schlick3(surface.specularColor, surface.specularF90, nv)\n * (1.0 - surface.metalness) + surface.albedo * surface.metalness) * base + 0.05;\n let coat = select(0.0, (1.0 - base) + 0.02, surface.clearcoat > 0.0);\n let total = diffuse + specular + coat;\n\n return vec3<f32>(diffuse, specular, coat) / total;\n}\n\n/** Three's physical direct lighting for one light direction, times the cosine. */\nfn physicalValue(surface: Surface, view: vec3<f32>, light: vec3<f32>) -> vec3<f32> {\n let normal = surface.normal;\n let nl = dot(normal, light);\n let nv = max(dot(normal, view), 1e-4);\n var value = vec3<f32>(0.0);\n\n if (nl > 0.0) {\n let basis = specularBasis(surface);\n let alphas = specularAlphas(surface);\n let half = normalize(light + view);\n let vh = clamp(dot(view, half), 0.0, 1.0);\n let f0 = surfaceF0(surface);\n var fresnel = schlick3(f0, surface.specularF90, vh);\n\n if (surface.iridescence > 0.0) {\n fresnel = mix(fresnel, surface.iridescenceFresnel, surface.iridescence);\n }\n\n let localLight = vec3<f32>(dot(light, basis[0]), dot(light, basis[1]), nl);\n let localView = vec3<f32>(dot(view, basis[0]), dot(view, basis[1]), nv);\n let localHalf = vec3<f32>(dot(half, basis[0]), dot(half, basis[1]), max(dot(half, normal), 0.0));\n let single = fresnel * (ggxVisibilityAnisotropic(localLight, localView, alphas) * ggxAnisotropic(localHalf, alphas));\n\n // Three's BRDF_GGX_Multiscatter: the energy single scattering loses at high roughness, returned.\n let dfgV = dfgApprox(surface.roughness, nv);\n let dfgL = dfgApprox(surface.roughness, nl);\n let essV = f0 * dfgV.x + surface.specularF90 * dfgV.y;\n let essL = f0 * dfgL.x + surface.specularF90 * dfgL.y;\n let emsV = 1.0 - (dfgV.x + dfgV.y);\n let emsL = 1.0 - (dfgL.x + dfgL.y);\n let average = f0 + (vec3<f32>(1.0) - f0) * 0.047619;\n let multiple = essV * essL * average / (vec3<f32>(1.0) - emsV * emsL * average + 1e-7) * (emsV * emsL);\n\n var diffuse = surface.albedo * (1.0 - surface.metalness) / PI;\n var specular = single + multiple;\n\n // Three's sheen: its lobe sits on top and takes back the energy it reflects from the layers below.\n if (any(surface.sheenColor > vec3<f32>(0.0))) {\n let energy = 1.0 - max3(surface.sheenColor)\n * max(sheenAlbedo(nv, surface.sheenRoughness), sheenAlbedo(nl, surface.sheenRoughness));\n\n diffuse = diffuse * energy;\n specular = specular * energy\n + surface.sheenColor * sheenLobe(surface.sheenRoughness, clamp(dot(normal, half), 0.0, 1.0), nv, nl);\n }\n\n value = (diffuse + specular) * nl;\n }\n\n if (surface.clearcoat > 0.0) {\n let coatNormal = surface.clearcoatNormal;\n value = value * coatTransmittance(surface, view);\n\n let nlCoat = dot(coatNormal, light);\n let nvCoat = max(dot(coatNormal, view), 1e-4);\n\n if (nlCoat > 0.0) {\n let half = normalize(light + view);\n let alpha = surface.clearcoatRoughness * surface.clearcoatRoughness;\n let alpha2 = alpha * alpha;\n let fresnel = schlick3(vec3<f32>(0.04), 1.0, clamp(dot(view, half), 0.0, 1.0)).x;\n let lobe = fresnel * ggxVisibility(alpha2, nlCoat, nvCoat) * ggxDistribution(alpha2, max(dot(coatNormal, half), 0.0));\n\n value = value + vec3<f32>(surface.clearcoat * lobe * nlCoat);\n }\n }\n\n return value;\n}\n\n/** Three's D_BlinnPhong times its implicit visibility of a quarter: the Phong highlight's distribution. */\nfn blinnPhong(shininess: f32, nh: f32) -> f32 {\n return 0.25 * (shininess * 0.5 + 1.0) / PI * pow(max(nh, 0.0), shininess);\n}\n\n/** Density of the Blinn-Phong lobe's sampling, per solid angle of the light direction. */\nfn blinnPhongPdf(shininess: f32, nh: f32, vh: f32) -> f32 {\n return (shininess + 1.0) / (2.0 * PI) * pow(max(nh, 0.0), shininess) / max(4.0 * vh, 1e-6);\n}\n\n/** Density with which the GGX lobe (VNDF) would have produced this light direction, in the lobe's frame. */\nfn ggxPdf(localLight: vec3<f32>, localView: vec3<f32>, alphas: vec2<f32>) -> f32 {\n let half = normalize(localLight + localView);\n\n if (half.z <= 0.0 || localView.z <= 0.0) {\n return 0.0;\n }\n\n return ggxMaskingAnisotropic(localView, alphas) * ggxAnisotropic(half, alphas) / (4.0 * localView.z);\n}\n\n/** The mixture density of every lobe this surface samples with. */\nfn bsdfPdf(surface: Surface, view: vec3<f32>, light: vec3<f32>) -> f32 {\n let normal = surface.normal;\n let nl = dot(normal, light);\n let weights = lobeWeights(surface, view);\n var pdf = weights.x * max(nl, 0.0) / PI;\n\n if (surface.kind == KIND_PHONG) {\n let half = normalize(light + view);\n\n return pdf + weights.y * blinnPhongPdf(surface.shininess, dot(normal, half), max(dot(view, half), 0.0));\n }\n\n if ((surface.flags & MATERIAL_PBR) == 0u) {\n return pdf;\n }\n\n let basis = specularBasis(surface);\n let alphas = specularAlphas(surface);\n\n pdf = pdf + weights.y * ggxPdf(\n vec3<f32>(dot(light, basis[0]), dot(light, basis[1]), nl),\n vec3<f32>(dot(view, basis[0]), dot(view, basis[1]), dot(view, normal)),\n alphas);\n\n if (weights.z > 0.0) {\n let coatBasis = orthonormalBasis(surface.clearcoatNormal);\n let alpha = max(surface.clearcoatRoughness * surface.clearcoatRoughness, 1e-4);\n\n pdf = pdf + weights.z * ggxPdf(\n vec3<f32>(dot(light, coatBasis[0]), dot(light, coatBasis[1]), dot(light, surface.clearcoatNormal)),\n vec3<f32>(dot(view, coatBasis[0]), dot(view, coatBasis[1]), dot(view, surface.clearcoatNormal)),\n vec2<f32>(alpha));\n }\n\n return pdf;\n}\n\n/**\n * What the surface sends towards the view direction, and the density of that direction. A Lambert material keeps\n * Three's Lambert term alone, which is all its own shading has; a toon material reads its ramp in place of the cosine.\n */\nfn evaluateBsdf(surface: Surface, view: vec3<f32>, light: vec3<f32>) -> BsdfEval {\n let normal = surface.normal;\n var result: BsdfEval;\n result.value = vec3<f32>(0.0);\n result.pdf = 0.0;\n\n let nl = dot(normal, light);\n let nv = dot(normal, view);\n\n if (nv <= 0.0) {\n return result;\n }\n\n if (surface.kind == KIND_TOON) {\n // Three's toon lighting reads its ramp across the whole sphere of directions, the side facing away included.\n result.value = surface.albedo / PI * toonRamp(surface.gradientMap, nl);\n result.pdf = max(nl, 0.0) / PI;\n\n return result;\n }\n\n // A clearcoat may face a light its base turns away from, so only a surface without one stops here.\n if (nl <= 0.0 && surface.clearcoat <= 0.0) {\n return result;\n }\n\n if ((surface.flags & MATERIAL_PBR) != 0u) {\n result.value = physicalValue(surface, view, light);\n } else if (surface.kind == KIND_PHONG) {\n let half = normalize(light + view);\n let fresnel = schlick3(surface.specularColor, 1.0, clamp(dot(view, half), 0.0, 1.0));\n let specular = fresnel * blinnPhong(surface.shininess, dot(normal, half)) * surface.specularStrength;\n\n result.value = (surface.albedo / PI + specular) * max(nl, 0.0);\n } else {\n result.value = surface.albedo / PI * max(nl, 0.0);\n }\n\n result.pdf = bsdfPdf(surface, view, light);\n\n return result;\n}\n\n/**\n * Reflectance of a smooth dielectric interface, from both polarisations rather than Schlick's fit: refraction needs the\n * exact cut-off past which nothing gets through. eta is the index the ray leaves over the index it enters.\n */\nfn fresnelDielectric(cosine: f32, eta: f32) -> f32 {\n let c = clamp(cosine, 0.0, 1.0);\n let sin2 = eta * eta * (1.0 - c * c);\n\n if (sin2 >= 1.0) {\n return 1.0;\n }\n\n let t = sqrt(1.0 - sin2);\n let s = (eta * c - t) / (eta * c + t);\n let p = (c - eta * t) / (c + eta * t);\n\n return 0.5 * (s * s + p * p);\n}\n\n/** Where a transmissive surface sends the path: off it, or through it. */\nstruct DielectricSample {\n direction: vec3<f32>,\n weight: vec3<f32>,\n // The path went through the surface instead of reflecting off it.\n crossed: bool,\n // It went through without bending, so the density that found the next hit is still the one before this surface.\n straight: bool,\n valid: bool,\n};\n\n/**\n * The transmissive share of a physical material. Reflection and refraction are chosen in proportion to the Fresnel\n * reflectance on a microfacet drawn from the visible normals, which leaves only the masking of the outgoing direction\n * in the weight. Light is tinted by the base colour once, on the way in, which is where Three applies it.\n *\n * A thin wall (zero thickness, Three's default) bends nothing: what is not reflected carries straight on, exactly as a\n * shadow ray crossing it does in thinCrossing, so the two estimators agree on a window. ior is the index this path\n * sees, which dispersion makes depend on the colour the path carries.\n */\nfn sampleDielectric(surface: Surface, view: vec3<f32>, ior: f32, lobe: f32, u: vec2<f32>) -> DielectricSample {\n let normal = surface.normal;\n var result: DielectricSample;\n result.valid = false;\n result.crossed = false;\n result.straight = false;\n result.weight = vec3<f32>(0.0);\n\n let nv = dot(normal, view);\n\n if (nv <= 0.0) {\n return result;\n }\n\n let alpha = max(surface.roughness * surface.roughness, 1e-4);\n let alpha2 = alpha * alpha;\n let basis = orthonormalBasis(normal);\n let localView = vec3<f32>(dot(view, basis[0]), dot(view, basis[1]), nv);\n let localHalf = sampleVisibleNormal(localView, vec2<f32>(alpha), u);\n let half = basis[0] * localHalf.x + basis[1] * localHalf.y + normal * localHalf.z;\n\n if (surface.thickness <= 0.0) {\n let reflectance = fresnelDielectric(abs(dot(surface.facing, view)), 1.0 / ior);\n\n if (lobe >= reflectance) {\n result.direction = -view;\n result.weight = surface.albedo;\n result.crossed = true;\n result.straight = true;\n result.valid = true;\n\n return result;\n }\n\n result.direction = reflect(-view, half);\n } else {\n let eta = select(ior, 1.0 / ior, surface.front);\n let refracted = refract(-view, half, eta);\n // Past the critical angle refract() returns nothing, and everything reflects.\n let reflectance = select(fresnelDielectric(dot(view, half), eta), 1.0, all(refracted == vec3<f32>(0.0)));\n\n if (lobe >= reflectance) {\n result.direction = normalize(refracted);\n\n let no = -dot(normal, result.direction);\n\n if (no <= 0.0) {\n return result;\n }\n\n result.weight = vec3<f32>(ggxMasking(alpha2, no)) * select(vec3<f32>(1.0), surface.albedo, surface.front);\n result.crossed = true;\n result.valid = true;\n\n return result;\n }\n\n result.direction = reflect(-view, half);\n }\n\n let nl = dot(normal, result.direction);\n\n if (nl <= 0.0) {\n return result;\n }\n\n result.weight = vec3<f32>(ggxMasking(alpha2, nl));\n result.valid = true;\n\n return result;\n}\n\n/** A half vector around the normal distributed as cos^s, which is the Blinn-Phong lobe's own shape. */\nfn sampleBlinnPhongHalf(normal: vec3<f32>, shininess: f32, u: vec2<f32>) -> vec3<f32> {\n let cosine = pow(u.x, 1.0 / (shininess + 1.0));\n let sine = sqrt(max(0.0, 1.0 - cosine * cosine));\n let angle = 2.0 * PI * u.y;\n\n return normalize(orthonormalBasis(normal) * vec3<f32>(sine * cos(angle), sine * sin(angle), cosine));\n}\n\n/** Which way the path carries on, and what its throughput is multiplied by. */\nfn sampleBsdf(surface: Surface, view: vec3<f32>, lobe: f32, u: vec2<f32>) -> BsdfSample {\n let normal = surface.normal;\n var result: BsdfSample;\n result.valid = false;\n result.weight = vec3<f32>(0.0);\n result.pdf = 0.0;\n result.diffuse = true;\n\n if (dot(normal, view) <= 0.0) {\n return result;\n }\n\n // Lambert, and the bounce of a toon surface: Three lights a toon surface's indirect light with a plain Lambert term.\n if ((surface.flags & MATERIAL_PBR) == 0u && surface.kind != KIND_PHONG) {\n result.direction = cosineDirection(normal, u);\n // The cosine weight cancels the Lambert cosine exactly, which leaves the albedo alone.\n result.weight = surface.albedo;\n result.pdf = max(dot(normal, result.direction), 0.0) / PI;\n result.valid = result.pdf > 0.0;\n\n return result;\n }\n\n let weights = lobeWeights(surface, view);\n\n result.diffuse = lobe < weights.x;\n\n if (lobe < weights.x) {\n result.direction = cosineDirection(normal, u);\n } else if (surface.kind == KIND_PHONG) {\n result.direction = reflect(-view, sampleBlinnPhongHalf(normal, surface.shininess, u));\n } else if (lobe < weights.x + weights.y) {\n let basis = specularBasis(surface);\n // The lobe is drawn in its own frame, so the view direction goes into that frame and the result comes back out.\n let localView = vec3<f32>(dot(view, basis[0]), dot(view, basis[1]), dot(view, normal));\n let localHalf = sampleVisibleNormal(localView, specularAlphas(surface), u);\n let half = basis * localHalf;\n\n result.direction = reflect(-view, half);\n } else {\n let coatNormal = surface.clearcoatNormal;\n let basis = orthonormalBasis(coatNormal);\n let alpha = max(surface.clearcoatRoughness * surface.clearcoatRoughness, 1e-4);\n let localView = vec3<f32>(dot(view, basis[0]), dot(view, basis[1]), dot(view, coatNormal));\n let half = basis * sampleVisibleNormal(localView, vec2<f32>(alpha), u);\n\n result.direction = reflect(-view, half);\n }\n\n let evaluated = evaluateBsdf(surface, view, result.direction);\n\n if (evaluated.pdf <= 0.0 || all(evaluated.value <= vec3<f32>(0.0))) {\n return result;\n }\n\n result.pdf = evaluated.pdf;\n result.weight = evaluated.value / evaluated.pdf;\n result.valid = true;\n\n return result;\n}\n\n/**\n * Only the diffuse part of evaluateBsdf, times the cosine: what of the light from this direction the denoiser counts\n * as diffuse. The rest of the value is specular.\n */\nfn diffuseValue(surface: Surface, view: vec3<f32>, light: vec3<f32>) -> vec3<f32> {\n let normal = surface.normal;\n let nl = dot(normal, light);\n let nv = max(dot(normal, view), 1e-4);\n\n if (surface.kind == KIND_TOON) {\n return surface.albedo / PI * toonRamp(surface.gradientMap, nl);\n }\n\n if (nl <= 0.0) {\n return vec3<f32>(0.0);\n }\n\n if ((surface.flags & MATERIAL_PBR) == 0u) {\n return surface.albedo / PI * nl;\n }\n\n var diffuse = surface.albedo * (1.0 - surface.metalness) / PI;\n\n if (any(surface.sheenColor > vec3<f32>(0.0))) {\n diffuse = diffuse * (1.0 - max3(surface.sheenColor)\n * max(sheenAlbedo(nv, surface.sheenRoughness), sheenAlbedo(nl, surface.sheenRoughness)));\n }\n\n return diffuse * nl * coatTransmittance(surface, view);\n}\n\n/** How much of the light a surface's specular lobes reflect in all, seen from this view: what that signal is divided by. */\nfn specularAlbedo(surface: Surface, view: vec3<f32>) -> vec3<f32> {\n let nv = clamp(dot(surface.normal, view), 0.0, 1.0);\n\n if (surface.kind == KIND_PHONG) {\n return surface.specularColor * surface.specularStrength;\n }\n\n if ((surface.flags & MATERIAL_PBR) == 0u) {\n return vec3<f32>(0.0);\n }\n\n let dfg = dfgApprox(surface.roughness, nv);\n var albedo = surfaceF0(surface) * dfg.x + vec3<f32>(surface.specularF90 * dfg.y);\n\n if (surface.clearcoat > 0.0) {\n let coatDfg = dfgApprox(surface.clearcoatRoughness, clamp(dot(surface.clearcoatNormal, view), 0.0, 1.0));\n albedo = albedo * coatTransmittance(surface, view) + vec3<f32>(surface.clearcoat * (0.04 * coatDfg.x + coatDfg.y));\n }\n\n // What crosses a transmissive surface is the specular signal too, and it is not filtered by any colour of the surface.\n return mix(albedo, vec3<f32>(1.0), clamp(surface.transmission, 0.0, 1.0));\n}\n";
|
|
13
|
+
//# sourceMappingURL=bsdf.wgsl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bsdf.wgsl.d.ts","sourceRoot":"","sources":["../../src/wgsl/bsdf.wgsl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,s8tBA8lBrB,CAAC"}
|