@yali-engine/render 0.0.0-stage → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bvh.d.ts +66 -0
- package/dist/bvh.js +493 -0
- package/dist/bvh.js.map +1 -0
- package/dist/camera.d.ts +34 -0
- package/dist/camera.js +66 -0
- package/dist/camera.js.map +1 -0
- package/dist/cluster-build.d.ts +46 -0
- package/dist/cluster-build.js +179 -0
- package/dist/cluster-build.js.map +1 -0
- package/dist/cluster-pages.d.ts +70 -0
- package/dist/cluster-pages.js +203 -0
- package/dist/cluster-pages.js.map +1 -0
- package/dist/cluster-stream.d.ts +83 -0
- package/dist/cluster-stream.js +226 -0
- package/dist/cluster-stream.js.map +1 -0
- package/dist/culled-draws.d.ts +30 -0
- package/dist/culled-draws.js +103 -0
- package/dist/culled-draws.js.map +1 -0
- package/dist/debug-lines.d.ts +51 -0
- package/dist/debug-lines.js +158 -0
- package/dist/debug-lines.js.map +1 -0
- package/dist/device-profile.d.ts +100 -0
- package/dist/device-profile.js +131 -0
- package/dist/device-profile.js.map +1 -0
- package/dist/device.d.ts +39 -0
- package/dist/device.js +79 -0
- package/dist/device.js.map +1 -0
- package/dist/environment.d.ts +60 -0
- package/dist/environment.js +204 -0
- package/dist/environment.js.map +1 -0
- package/dist/extract.d.ts +74 -0
- package/dist/extract.js +194 -0
- package/dist/extract.js.map +1 -0
- package/dist/frame-graph.d.ts +112 -0
- package/dist/frame-graph.js +226 -0
- package/dist/frame-graph.js.map +1 -0
- package/dist/gpu-health.d.ts +74 -0
- package/dist/gpu-health.js +106 -0
- package/dist/gpu-health.js.map +1 -0
- package/dist/gpu-timer.d.ts +26 -0
- package/dist/gpu-timer.js +93 -0
- package/dist/gpu-timer.js.map +1 -0
- package/dist/headless.d.ts +28 -0
- package/dist/headless.js +91 -0
- package/dist/headless.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/lights.d.ts +81 -0
- package/dist/lights.js +247 -0
- package/dist/lights.js.map +1 -0
- package/dist/matrix.d.ts +6 -0
- package/dist/matrix.js +59 -0
- package/dist/matrix.js.map +1 -0
- package/dist/meshes.d.ts +411 -0
- package/dist/meshes.js +545 -0
- package/dist/meshes.js.map +1 -0
- package/dist/meshlets-decoder.d.ts +20 -0
- package/dist/meshlets-decoder.js +47 -0
- package/dist/meshlets-decoder.js.map +1 -0
- package/dist/meshlets.d.ts +186 -0
- package/dist/meshlets.js +1040 -0
- package/dist/meshlets.js.map +1 -0
- package/dist/occlusion.d.ts +51 -0
- package/dist/occlusion.js +188 -0
- package/dist/occlusion.js.map +1 -0
- package/dist/pick-decoder.d.ts +19 -0
- package/dist/pick-decoder.js +45 -0
- package/dist/pick-decoder.js.map +1 -0
- package/dist/pick.d.ts +86 -0
- package/dist/pick.js +452 -0
- package/dist/pick.js.map +1 -0
- package/dist/pipeline-cache.d.ts +53 -0
- package/dist/pipeline-cache.js +96 -0
- package/dist/pipeline-cache.js.map +1 -0
- package/dist/post-options.d.ts +109 -0
- package/dist/post-options.js +23 -0
- package/dist/post-options.js.map +1 -0
- package/dist/post-shaders.gen.d.ts +40 -0
- package/dist/post-shaders.gen.js +43 -0
- package/dist/post-shaders.gen.js.map +1 -0
- package/dist/post.d.ts +101 -0
- package/dist/post.js +555 -0
- package/dist/post.js.map +1 -0
- package/dist/render-plugin.d.ts +239 -0
- package/dist/render-plugin.js +633 -0
- package/dist/render-plugin.js.map +1 -0
- package/dist/scene.d.ts +406 -0
- package/dist/scene.js +2005 -0
- package/dist/scene.js.map +1 -0
- package/dist/shaders.gen.d.ts +40 -0
- package/dist/shaders.gen.js +43 -0
- package/dist/shaders.gen.js.map +1 -0
- package/dist/shadows.d.ts +104 -0
- package/dist/shadows.js +227 -0
- package/dist/shadows.js.map +1 -0
- package/dist/staging-ring.d.ts +41 -0
- package/dist/staging-ring.js +125 -0
- package/dist/staging-ring.js.map +1 -0
- package/dist/textures.d.ts +165 -0
- package/dist/textures.js +361 -0
- package/dist/textures.js.map +1 -0
- package/dist/tonemap.d.ts +45 -0
- package/dist/tonemap.js +141 -0
- package/dist/tonemap.js.map +1 -0
- package/dist/viewport.d.ts +78 -0
- package/dist/viewport.js +130 -0
- package/dist/viewport.js.map +1 -0
- package/dist/webgl2/plugin.d.ts +40 -0
- package/dist/webgl2/plugin.js +190 -0
- package/dist/webgl2/plugin.js.map +1 -0
- package/dist/webgl2/program.d.ts +27 -0
- package/dist/webgl2/program.js +74 -0
- package/dist/webgl2/program.js.map +1 -0
- package/dist/webgl2/renderer.d.ts +128 -0
- package/dist/webgl2/renderer.js +976 -0
- package/dist/webgl2/renderer.js.map +1 -0
- package/dist/webgl2/shaders.glsl.gen.d.ts +27 -0
- package/dist/webgl2/shaders.glsl.gen.js +20 -0
- package/dist/webgl2/shaders.glsl.gen.js.map +1 -0
- package/dist/webgl2/textures.d.ts +11 -0
- package/dist/webgl2/textures.js +82 -0
- package/dist/webgl2/textures.js.map +1 -0
- package/dist/webgl2/webgl2.d.ts +1 -0
- package/dist/webgl2/webgl2.js +4 -0
- package/dist/webgl2/webgl2.js.map +1 -0
- package/dist/worker-mode.d.ts +85 -0
- package/dist/worker-mode.js +204 -0
- package/dist/worker-mode.js.map +1 -0
- package/package.json +47 -3
- package/README.md +0 -3
package/dist/post.js
ADDED
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
import { halton, invert4, mul4 } from "./matrix.js";
|
|
2
|
+
import { postBloom, postFxaa, postMotion, postTaa, postTaaPost } from "./post-shaders.gen.js";
|
|
3
|
+
import { POSITION_LAYOUT, SKIN_LAYOUT } from "./scene.js";
|
|
4
|
+
export { gradingDefaults, whiteBalance } from "./post-options.js";
|
|
5
|
+
export { halton, invert4 } from "./matrix.js";
|
|
6
|
+
const HDR = 'rgba16float';
|
|
7
|
+
/** RENDER_ATTACHMENT | TEXTURE_BINDING, as numbers: this module loads where `GPUTextureUsage` does not exist (Node, WebGL2). */
|
|
8
|
+
const TARGET = 0x10 | 0x04;
|
|
9
|
+
function linearSampler(device, label) {
|
|
10
|
+
return device.createSampler({ label, magFilter: 'linear', minFilter: 'linear', addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge' });
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The bloom chain: `levels` half-size downsamples of the HDR scene (the first Karis-weighted
|
|
14
|
+
* and thresholded), then upsamples back to half size, each adding the level below through a
|
|
15
|
+
* tent. The tone-mapping pass samples `output`.
|
|
16
|
+
*/
|
|
17
|
+
export class Bloom {
|
|
18
|
+
device;
|
|
19
|
+
levels;
|
|
20
|
+
intensity;
|
|
21
|
+
threshold;
|
|
22
|
+
knee;
|
|
23
|
+
radius;
|
|
24
|
+
#pipes;
|
|
25
|
+
#params;
|
|
26
|
+
#data = new Float32Array(4);
|
|
27
|
+
#sampler;
|
|
28
|
+
#groups = [];
|
|
29
|
+
#generation = -1;
|
|
30
|
+
constructor(device, o) {
|
|
31
|
+
this.device = device;
|
|
32
|
+
this.levels = Math.max(2, Math.min(8, Math.round(o.levels ?? 5)));
|
|
33
|
+
this.intensity = o.intensity ?? 0.6;
|
|
34
|
+
this.threshold = o.threshold ?? 1;
|
|
35
|
+
this.knee = o.knee ?? 0.5;
|
|
36
|
+
this.radius = o.radius ?? 1;
|
|
37
|
+
this.#params = device.createBuffer({ label: 'yali:bloom:params', size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
|
|
38
|
+
this.#sampler = linearSampler(device, 'yali:bloom');
|
|
39
|
+
}
|
|
40
|
+
async init(cache) {
|
|
41
|
+
const pipe = (fs) => cache.render({
|
|
42
|
+
label: `yali:bloom:${fs}`,
|
|
43
|
+
vertex: { shader: postBloom, entryPoint: 'vs' },
|
|
44
|
+
fragment: { shader: postBloom, entryPoint: fs, targets: [{ format: HDR }] },
|
|
45
|
+
primitive: { topology: 'triangle-list' },
|
|
46
|
+
});
|
|
47
|
+
const [prefilter, down, up] = await Promise.all([pipe('fs_prefilter'), pipe('fs_down'), pipe('fs_up')]);
|
|
48
|
+
this.#pipes = { prefilter, down, up };
|
|
49
|
+
}
|
|
50
|
+
/** The chain's top level, which the tone-mapping pass reads. */
|
|
51
|
+
get output() {
|
|
52
|
+
return 'post.bloom.up0';
|
|
53
|
+
}
|
|
54
|
+
/** Adds the chain's passes, reading `input` (the HDR scene). */
|
|
55
|
+
addPasses(graph, input) {
|
|
56
|
+
const n = this.levels;
|
|
57
|
+
const down = (i) => `post.bloom.down${i}`;
|
|
58
|
+
const up = (i) => (i === n - 1 ? down(n - 1) : `post.bloom.up${i}`);
|
|
59
|
+
// After TAA: halves of the output size (larger than the scene's when TAA upscales, ADR-0135).
|
|
60
|
+
for (let i = 0; i < n; i++)
|
|
61
|
+
graph.transientTexture(down(i), { format: HDR, usage: TARGET, scale: 1 / 2 ** (i + 1), output: true });
|
|
62
|
+
for (let i = 0; i < n - 1; i++)
|
|
63
|
+
graph.transientTexture(up(i), { format: HDR, usage: TARGET, scale: 1 / 2 ** (i + 1), output: true });
|
|
64
|
+
// Bind groups per pass, rebuilt when the graph reallocates: down 0..n-1, then up n-2..0.
|
|
65
|
+
const passes = [];
|
|
66
|
+
for (let i = 0; i < n; i++) {
|
|
67
|
+
const src = i === 0 ? input : down(i - 1);
|
|
68
|
+
passes.push({
|
|
69
|
+
name: `post.bloom.down${i}`,
|
|
70
|
+
reads: [src],
|
|
71
|
+
out: down(i),
|
|
72
|
+
pipe: () => (i === 0 ? this.#pipes.prefilter : this.#pipes.down),
|
|
73
|
+
entries: (v) => [
|
|
74
|
+
{ binding: 0, resource: v(src) },
|
|
75
|
+
{ binding: 1, resource: this.#sampler },
|
|
76
|
+
...(i === 0 ? [{ binding: 2, resource: { buffer: this.#params } }] : []),
|
|
77
|
+
],
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
for (let i = n - 2; i >= 0; i--) {
|
|
81
|
+
passes.push({
|
|
82
|
+
name: `post.bloom.up${i}`,
|
|
83
|
+
reads: [down(i), up(i + 1)],
|
|
84
|
+
out: up(i),
|
|
85
|
+
pipe: () => this.#pipes.up,
|
|
86
|
+
entries: (v) => [
|
|
87
|
+
{ binding: 0, resource: v(down(i)) },
|
|
88
|
+
{ binding: 1, resource: this.#sampler },
|
|
89
|
+
{ binding: 2, resource: { buffer: this.#params } },
|
|
90
|
+
{ binding: 3, resource: v(up(i + 1)) },
|
|
91
|
+
],
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
passes.forEach((p, k) => {
|
|
95
|
+
graph.addPass({
|
|
96
|
+
name: p.name,
|
|
97
|
+
kind: 'render',
|
|
98
|
+
reads: p.reads,
|
|
99
|
+
color: { target: p.out, clear: { r: 0, g: 0, b: 0, a: 1 } },
|
|
100
|
+
execute: (pass, ctx) => {
|
|
101
|
+
if (ctx.generation !== this.#generation) {
|
|
102
|
+
this.#groups = passes.map((q) => this.device.createBindGroup({ label: `yali:${q.name}`, layout: q.pipe().getBindGroupLayout(0), entries: q.entries((s) => ctx.view(s)) }));
|
|
103
|
+
this.#generation = ctx.generation;
|
|
104
|
+
}
|
|
105
|
+
if (k === 0) {
|
|
106
|
+
const d = this.#data;
|
|
107
|
+
if (d[0] !== this.threshold || d[1] !== this.knee || d[2] !== this.radius) {
|
|
108
|
+
d[0] = this.threshold;
|
|
109
|
+
d[1] = this.knee;
|
|
110
|
+
d[2] = this.radius;
|
|
111
|
+
this.device.queue.writeBuffer(this.#params, 0, d);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
pass.setPipeline(p.pipe());
|
|
115
|
+
pass.setBindGroup(0, this.#groups[k]);
|
|
116
|
+
pass.draw(3);
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
destroy() {
|
|
122
|
+
this.#params.destroy();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** FXAA over the tone-mapped image (`input`, encoded) into `output`. */
|
|
126
|
+
export class Fxaa {
|
|
127
|
+
device;
|
|
128
|
+
#format;
|
|
129
|
+
#pipeline;
|
|
130
|
+
#sampler;
|
|
131
|
+
#group = null;
|
|
132
|
+
#generation = -1;
|
|
133
|
+
constructor(device, format) {
|
|
134
|
+
this.device = device;
|
|
135
|
+
this.#format = format;
|
|
136
|
+
this.#sampler = linearSampler(device, 'yali:fxaa');
|
|
137
|
+
}
|
|
138
|
+
async init(cache) {
|
|
139
|
+
this.#pipeline = await cache.render({
|
|
140
|
+
label: 'yali:fxaa',
|
|
141
|
+
vertex: { shader: postFxaa, entryPoint: 'vs' },
|
|
142
|
+
fragment: { shader: postFxaa, entryPoint: 'fs', targets: [{ format: this.#format }] },
|
|
143
|
+
primitive: { topology: 'triangle-list' },
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
addPass(graph, input, output) {
|
|
147
|
+
graph.addPass({
|
|
148
|
+
name: 'post.fxaa',
|
|
149
|
+
kind: 'render',
|
|
150
|
+
reads: [input],
|
|
151
|
+
color: { target: output, clear: { r: 0, g: 0, b: 0, a: 1 } },
|
|
152
|
+
execute: (pass, ctx) => {
|
|
153
|
+
if (ctx.generation !== this.#generation || !this.#group) {
|
|
154
|
+
this.#group = this.device.createBindGroup({
|
|
155
|
+
label: 'yali:fxaa',
|
|
156
|
+
layout: this.#pipeline.getBindGroupLayout(0),
|
|
157
|
+
entries: [
|
|
158
|
+
{ binding: 0, resource: ctx.view(input) },
|
|
159
|
+
{ binding: 1, resource: this.#sampler },
|
|
160
|
+
],
|
|
161
|
+
});
|
|
162
|
+
this.#generation = ctx.generation;
|
|
163
|
+
}
|
|
164
|
+
pass.setPipeline(this.#pipeline);
|
|
165
|
+
pass.setBindGroup(0, this.#group);
|
|
166
|
+
pass.draw(3);
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** Jitter cycle length: Halton (2, 3), 8 samples. */
|
|
172
|
+
const JITTER_SAMPLES = 8;
|
|
173
|
+
/**
|
|
174
|
+
* Temporal anti-aliasing: owns two history targets it ping-pongs (`post.taa`, imported into
|
|
175
|
+
* the graph), jitters the camera (`jitter`, applied by the scene to its view-projection), and
|
|
176
|
+
* reprojects by depth and the camera's move.
|
|
177
|
+
*/
|
|
178
|
+
export class Taa {
|
|
179
|
+
device;
|
|
180
|
+
blend;
|
|
181
|
+
/**
|
|
182
|
+
* Sharpening after TAA (ADR-0119): 0 none to 1 strongest (live). Set before `init` to have the
|
|
183
|
+
* pass at all (with `motionBlur`); the history stays unsharpened, so it never accumulates.
|
|
184
|
+
*/
|
|
185
|
+
sharpen = 0;
|
|
186
|
+
/** Motion blur's shutter (ADR-0119): the share of each pixel's motion this frame it is smeared over, 0 to 1 (live; needs per-object motion). */
|
|
187
|
+
motionBlur = 0;
|
|
188
|
+
/** Motion blur's taps (live). */
|
|
189
|
+
blurSamples = 8;
|
|
190
|
+
#probeWant = null;
|
|
191
|
+
/**
|
|
192
|
+
* What the motion target held on the next frame (ADR-0124; a diagnostic, reads back from the GPU):
|
|
193
|
+
* pixels drawn into it, those moving more than a twentieth of a pixel, the largest move in pixels, and
|
|
194
|
+
* the drawn pixels' mean view depth (last frame's).
|
|
195
|
+
* Null without per-object motion (the camera path).
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* const m = await render.post.readMotion(); // { drawn: 18000, moving: 1200, maxPixels: 3.1, meanDepth: 7.4 }
|
|
199
|
+
*/
|
|
200
|
+
readMotion() {
|
|
201
|
+
if (!this.#scene)
|
|
202
|
+
return Promise.resolve(null);
|
|
203
|
+
return new Promise((resolve) => {
|
|
204
|
+
this.#probeWant = ({ buf, width, height, bpr }) => {
|
|
205
|
+
// After the frame's submit (this runs while it is being encoded); the map then waits for the GPU.
|
|
206
|
+
setTimeout(async () => {
|
|
207
|
+
await buf.mapAsync(GPUMapMode.READ);
|
|
208
|
+
const h = new Uint16Array(buf.getMappedRange());
|
|
209
|
+
let drawn = 0;
|
|
210
|
+
let moving = 0;
|
|
211
|
+
let maxPixels = 0;
|
|
212
|
+
let depth = 0;
|
|
213
|
+
for (let y = 0; y < height; y++) {
|
|
214
|
+
for (let x = 0; x < width; x++) {
|
|
215
|
+
const o = (y * bpr) / 2 + x * 4;
|
|
216
|
+
if (half(h[o + 3]) <= 0)
|
|
217
|
+
continue;
|
|
218
|
+
drawn++;
|
|
219
|
+
depth += half(h[o + 2]);
|
|
220
|
+
const px = Math.hypot(half(h[o]) * width, half(h[o + 1]) * height);
|
|
221
|
+
if (px > 0.05)
|
|
222
|
+
moving++;
|
|
223
|
+
if (px > maxPixels)
|
|
224
|
+
maxPixels = px;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
buf.destroy();
|
|
228
|
+
resolve({ drawn, moving, maxPixels, meanDepth: drawn ? depth / drawn : 0 });
|
|
229
|
+
}, 0);
|
|
230
|
+
};
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
#fx = null;
|
|
234
|
+
/** This frame's jitter in clip units (x, y), for the scene's view-projection. */
|
|
235
|
+
jitter = new Float32Array(2);
|
|
236
|
+
#pipeline;
|
|
237
|
+
#sampler;
|
|
238
|
+
#params;
|
|
239
|
+
#data = new ArrayBuffer(96);
|
|
240
|
+
#f32 = new Float32Array(this.#data);
|
|
241
|
+
#u32 = new Uint32Array(this.#data);
|
|
242
|
+
#textures = [];
|
|
243
|
+
#views = [];
|
|
244
|
+
#groups = [null, null];
|
|
245
|
+
#generation = -1;
|
|
246
|
+
#frame = 0;
|
|
247
|
+
#reset = true;
|
|
248
|
+
#prevVP = new Float64Array(16);
|
|
249
|
+
#prevEye = new Float64Array(3);
|
|
250
|
+
#inv = new Float64Array(16);
|
|
251
|
+
#out = new Float64Array(16);
|
|
252
|
+
#width = 0;
|
|
253
|
+
#height = 0;
|
|
254
|
+
/** Temporal upscaling (ADR-0135): the history is the output's size, reconstructed from a smaller scene. */
|
|
255
|
+
upscale;
|
|
256
|
+
constructor(device, blend = 0.1, upscale = false) {
|
|
257
|
+
this.device = device;
|
|
258
|
+
this.blend = blend;
|
|
259
|
+
this.upscale = upscale;
|
|
260
|
+
this.#sampler = linearSampler(device, 'yali:taa');
|
|
261
|
+
this.#params = device.createBuffer({ label: 'yali:taa:params', size: 96, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
|
|
262
|
+
this.#motionParams = device.createBuffer({ label: 'yali:motion:params', size: 144, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
|
|
263
|
+
this.#noMotion = device.createTexture({ label: 'yali:taa:noMotion', size: [1, 1], format: HDR, usage: GPUTextureUsage.TEXTURE_BINDING });
|
|
264
|
+
}
|
|
265
|
+
async init(cache) {
|
|
266
|
+
const motion = (skinned) => cache.render({
|
|
267
|
+
label: skinned ? 'yali:motion:skinned' : 'yali:motion',
|
|
268
|
+
vertex: { shader: postMotion, entryPoint: skinned ? 'vs_skinned' : 'vs', buffers: skinned ? [POSITION_LAYOUT, SKIN_LAYOUT] : [POSITION_LAYOUT] },
|
|
269
|
+
fragment: { shader: postMotion, entryPoint: 'fs', targets: [{ format: HDR }] },
|
|
270
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
271
|
+
depthStencil: { format: 'depth32float', depthWriteEnabled: true, depthCompare: 'greater' },
|
|
272
|
+
});
|
|
273
|
+
if (this.sharpen > 0 || this.motionBlur > 0) {
|
|
274
|
+
const pipeline = await cache.render({
|
|
275
|
+
label: 'yali:taa:post',
|
|
276
|
+
vertex: { shader: postTaaPost, entryPoint: 'vs' },
|
|
277
|
+
fragment: { shader: postTaaPost, entryPoint: 'fs', targets: [{ format: HDR }] },
|
|
278
|
+
primitive: { topology: 'triangle-list' },
|
|
279
|
+
});
|
|
280
|
+
this.#fx = { pipeline, params: this.device.createBuffer({ label: 'yali:taa:post', size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST }), data: new Float32Array(4), groups: [null, null], generation: -1 };
|
|
281
|
+
}
|
|
282
|
+
[this.#pipeline, this.#motionRigid, this.#motionSkinned] = await Promise.all([
|
|
283
|
+
cache.render({
|
|
284
|
+
label: 'yali:taa',
|
|
285
|
+
vertex: { shader: postTaa, entryPoint: 'vs' },
|
|
286
|
+
fragment: { shader: postTaa, entryPoint: 'fs', targets: [{ format: HDR }] },
|
|
287
|
+
primitive: { topology: 'triangle-list' },
|
|
288
|
+
}),
|
|
289
|
+
motion(false),
|
|
290
|
+
motion(true),
|
|
291
|
+
]);
|
|
292
|
+
}
|
|
293
|
+
// ── Per-object motion (ADR-0098): the scene's opaque instances drawn again, now and then ──
|
|
294
|
+
#scene = null;
|
|
295
|
+
#motionParams;
|
|
296
|
+
#motionData = new Float32Array(36);
|
|
297
|
+
#motionRigid;
|
|
298
|
+
#motionSkinned;
|
|
299
|
+
#motionGroups = null;
|
|
300
|
+
#motionKey = '';
|
|
301
|
+
#clusterMotion = null;
|
|
302
|
+
#noMotion;
|
|
303
|
+
#prevOrigin = new Float32Array(3);
|
|
304
|
+
#motionSeen = '';
|
|
305
|
+
#motionFrames = 0;
|
|
306
|
+
#origin = new Float32Array(3);
|
|
307
|
+
/** Draws per-object motion from `scene` (its GPU cull's storage path; elsewhere the camera's only). */
|
|
308
|
+
motionFrom(scene) {
|
|
309
|
+
if (scene.motionSupported)
|
|
310
|
+
this.#scene = scene;
|
|
311
|
+
}
|
|
312
|
+
/** Whether per-object motion is drawn. */
|
|
313
|
+
get motion() {
|
|
314
|
+
return !!this.#scene;
|
|
315
|
+
}
|
|
316
|
+
/** This frame's camera offset from the records' anchor (ADR-0075), as the scene uploads it. */
|
|
317
|
+
setOrigin(origin) {
|
|
318
|
+
for (let i = 0; i < 3; i++)
|
|
319
|
+
this.#origin[i] = origin[i];
|
|
320
|
+
}
|
|
321
|
+
/** Drops the history: the next frame starts over. */
|
|
322
|
+
reset() {
|
|
323
|
+
this.#reset = true;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Before the camera upload, each frame: sizes the history to the output (the render target's size
|
|
327
|
+
* unless upscaling, ADR-0135), picks this frame's jitter (in the render target's pixels) and computes
|
|
328
|
+
* the reprojection from the camera (unjittered) and its eye.
|
|
329
|
+
*/
|
|
330
|
+
prepare(camera, width, height, outputWidth = width, outputHeight = height) {
|
|
331
|
+
if (outputWidth !== this.#width || outputHeight !== this.#height) {
|
|
332
|
+
for (const t of this.#textures)
|
|
333
|
+
t.destroy();
|
|
334
|
+
this.#textures = [0, 1].map((i) => this.device.createTexture({ label: `yali:taa:history${i}`, size: [outputWidth, outputHeight], format: HDR, usage: TARGET }));
|
|
335
|
+
this.#views = this.#textures.map((t) => t.createView());
|
|
336
|
+
this.#groups = [null, null];
|
|
337
|
+
this.#width = outputWidth;
|
|
338
|
+
this.#height = outputHeight;
|
|
339
|
+
this.#reset = true;
|
|
340
|
+
}
|
|
341
|
+
this.#frame++;
|
|
342
|
+
// Upscaling needs more jitter phases to cover each output pixel: 8 × the area ratio (FSR 2's rule).
|
|
343
|
+
const up = outputWidth !== width || outputHeight !== height;
|
|
344
|
+
const phases = up ? Math.max(JITTER_SAMPLES, Math.ceil(JITTER_SAMPLES * ((outputWidth * outputHeight) / (width * height)))) : JITTER_SAMPLES;
|
|
345
|
+
const s = (this.#frame % phases) + 1;
|
|
346
|
+
this.jitter[0] = ((halton(s, 2) - 0.5) * 2) / width;
|
|
347
|
+
this.jitter[1] = ((halton(s, 3) - 0.5) * 2) / height;
|
|
348
|
+
// Where the jitter put each render pixel's sample, in its pixels (clip y is up, pixels down).
|
|
349
|
+
this.#f32[20] = (this.jitter[0] * width) / 2;
|
|
350
|
+
this.#f32[21] = (-this.jitter[1] * height) / 2;
|
|
351
|
+
this.#u32[22] = up ? 1 : 0;
|
|
352
|
+
// This frame's view-projection without the jitter (the scene adds it when it uploads).
|
|
353
|
+
const vp = camera.uniform;
|
|
354
|
+
const ok = invert4(vp, this.#inv);
|
|
355
|
+
// Last frame's clip of a point camera-relative now: translate by the eye's move (now − then).
|
|
356
|
+
const t = this.#out;
|
|
357
|
+
t.fill(0);
|
|
358
|
+
t[0] = t[5] = t[10] = t[15] = 1;
|
|
359
|
+
for (let i = 0; i < 3; i++)
|
|
360
|
+
t[12 + i] = camera.eye[i] - this.#prevEye[i];
|
|
361
|
+
const prevT = mul4(this.#prevVP, t, new Float64Array(16));
|
|
362
|
+
const reproject = mul4(prevT, this.#inv, this.#out);
|
|
363
|
+
this.#f32.set(reproject, 0);
|
|
364
|
+
this.#f32[16] = camera.near;
|
|
365
|
+
// Last frame's copies exist only after a frame with them: until then (and after they are
|
|
366
|
+
// recreated) the camera's motion only, not vectors against zeroed transforms.
|
|
367
|
+
const scene = this.#scene;
|
|
368
|
+
if (scene && scene.motionKey !== this.#motionSeen) {
|
|
369
|
+
this.#motionSeen = scene.motionKey;
|
|
370
|
+
this.#motionFrames = 0;
|
|
371
|
+
}
|
|
372
|
+
this.#u32[17] = scene && this.#motionFrames >= 2 ? 1 : 0;
|
|
373
|
+
this.#motionFrames++;
|
|
374
|
+
this.#f32[18] = this.blend;
|
|
375
|
+
this.#u32[19] = this.#reset || !ok ? 1 : 0;
|
|
376
|
+
this.device.queue.writeBuffer(this.#params, 0, this.#data);
|
|
377
|
+
if (this.#scene) {
|
|
378
|
+
// The motion pass: this frame's view-projection and last frame's (both unjittered), and
|
|
379
|
+
// last frame's origin (the records are relative to an anchor, ADR-0075).
|
|
380
|
+
const m = this.#motionData;
|
|
381
|
+
for (let i = 0; i < 16; i++)
|
|
382
|
+
m[i] = vp[i];
|
|
383
|
+
m.set(this.#prevVP, 16);
|
|
384
|
+
m.set(this.#prevOrigin, 32);
|
|
385
|
+
this.device.queue.writeBuffer(this.#motionParams, 0, m);
|
|
386
|
+
this.#prevOrigin.set(this.#origin);
|
|
387
|
+
}
|
|
388
|
+
for (let i = 0; i < 16; i++)
|
|
389
|
+
this.#prevVP[i] = vp[i];
|
|
390
|
+
for (let i = 0; i < 3; i++)
|
|
391
|
+
this.#prevEye[i] = camera.eye[i];
|
|
392
|
+
this.#reset = false;
|
|
393
|
+
}
|
|
394
|
+
/** The history target this frame writes. */
|
|
395
|
+
get #write() {
|
|
396
|
+
return this.#frame & 1;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Imports `post.taa` and adds the pass, reading `input` (the HDR scene) and `depth`; with
|
|
400
|
+
* sharpening or motion blur (ADR-0119), their pass after it. Returns the chain's next input.
|
|
401
|
+
*/
|
|
402
|
+
addPass(graph, input, depth) {
|
|
403
|
+
graph.importTexture('post.taa', () => this.#views[this.#write]);
|
|
404
|
+
const scene = this.#scene;
|
|
405
|
+
if (scene) {
|
|
406
|
+
// The clustered meshes' motion pipeline starts now, so a page awaiting the scene's pipelines awaits it too (ADR-0112).
|
|
407
|
+
scene.clusters?.prepareMotion(postMotion, HDR);
|
|
408
|
+
// Masked cut-outs' motion through their alpha test (ADR-0124), started now so goldens await it.
|
|
409
|
+
scene.prepareMaskMotion(HDR);
|
|
410
|
+
// COPY_SRC (0x01): `readMotion()` copies it out (ADR-0124).
|
|
411
|
+
graph.transientTexture('scene.motion', { format: HDR, usage: TARGET | 0x01 });
|
|
412
|
+
graph.transientTexture('motion.depth', { format: 'depth32float', usage: 0x10 });
|
|
413
|
+
graph.addPass({
|
|
414
|
+
name: 'scene.motion',
|
|
415
|
+
kind: 'render',
|
|
416
|
+
reads: [scene.occlusionActive ? 'scene.visible2' : 'scene.visible', ...scene.motionReads],
|
|
417
|
+
color: { target: 'scene.motion', clear: { r: 0, g: 0, b: 0, a: 0 } },
|
|
418
|
+
depth: { target: 'motion.depth', clear: 0 },
|
|
419
|
+
execute: (pass) => {
|
|
420
|
+
const r = scene.motionResources();
|
|
421
|
+
if (!r)
|
|
422
|
+
return;
|
|
423
|
+
if (!this.#motionGroups || this.#motionKey !== scene.motionKey) {
|
|
424
|
+
const entries = (skinned) => [
|
|
425
|
+
{ binding: 0, resource: { buffer: r.camera } },
|
|
426
|
+
{ binding: 1, resource: { buffer: r.instances } },
|
|
427
|
+
{ binding: 2, resource: { buffer: r.visible } },
|
|
428
|
+
{ binding: 3, resource: { buffer: r.prevInstances } },
|
|
429
|
+
{ binding: 4, resource: { buffer: this.#motionParams } },
|
|
430
|
+
...(skinned
|
|
431
|
+
? [{ binding: 5, resource: r.palette.createView() }, { binding: 6, resource: r.prevPalette.createView() }, { binding: 8, resource: { buffer: r.prevSkinnedPool } }]
|
|
432
|
+
: [{ binding: 7, resource: { buffer: r.prevPool } }]),
|
|
433
|
+
];
|
|
434
|
+
// The clustered meshes redraw the clusters the view drew, with this shader (ADR-0112).
|
|
435
|
+
this.#clusterMotion = { shader: postMotion, entries: entries(false), key: scene.motionKey, format: HDR };
|
|
436
|
+
this.#motionGroups = [
|
|
437
|
+
this.device.createBindGroup({ label: 'yali:motion', layout: this.#motionRigid.getBindGroupLayout(0), entries: entries(false) }),
|
|
438
|
+
this.device.createBindGroup({ label: 'yali:motion:skinned', layout: this.#motionSkinned.getBindGroupLayout(0), entries: entries(true) }),
|
|
439
|
+
];
|
|
440
|
+
this.#motionKey = scene.motionKey;
|
|
441
|
+
}
|
|
442
|
+
scene.encodeMotion(pass, [this.#motionRigid, this.#motionGroups[0]], [this.#motionSkinned, this.#motionGroups[1]], this.#clusterMotion ?? undefined, this.#motionParams);
|
|
443
|
+
},
|
|
444
|
+
});
|
|
445
|
+
// `readMotion()`: the motion target copied out on the frame after a request (a diagnostic, ADR-0124).
|
|
446
|
+
graph.addPass({
|
|
447
|
+
name: 'post.motionProbe',
|
|
448
|
+
kind: 'encoder',
|
|
449
|
+
reads: ['scene.motion'],
|
|
450
|
+
writes: ['post.motionProbe'],
|
|
451
|
+
execute: (encoder, ctx) => {
|
|
452
|
+
const want = this.#probeWant;
|
|
453
|
+
if (!want)
|
|
454
|
+
return;
|
|
455
|
+
this.#probeWant = null;
|
|
456
|
+
const tex = ctx.texture('scene.motion');
|
|
457
|
+
const bpr = Math.ceil((tex.width * 8) / 256) * 256;
|
|
458
|
+
const buf = this.device.createBuffer({ label: 'yali:motion:probe', size: bpr * tex.height, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST });
|
|
459
|
+
encoder.copyTextureToBuffer({ texture: tex }, { buffer: buf, bytesPerRow: bpr }, [tex.width, tex.height]);
|
|
460
|
+
want({ buf, width: tex.width, height: tex.height, bpr });
|
|
461
|
+
},
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
graph.addPass({
|
|
465
|
+
name: 'post.taa',
|
|
466
|
+
kind: 'render',
|
|
467
|
+
reads: scene ? [input, depth, 'scene.motion', 'post.motionProbe'] : [input, depth],
|
|
468
|
+
color: { target: 'post.taa', clear: { r: 0, g: 0, b: 0, a: 1 } },
|
|
469
|
+
execute: (pass, ctx) => {
|
|
470
|
+
if (ctx.generation !== this.#generation) {
|
|
471
|
+
this.#groups = [null, null];
|
|
472
|
+
this.#generation = ctx.generation;
|
|
473
|
+
}
|
|
474
|
+
const w = this.#write;
|
|
475
|
+
if (!this.#groups[w]) {
|
|
476
|
+
this.#groups[w] = this.device.createBindGroup({
|
|
477
|
+
label: `yali:taa${w}`,
|
|
478
|
+
layout: this.#pipeline.getBindGroupLayout(0),
|
|
479
|
+
entries: [
|
|
480
|
+
{ binding: 0, resource: ctx.view(input) },
|
|
481
|
+
{ binding: 1, resource: this.#views[1 - w] },
|
|
482
|
+
{ binding: 2, resource: ctx.view(depth) },
|
|
483
|
+
{ binding: 3, resource: this.#sampler },
|
|
484
|
+
{ binding: 4, resource: { buffer: this.#params } },
|
|
485
|
+
{ binding: 5, resource: scene ? ctx.view('scene.motion') : this.#noMotion.createView() },
|
|
486
|
+
],
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
pass.setPipeline(this.#pipeline);
|
|
490
|
+
pass.setBindGroup(0, this.#groups[w]);
|
|
491
|
+
pass.draw(3);
|
|
492
|
+
},
|
|
493
|
+
});
|
|
494
|
+
const fx = this.#fx;
|
|
495
|
+
if (!fx)
|
|
496
|
+
return 'post.taa';
|
|
497
|
+
graph.transientTexture('post.taafx', { format: HDR, usage: TARGET, output: true });
|
|
498
|
+
graph.addPass({
|
|
499
|
+
name: 'post.taafx',
|
|
500
|
+
kind: 'render',
|
|
501
|
+
reads: scene ? ['post.taa', 'scene.motion'] : ['post.taa'],
|
|
502
|
+
color: { target: 'post.taafx', clear: { r: 0, g: 0, b: 0, a: 1 } },
|
|
503
|
+
execute: (pass, ctx) => {
|
|
504
|
+
if (ctx.generation !== fx.generation) {
|
|
505
|
+
fx.groups = [null, null];
|
|
506
|
+
fx.generation = ctx.generation;
|
|
507
|
+
}
|
|
508
|
+
const w = this.#write;
|
|
509
|
+
fx.groups[w] ??= this.device.createBindGroup({
|
|
510
|
+
label: `yali:taa:post${w}`,
|
|
511
|
+
layout: fx.pipeline.getBindGroupLayout(0),
|
|
512
|
+
entries: [
|
|
513
|
+
{ binding: 0, resource: this.#views[w] },
|
|
514
|
+
{ binding: 1, resource: scene ? ctx.view('scene.motion') : this.#noMotion.createView() },
|
|
515
|
+
{ binding: 2, resource: this.#sampler },
|
|
516
|
+
{ binding: 3, resource: { buffer: fx.params } },
|
|
517
|
+
],
|
|
518
|
+
});
|
|
519
|
+
const d = fx.data;
|
|
520
|
+
d[0] = Math.max(0, Math.min(1, this.sharpen));
|
|
521
|
+
d[1] = Math.max(0, Math.min(1, this.motionBlur));
|
|
522
|
+
d[2] = Math.max(2, Math.min(32, Math.round(this.blurSamples)));
|
|
523
|
+
// The vectors exist once the motion pass has last frame's copies (as TAA's own check).
|
|
524
|
+
d[3] = this.#u32[17];
|
|
525
|
+
this.device.queue.writeBuffer(fx.params, 0, d);
|
|
526
|
+
pass.setPipeline(fx.pipeline);
|
|
527
|
+
pass.setBindGroup(0, fx.groups[w]);
|
|
528
|
+
pass.draw(3);
|
|
529
|
+
},
|
|
530
|
+
});
|
|
531
|
+
return 'post.taafx';
|
|
532
|
+
}
|
|
533
|
+
get liveTextures() {
|
|
534
|
+
return this.#textures.length;
|
|
535
|
+
}
|
|
536
|
+
destroy() {
|
|
537
|
+
for (const t of this.#textures)
|
|
538
|
+
t.destroy();
|
|
539
|
+
this.#textures = [];
|
|
540
|
+
this.#params.destroy();
|
|
541
|
+
this.#motionParams.destroy();
|
|
542
|
+
this.#noMotion.destroy();
|
|
543
|
+
this.#fx?.params.destroy();
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
/** What `renderPlugin({ post: { passes } })` takes (ADR-0092). */
|
|
547
|
+
export const postPasses = { Bloom, Taa, Fxaa };
|
|
548
|
+
/** An IEEE half float's value. */
|
|
549
|
+
function half(h) {
|
|
550
|
+
const e = (h >> 10) & 0x1f;
|
|
551
|
+
const m = h & 0x3ff;
|
|
552
|
+
const v = e === 0 ? m * 2 ** -24 : e === 31 ? (m ? Number.NaN : Number.POSITIVE_INFINITY) : (1 + m / 1024) * 2 ** (e - 15);
|
|
553
|
+
return h & 0x8000 ? -v : v;
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=post.js.map
|
package/dist/post.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post.js","sourceRoot":"","sources":["../src/post.ts"],"names":[],"mappings":"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"}
|