@zephyr3d/scene 0.9.17 → 0.9.19
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/animation/joint_dynamics/collision.js +8 -6
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/morphtargetgrouptrack.js +11 -3
- package/dist/animation/morphtargetgrouptrack.js.map +1 -1
- package/dist/app/scriptregistry.js +124 -6
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/index.d.ts +270 -7
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +11 -5
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mtoon.js +20 -2
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/shader/helper.js +21 -8
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/skin.js +4 -6
- package/dist/material/skin.js.map +1 -1
- package/dist/material/water.js +1 -1
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +177 -29
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +111 -204
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/motionblur.js +3 -0
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +79 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/skinsss.js +10 -10
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssr.js +247 -16
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/taa.js +121 -19
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +6 -6
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -1
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/envlight.js +6 -3
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/hzb.js +11 -4
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +7 -15
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/renderer.js +4 -3
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +78 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -0
- package/dist/render/rendergraph/executor.js +41 -11
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +495 -201
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/rendergraph.js +29 -0
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/scene/light.js +146 -146
- package/dist/scene/light.js.map +1 -1
- package/dist/shaders/ssr.js +52 -21
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shadow/shadowmapper.js +95 -95
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/utility/misc.js +10 -1
- package/dist/utility/misc.js.map +1 -1
- package/dist/utility/serialization/manager.js +2 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +36 -2
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/package.json +2 -2
package/dist/posteffect/bloom.js
CHANGED
|
@@ -73,6 +73,147 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
|
|
|
73
73
|
/** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */ requireDepthAttachment() {
|
|
74
74
|
return false;
|
|
75
75
|
}
|
|
76
|
+
/** {@inheritDoc AbstractPostEffect.setup}
|
|
77
|
+
*
|
|
78
|
+
* Native multi-pass implementation: prefilter, one pass per pyramid level
|
|
79
|
+
* (separable blur), one additive upsample pass per level, and a final
|
|
80
|
+
* compose pass. Pyramid sizes are computed at build time with the same math
|
|
81
|
+
* as {@link Bloom.apply}, so both paths produce identical results.
|
|
82
|
+
*/ setup(s) {
|
|
83
|
+
const { graph, ctx } = s;
|
|
84
|
+
const format = s.colorFormat;
|
|
85
|
+
// Mirror apply()'s runtime sizing math at build time.
|
|
86
|
+
const prefilterWidth = Math.max(s.width >> 1, 1);
|
|
87
|
+
const prefilterHeight = Math.max(s.height >> 1, 1);
|
|
88
|
+
const t = Math.max(2, this._downsampleLimit);
|
|
89
|
+
const levels = [];
|
|
90
|
+
{
|
|
91
|
+
let w = Math.max(t, prefilterWidth >> 1);
|
|
92
|
+
let h = Math.max(t, prefilterHeight >> 1);
|
|
93
|
+
let maxLevels = Math.max(this._maxDownsampleLevels, 1);
|
|
94
|
+
while((w >= t || h >= t) && maxLevels > 0){
|
|
95
|
+
levels.push({
|
|
96
|
+
width: w,
|
|
97
|
+
height: h
|
|
98
|
+
});
|
|
99
|
+
maxLevels--;
|
|
100
|
+
w = Math.max(1, w >> 1);
|
|
101
|
+
h = Math.max(1, h >> 1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (levels.length === 0) {
|
|
105
|
+
// Degenerate viewport: no pyramid possible, bloom contributes nothing.
|
|
106
|
+
return s.input;
|
|
107
|
+
}
|
|
108
|
+
// 1. Prefilter (threshold/knee) at half resolution.
|
|
109
|
+
const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder)=>{
|
|
110
|
+
builder.read(s.input);
|
|
111
|
+
for (const dep of s.dependencies){
|
|
112
|
+
builder.read(dep);
|
|
113
|
+
}
|
|
114
|
+
const out = builder.createTexture({
|
|
115
|
+
format,
|
|
116
|
+
sizeMode: 'absolute',
|
|
117
|
+
width: prefilterWidth,
|
|
118
|
+
height: prefilterHeight,
|
|
119
|
+
label: 'Bloom:prefilter'
|
|
120
|
+
});
|
|
121
|
+
builder.setExecute((rg)=>{
|
|
122
|
+
const device = ctx.device;
|
|
123
|
+
const inputTexture = rg.getTexture(s.input);
|
|
124
|
+
this._prepare(device, inputTexture);
|
|
125
|
+
device.pushDeviceStates();
|
|
126
|
+
try {
|
|
127
|
+
this.prefilter(device, inputTexture, rg.getTexture(out));
|
|
128
|
+
} finally{
|
|
129
|
+
device.popDeviceStates();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
return out;
|
|
133
|
+
});
|
|
134
|
+
// 2. Downsample pyramid: one pass per level (separable blur through a
|
|
135
|
+
// pass-local intermediate texture).
|
|
136
|
+
const levelHandles = [];
|
|
137
|
+
let sourceHandle = prefilterHandle;
|
|
138
|
+
for(let i = 0; i < levels.length; i++){
|
|
139
|
+
const level = levels[i];
|
|
140
|
+
const src = sourceHandle;
|
|
141
|
+
const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder)=>{
|
|
142
|
+
builder.read(src);
|
|
143
|
+
const middle = builder.createTexture({
|
|
144
|
+
format,
|
|
145
|
+
sizeMode: 'absolute',
|
|
146
|
+
width: level.width,
|
|
147
|
+
height: level.height,
|
|
148
|
+
label: `Bloom:downsample${i}:middle`
|
|
149
|
+
});
|
|
150
|
+
const out = builder.createTexture({
|
|
151
|
+
format,
|
|
152
|
+
sizeMode: 'absolute',
|
|
153
|
+
width: level.width,
|
|
154
|
+
height: level.height,
|
|
155
|
+
label: `Bloom:downsample${i}`
|
|
156
|
+
});
|
|
157
|
+
builder.setExecute((rg)=>{
|
|
158
|
+
const device = ctx.device;
|
|
159
|
+
device.pushDeviceStates();
|
|
160
|
+
try {
|
|
161
|
+
const middleTexture = rg.getTexture(middle);
|
|
162
|
+
this.blurH(device, rg.getTexture(src), middleTexture);
|
|
163
|
+
this.blurV(device, middleTexture, rg.getTexture(out));
|
|
164
|
+
} finally{
|
|
165
|
+
device.popDeviceStates();
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
return out;
|
|
169
|
+
});
|
|
170
|
+
levelHandles.push(levelHandle);
|
|
171
|
+
sourceHandle = levelHandle;
|
|
172
|
+
}
|
|
173
|
+
// 3. Upsample: additively blend each level into the level above (in-place
|
|
174
|
+
// write, so each pass produces a new version of the target texture).
|
|
175
|
+
for(let i = levels.length - 2; i >= 0; i--){
|
|
176
|
+
const src = levelHandles[i + 1];
|
|
177
|
+
const dst = levelHandles[i];
|
|
178
|
+
levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder)=>{
|
|
179
|
+
builder.read(src);
|
|
180
|
+
builder.read(dst);
|
|
181
|
+
const out = builder.write(dst);
|
|
182
|
+
builder.setExecute((rg)=>{
|
|
183
|
+
const device = ctx.device;
|
|
184
|
+
device.pushDeviceStates();
|
|
185
|
+
try {
|
|
186
|
+
this._prepare(device, rg.getTexture(src));
|
|
187
|
+
this.upsampleInto(device, rg.getTexture(src), rg.getTexture(out));
|
|
188
|
+
} finally{
|
|
189
|
+
device.popDeviceStates();
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
return out;
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
// 4. Compose: scene color + bloom * intensity.
|
|
196
|
+
const bloomHandle = levelHandles[0];
|
|
197
|
+
return graph.addPass('Bloom:Compose', (builder)=>{
|
|
198
|
+
builder.read(s.input);
|
|
199
|
+
builder.read(bloomHandle);
|
|
200
|
+
for (const dep of s.dependencies){
|
|
201
|
+
builder.read(dep);
|
|
202
|
+
}
|
|
203
|
+
const output = s.createOutput(builder);
|
|
204
|
+
builder.setExecute((rg)=>{
|
|
205
|
+
const device = ctx.device;
|
|
206
|
+
device.pushDeviceStates();
|
|
207
|
+
try {
|
|
208
|
+
device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);
|
|
209
|
+
this.finalCompose(device, rg.getTexture(s.input), rg.getTexture(bloomHandle));
|
|
210
|
+
} finally{
|
|
211
|
+
device.popDeviceStates();
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
return output.color;
|
|
215
|
+
});
|
|
216
|
+
}
|
|
76
217
|
/** {@inheritDoc AbstractPostEffect.apply} */ apply(ctx, inputColorTexture, _sceneDepthTexture, _srgbOutput) {
|
|
77
218
|
const device = ctx.device;
|
|
78
219
|
const downsampleTextures = [];
|
|
@@ -117,16 +258,43 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
|
|
|
117
258
|
this.drawFullscreenQuad();
|
|
118
259
|
}
|
|
119
260
|
/** @internal */ upsample(device, textures) {
|
|
261
|
+
for(let i = textures.length - 2; i >= 0; i--){
|
|
262
|
+
this.upsampleInto(device, textures[i + 1], textures[i]);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/** @internal */ upsampleInto(device, srcTexture, dstTexture) {
|
|
120
266
|
device.setProgram(Bloom._programUpsample);
|
|
121
267
|
device.setBindGroup(0, Bloom._bindgroupUpsample);
|
|
122
268
|
Bloom._bindgroupUpsample.setValue('flip', device.type === 'webgpu' ? 1 : 0);
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
269
|
+
Bloom._bindgroupUpsample.setTexture('tex', srcTexture);
|
|
270
|
+
device.setFramebuffer([
|
|
271
|
+
dstTexture
|
|
272
|
+
]);
|
|
273
|
+
this.drawFullscreenQuad(Bloom._renderStateAdditive);
|
|
274
|
+
}
|
|
275
|
+
/** @internal */ blurH(device, srcTexture, dstTexture) {
|
|
276
|
+
this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);
|
|
277
|
+
device.setFramebuffer([
|
|
278
|
+
dstTexture
|
|
279
|
+
]);
|
|
280
|
+
device.setProgram(Bloom._programDownsampleH);
|
|
281
|
+
device.setBindGroup(0, Bloom._bindgroupDownsampleH);
|
|
282
|
+
Bloom._bindgroupDownsampleH.setTexture('tex', srcTexture);
|
|
283
|
+
Bloom._bindgroupDownsampleH.setValue('invTexSize', this._invTexSize);
|
|
284
|
+
Bloom._bindgroupDownsampleH.setValue('flip', device.type === 'webgpu' ? 1 : 0);
|
|
285
|
+
this.drawFullscreenQuad();
|
|
286
|
+
}
|
|
287
|
+
/** @internal */ blurV(device, srcTexture, dstTexture) {
|
|
288
|
+
this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);
|
|
289
|
+
device.setFramebuffer([
|
|
290
|
+
dstTexture
|
|
291
|
+
]);
|
|
292
|
+
device.setProgram(Bloom._programDownsampleV);
|
|
293
|
+
device.setBindGroup(0, Bloom._bindgroupDownsampleV);
|
|
294
|
+
Bloom._bindgroupDownsampleV.setTexture('tex', srcTexture);
|
|
295
|
+
Bloom._bindgroupDownsampleV.setValue('invTexSize', this._invTexSize);
|
|
296
|
+
Bloom._bindgroupDownsampleV.setValue('flip', device.type === 'webgpu' ? 1 : 0);
|
|
297
|
+
this.drawFullscreenQuad();
|
|
130
298
|
}
|
|
131
299
|
/** @internal */ downsample(device, inputColorTexture, textures) {
|
|
132
300
|
const t = Math.max(2, this._downsampleLimit);
|
|
@@ -134,32 +302,12 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
|
|
|
134
302
|
let h = Math.max(t, inputColorTexture.height >> 1);
|
|
135
303
|
let maxLevels = Math.max(this._maxDownsampleLevels, 1);
|
|
136
304
|
let sourceTex = inputColorTexture;
|
|
137
|
-
Bloom._bindgroupDownsampleH.setValue('flip', device.type === 'webgpu' ? 1 : 0);
|
|
138
|
-
Bloom._bindgroupDownsampleV.setValue('flip', device.type === 'webgpu' ? 1 : 0);
|
|
139
305
|
while((w >= t || h >= t) && maxLevels > 0){
|
|
140
306
|
const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);
|
|
141
307
|
textures.push(tex);
|
|
142
308
|
const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);
|
|
143
|
-
|
|
144
|
-
this.
|
|
145
|
-
device.setFramebuffer([
|
|
146
|
-
texMiddle
|
|
147
|
-
]);
|
|
148
|
-
device.setProgram(Bloom._programDownsampleH);
|
|
149
|
-
device.setBindGroup(0, Bloom._bindgroupDownsampleH);
|
|
150
|
-
Bloom._bindgroupDownsampleH.setTexture('tex', sourceTex);
|
|
151
|
-
Bloom._bindgroupDownsampleH.setValue('invTexSize', this._invTexSize);
|
|
152
|
-
this.drawFullscreenQuad();
|
|
153
|
-
// vertical blur
|
|
154
|
-
this._invTexSize.setXY(1 / texMiddle.width, 1 / texMiddle.height);
|
|
155
|
-
device.setFramebuffer([
|
|
156
|
-
tex
|
|
157
|
-
]);
|
|
158
|
-
device.setProgram(Bloom._programDownsampleV);
|
|
159
|
-
device.setBindGroup(0, Bloom._bindgroupDownsampleV);
|
|
160
|
-
Bloom._bindgroupDownsampleV.setTexture('tex', texMiddle);
|
|
161
|
-
Bloom._bindgroupDownsampleV.setValue('invTexSize', this._invTexSize);
|
|
162
|
-
this.drawFullscreenQuad();
|
|
309
|
+
this.blurH(device, sourceTex, texMiddle);
|
|
310
|
+
this.blurV(device, texMiddle, tex);
|
|
163
311
|
maxLevels--;
|
|
164
312
|
w = Math.max(1, w >> 1);
|
|
165
313
|
h = Math.max(1, h >> 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet, Texture2D } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n this._layer = PostEffectLayer.transparent;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /** Bloom threshold */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, _srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex);\r\n this.downsample(device, colorTex, downsampleTextures);\r\n this.upsample(device, downsampleTextures);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0]);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(device: AbstractDevice, srcTexture: Texture2D, bloomTexture: Texture2D) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[]) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n Bloom._bindgroupUpsample!.setTexture('tex', textures[i + 1]);\r\n device.setFramebuffer([textures[i]]);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n // horizonal blur\r\n this._invTexSize.setXY(1 / sourceTex.width, 1 / sourceTex.height);\r\n device.setFramebuffer([texMiddle]);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', sourceTex);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n this.drawFullscreenQuad();\r\n\r\n // vertical blur\r\n this._invTexSize.setXY(1 / texMiddle.width, 1 / texMiddle.height);\r\n device.setFramebuffer([tex]);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', texMiddle);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n this.drawFullscreenQuad();\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n this.$outputs.outColor = pb.vec4(\r\n pb.add(this.srcSample.rgb, pb.mul(this.bloomSample.rgb, this.intensity)),\r\n 1\r\n );\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.p = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p.rgb, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$outputs.outColor = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_layer","PostEffectLayer","transparent","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","requireLinearDepthTexture","requireDepthAttachment","apply","ctx","inputColorTexture","_sceneDepthTexture","_srgbOutput","device","downsampleTextures","_prepare","pushDeviceStates","w","Math","max","width","h","height","colorTex","pool","fetchTemporalTexture2D","format","prefilter","downsample","upsample","popDeviceStates","finalCompose","tex","releaseTexture","srcTexture","rt","x","y","z","setFramebuffer","setProgram","setBindGroup","setTexture","setValue","type","drawFullscreenQuad","bloomTexture","getFramebuffer","textures","i","length","t","maxLevels","sourceTex","push","texMiddle","setXY","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","outColor","$l","srcSample","textureSampleLevel","bloomSample","rgb","name","createBindGroup","bindGroupLayouts","p","brightness","r","g","b","soft","clamp","contrib","div","sub","offsets","weights","invTexSize","sum","vec3","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet, Texture2D } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n this._layer = PostEffectLayer.transparent;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /** Bloom threshold */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(device, rg.getTexture<Texture2D>(src), rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n this.finalCompose(device, rg.getTexture<Texture2D>(s.input), rg.getTexture<Texture2D>(bloomHandle));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, _srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex);\r\n this.downsample(device, colorTex, downsampleTextures);\r\n this.upsample(device, downsampleTextures);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0]);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(device: AbstractDevice, srcTexture: Texture2D, bloomTexture: Texture2D) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i]);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n device.setFramebuffer([dstTexture]);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n this.$outputs.outColor = pb.vec4(\r\n pb.add(this.srcSample.rgb, pb.mul(this.bloomSample.rgb, this.intensity)),\r\n 1\r\n );\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.p = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p.rgb, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$outputs.outColor = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_layer","PostEffectLayer","transparent","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","ctx","format","colorFormat","prefilterWidth","Math","max","width","prefilterHeight","height","t","levels","w","h","maxLevels","push","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","i","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","finalCompose","color","apply","inputColorTexture","_sceneDepthTexture","_srgbOutput","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","drawFullscreenQuad","bloomTexture","textures","dstTexture","setXY","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","outColor","$l","srcSample","textureSampleLevel","bloomSample","rgb","name","createBindGroup","bindGroupLayouts","p","brightness","r","g","b","soft","clamp","contrib","div","sub","offsets","weights","invTexSize","sum","vec3","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
|