@zephyr3d/scene 0.9.26 → 0.9.27
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/animationset.js +92 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/joint_dynamics/convex_collider.js +320 -0
- package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
- package/dist/animation/skeleton.js +21 -1
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/asset/model.js +6 -2
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +75 -23
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +4764 -3600
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/material.js +296 -296
- package/dist/material/material.js.map +1 -1
- package/dist/material/mixins/lit.js +33 -1
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/shader/helper.js +404 -3
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/water.js +2057 -72
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/motionblur.js +663 -58
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +46 -44
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/sss.js +30 -2
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/render/abuffer_oit.js +37 -37
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +156 -5
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cull_visitor.js +1 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +49 -49
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +3 -3
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +57 -15
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +127 -20
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +6 -3
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/render_queue.js +36 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +4 -0
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +1 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +318 -9
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/underwater.js +624 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/water_caustics.js +1380 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/weightedblended_oit.js +33 -33
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/water.js +540 -4
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/water.js +22 -19
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +56 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/shadow_region.js +49 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/utility/serialization/manager.js +3 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +31 -2
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +53 -25
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1101 -21
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/shprojector.js +87 -87
- package/dist/utility/shprojector.js.map +1 -1
- package/package.json +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +0 -41
- package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
- package/dist/shaders/ssgi.js +0 -63
- package/dist/shaders/ssgi.js.map +0 -1
- package/dist/shaders/ssgi_reprojection.js +0 -118
- package/dist/shaders/ssgi_reprojection.js.map +0 -1
|
@@ -6,19 +6,19 @@ import { tryGetApp } from '../app/api.js';
|
|
|
6
6
|
const DEPTH_FORMAT = 'rg32f';
|
|
7
7
|
const ACCUM_FORMAT = 'rgba16f';
|
|
8
8
|
const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
9
|
-
/**
|
|
10
|
-
* Dual depth peeling OIT renderer.
|
|
11
|
-
*
|
|
12
|
-
* @remarks
|
|
13
|
-
* This implementation follows the official dual depth peeling pass structure:
|
|
14
|
-
* an initialization pass writes the nearest/farthest transparent depth pair, then
|
|
15
|
-
* each peel pass ping-pongs the depth pair while accumulating front and back colors.
|
|
16
|
-
*
|
|
17
|
-
* It requires MRT, per-target blending, min/max blend equations and blendable
|
|
18
|
-
* floating-point color targets. If those capabilities are missing, supportDevice()
|
|
19
|
-
* returns false and the transparent pass falls back to sorted alpha blending.
|
|
20
|
-
*
|
|
21
|
-
* @public
|
|
9
|
+
/**
|
|
10
|
+
* Dual depth peeling OIT renderer.
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* This implementation follows the official dual depth peeling pass structure:
|
|
14
|
+
* an initialization pass writes the nearest/farthest transparent depth pair, then
|
|
15
|
+
* each peel pass ping-pongs the depth pair while accumulating front and back colors.
|
|
16
|
+
*
|
|
17
|
+
* It requires MRT, per-target blending, min/max blend equations and blendable
|
|
18
|
+
* floating-point color targets. If those capabilities are missing, supportDevice()
|
|
19
|
+
* returns false and the transparent pass falls back to sorted alpha blending.
|
|
20
|
+
*
|
|
21
|
+
* @public
|
|
22
22
|
*/ class DualDepthPeelingOIT extends OIT {
|
|
23
23
|
/** Type name of DualDepthPeelingOIT */ static type = 'ddp';
|
|
24
24
|
static DEPTH_CLEAR = new Vector4(-1, -1, -1, -1);
|
|
@@ -35,10 +35,10 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
35
35
|
_backTarget;
|
|
36
36
|
_framebuffers;
|
|
37
37
|
_device;
|
|
38
|
-
/**
|
|
39
|
-
* Creates an instance of DualDepthPeelingOIT.
|
|
40
|
-
*
|
|
41
|
-
* @param numPeels - Number of peel iterations after the initialization pass.
|
|
38
|
+
/**
|
|
39
|
+
* Creates an instance of DualDepthPeelingOIT.
|
|
40
|
+
*
|
|
41
|
+
* @param numPeels - Number of peel iterations after the initialization pass.
|
|
42
42
|
*/ constructor(numPeels = 8){
|
|
43
43
|
super();
|
|
44
44
|
this._numPeels = Math.max(1, Math.floor(numPeels || 0));
|
|
@@ -62,12 +62,12 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
62
62
|
set numPeels(val) {
|
|
63
63
|
this._numPeels = Math.max(1, Math.floor(val || 0));
|
|
64
64
|
}
|
|
65
|
-
/**
|
|
66
|
-
* Checks whether dual depth peeling can run with a capability snapshot.
|
|
67
|
-
*
|
|
68
|
-
* @param deviceType - The device type.
|
|
69
|
-
* @param caps - The device capabilities.
|
|
70
|
-
* @returns True if dual depth peeling is supported.
|
|
65
|
+
/**
|
|
66
|
+
* Checks whether dual depth peeling can run with a capability snapshot.
|
|
67
|
+
*
|
|
68
|
+
* @param deviceType - The device type.
|
|
69
|
+
* @param caps - The device capabilities.
|
|
70
|
+
* @returns True if dual depth peeling is supported.
|
|
71
71
|
*/ static supportDeviceCaps(deviceType, caps) {
|
|
72
72
|
const framebufferCaps = caps.framebufferCaps;
|
|
73
73
|
const textureCaps = caps.textureCaps;
|
|
@@ -76,29 +76,29 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
76
76
|
const webgl2OrBetter = deviceType !== 'webgl' || shaderCaps.maxUniformBufferSize > 0;
|
|
77
77
|
return webgl2OrBetter && framebufferCaps.maxDrawBuffers >= 3 && framebufferCaps.supportPerTargetBlending && framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE && miscCaps.supportBlendMinMax && textureCaps.supportHalfFloatColorBuffer && textureCaps.supportFloatColorBuffer && textureCaps.supportFloatBlending;
|
|
78
78
|
}
|
|
79
|
-
/**
|
|
80
|
-
* {@inheritDoc OIT.getType}
|
|
79
|
+
/**
|
|
80
|
+
* {@inheritDoc OIT.getType}
|
|
81
81
|
*/ getType() {
|
|
82
82
|
return DualDepthPeelingOIT.type;
|
|
83
83
|
}
|
|
84
|
-
/**
|
|
85
|
-
* {@inheritDoc OIT.supportDevice}
|
|
84
|
+
/**
|
|
85
|
+
* {@inheritDoc OIT.supportDevice}
|
|
86
86
|
*/ supportDevice(deviceType) {
|
|
87
87
|
const device = tryGetApp()?.device;
|
|
88
88
|
return !!device && device.type === deviceType && DualDepthPeelingOIT.supportDeviceCaps(deviceType, device.getDeviceCaps());
|
|
89
89
|
}
|
|
90
|
-
/**
|
|
91
|
-
* {@inheritDoc OIT.wantsPremultipliedAlpha}
|
|
90
|
+
/**
|
|
91
|
+
* {@inheritDoc OIT.wantsPremultipliedAlpha}
|
|
92
92
|
*/ wantsPremultipliedAlpha() {
|
|
93
93
|
return true;
|
|
94
94
|
}
|
|
95
|
-
/**
|
|
96
|
-
* {@inheritDoc OIT.wantsAdditiveLightPassAlpha}
|
|
95
|
+
/**
|
|
96
|
+
* {@inheritDoc OIT.wantsAdditiveLightPassAlpha}
|
|
97
97
|
*/ wantsAdditiveLightPassAlpha() {
|
|
98
98
|
return true;
|
|
99
99
|
}
|
|
100
|
-
/**
|
|
101
|
-
* {@inheritDoc OIT.begin}
|
|
100
|
+
/**
|
|
101
|
+
* {@inheritDoc OIT.begin}
|
|
102
102
|
*/ begin(ctx) {
|
|
103
103
|
this.releaseFramebuffers();
|
|
104
104
|
if (!ctx.depthTexture) {
|
|
@@ -108,8 +108,8 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
108
108
|
this.createFramebuffers(ctx);
|
|
109
109
|
return this._numPeels + 1;
|
|
110
110
|
}
|
|
111
|
-
/**
|
|
112
|
-
* {@inheritDoc OIT.end}
|
|
111
|
+
/**
|
|
112
|
+
* {@inheritDoc OIT.end}
|
|
113
113
|
*/ end(ctx) {
|
|
114
114
|
try {
|
|
115
115
|
if (this._frontTarget && this._backTarget) {
|
|
@@ -120,8 +120,8 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
120
120
|
this._hash = DualDepthPeelingOIT.type;
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
|
-
/**
|
|
124
|
-
* {@inheritDoc OIT.beginPass}
|
|
123
|
+
/**
|
|
124
|
+
* {@inheritDoc OIT.beginPass}
|
|
125
125
|
*/ beginPass(ctx, pass) {
|
|
126
126
|
this._currentPass = pass;
|
|
127
127
|
const targetIndex = pass & 1;
|
|
@@ -145,13 +145,13 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
145
145
|
], null, null);
|
|
146
146
|
return true;
|
|
147
147
|
}
|
|
148
|
-
/**
|
|
149
|
-
* {@inheritDoc OIT.endPass}
|
|
148
|
+
/**
|
|
149
|
+
* {@inheritDoc OIT.endPass}
|
|
150
150
|
*/ endPass(ctx, _pass) {
|
|
151
151
|
ctx.device.popDeviceStates();
|
|
152
152
|
}
|
|
153
|
-
/**
|
|
154
|
-
* {@inheritDoc OIT.setupFragmentOutput}
|
|
153
|
+
/**
|
|
154
|
+
* {@inheritDoc OIT.setupFragmentOutput}
|
|
155
155
|
*/ setupFragmentOutput(scope) {
|
|
156
156
|
const pb = scope.$builder;
|
|
157
157
|
scope.$outputs.Z_DDP_depth = pb.vec2();
|
|
@@ -161,8 +161,8 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
161
161
|
scope.Z_DDP_depthTexture = pb.tex2D().uniform(2).noSampler();
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
|
-
/**
|
|
165
|
-
* {@inheritDoc OIT.outputFragmentColor}
|
|
164
|
+
/**
|
|
165
|
+
* {@inheritDoc OIT.outputFragmentColor}
|
|
166
166
|
*/ outputFragmentColor(scope, color, ctx) {
|
|
167
167
|
const pb = scope.$builder;
|
|
168
168
|
scope.$outputs.Z_DDP_depth = pb.vec2(-1, -1);
|
|
@@ -193,20 +193,20 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
193
193
|
}
|
|
194
194
|
return true;
|
|
195
195
|
}
|
|
196
|
-
/**
|
|
197
|
-
* {@inheritDoc OIT.applyUniforms}
|
|
196
|
+
/**
|
|
197
|
+
* {@inheritDoc OIT.applyUniforms}
|
|
198
198
|
*/ applyUniforms(_ctx, bindGroup) {
|
|
199
199
|
if (this._currentPass > 0) {
|
|
200
200
|
bindGroup.setTexture('Z_DDP_depthTexture', this._depthTargets[this._currentPass & 1 ^ 1]);
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
|
-
/**
|
|
204
|
-
* {@inheritDoc OIT.calculateHash}
|
|
203
|
+
/**
|
|
204
|
+
* {@inheritDoc OIT.calculateHash}
|
|
205
205
|
*/ calculateHash() {
|
|
206
206
|
return this._hash;
|
|
207
207
|
}
|
|
208
|
-
/**
|
|
209
|
-
* {@inheritDoc OIT.setRenderStates}
|
|
208
|
+
/**
|
|
209
|
+
* {@inheritDoc OIT.setRenderStates}
|
|
210
210
|
*/ setRenderStates(rs) {
|
|
211
211
|
rs.useBlendingState().enable(false).enableAlphaToCoverage(false);
|
|
212
212
|
rs.useDepthState().enableTest(true).enableWrite(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualdepthpeeling_oit.js","sources":["../../src/render/dualdepthpeeling_oit.ts"],"sourcesContent":["import type {\n AbstractDevice,\n BindGroup,\n DeviceCaps,\n FrameBuffer,\n GPUProgram,\n PBGlobalScope,\n PBInsideFunctionScope,\n PBShaderExp,\n RenderStateSet,\n Texture2D,\n TextureFormat\n} from '@zephyr3d/device';\nimport type { Nullable } from '@zephyr3d/base';\nimport { DEPTH_FARTHEST, REVERSE_Z, Vector4 } from '@zephyr3d/base';\nimport { OIT } from './oit';\nimport type { DrawContext } from './drawable';\nimport { drawFullscreenQuad } from './fullscreenquad';\nimport { tryGetApp } from '../app/api';\n\nconst DEPTH_FORMAT: TextureFormat = 'rg32f';\nconst ACCUM_FORMAT: TextureFormat = 'rgba16f';\nconst COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;\n\n/**\n * Dual depth peeling OIT renderer.\n *\n * @remarks\n * This implementation follows the official dual depth peeling pass structure:\n * an initialization pass writes the nearest/farthest transparent depth pair, then\n * each peel pass ping-pongs the depth pair while accumulating front and back colors.\n *\n * It requires MRT, per-target blending, min/max blend equations and blendable\n * floating-point color targets. If those capabilities are missing, supportDevice()\n * returns false and the transparent pass falls back to sorted alpha blending.\n *\n * @public\n */\nexport class DualDepthPeelingOIT extends OIT {\n /** Type name of DualDepthPeelingOIT */\n public static readonly type = 'ddp';\n private static readonly DEPTH_CLEAR = new Vector4(-1, -1, -1, -1);\n private static readonly FRONT_CLEAR = new Vector4(0, 0, 0, 1);\n private static readonly BACK_CLEAR = new Vector4(0, 0, 0, 0);\n private static _compositeProgram: Nullable<GPUProgram> = null;\n private static _compositeBindGroup: Nullable<BindGroup> = null;\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\n private _numPeels: number;\n private _currentPass: number;\n private _hash: string;\n private _depthTargets: [Nullable<Texture2D>, Nullable<Texture2D>];\n private _frontTarget: Nullable<Texture2D>;\n private _backTarget: Nullable<Texture2D>;\n private _framebuffers: [Nullable<FrameBuffer>, Nullable<FrameBuffer>];\n private _device: Nullable<AbstractDevice>;\n\n /**\n * Creates an instance of DualDepthPeelingOIT.\n *\n * @param numPeels - Number of peel iterations after the initialization pass.\n */\n constructor(numPeels = 8) {\n super();\n this._numPeels = Math.max(1, Math.floor(numPeels || 0));\n this._currentPass = 0;\n this._hash = DualDepthPeelingOIT.type;\n this._depthTargets = [null, null];\n this._frontTarget = null;\n this._backTarget = null;\n this._framebuffers = [null, null];\n this._device = null;\n }\n\n /** Number of front/back peel iterations after the initialization pass. */\n get numPeels() {\n return this._numPeels;\n }\n set numPeels(val: number) {\n this._numPeels = Math.max(1, Math.floor(val || 0));\n }\n\n /**\n * Checks whether dual depth peeling can run with a capability snapshot.\n *\n * @param deviceType - The device type.\n * @param caps - The device capabilities.\n * @returns True if dual depth peeling is supported.\n */\n static supportDeviceCaps(deviceType: string, caps: DeviceCaps) {\n const framebufferCaps = caps.framebufferCaps;\n const textureCaps = caps.textureCaps;\n const shaderCaps = caps.shaderCaps;\n const miscCaps = caps.miscCaps;\n const webgl2OrBetter = deviceType !== 'webgl' || shaderCaps.maxUniformBufferSize > 0;\n return (\n webgl2OrBetter &&\n framebufferCaps.maxDrawBuffers >= 3 &&\n framebufferCaps.supportPerTargetBlending &&\n framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE &&\n miscCaps.supportBlendMinMax &&\n textureCaps.supportHalfFloatColorBuffer &&\n textureCaps.supportFloatColorBuffer &&\n textureCaps.supportFloatBlending\n );\n }\n\n /**\n * {@inheritDoc OIT.getType}\n */\n getType() {\n return DualDepthPeelingOIT.type;\n }\n\n /**\n * {@inheritDoc OIT.supportDevice}\n */\n supportDevice(deviceType: string) {\n const device = tryGetApp()?.device;\n return (\n !!device &&\n device.type === deviceType &&\n DualDepthPeelingOIT.supportDeviceCaps(deviceType, device.getDeviceCaps())\n );\n }\n\n /**\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\n */\n wantsPremultipliedAlpha() {\n return true;\n }\n\n /**\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\n */\n wantsAdditiveLightPassAlpha() {\n return true;\n }\n\n /**\n * {@inheritDoc OIT.begin}\n */\n begin(ctx: DrawContext) {\n this.releaseFramebuffers();\n if (!ctx.depthTexture) {\n return 0;\n }\n this._device = ctx.device;\n this.createFramebuffers(ctx);\n return this._numPeels + 1;\n }\n\n /**\n * {@inheritDoc OIT.end}\n */\n end(ctx: DrawContext) {\n try {\n if (this._frontTarget && this._backTarget) {\n this.composite(ctx, ctx.device, this._frontTarget, this._backTarget);\n }\n } finally {\n this.releaseFramebuffers();\n this._hash = DualDepthPeelingOIT.type;\n }\n }\n\n /**\n * {@inheritDoc OIT.beginPass}\n */\n beginPass(ctx: DrawContext, pass: number) {\n this._currentPass = pass;\n const targetIndex = pass & 1;\n const currentDepthTarget = this._depthTargets[targetIndex];\n const previousDepthTarget = this._depthTargets[targetIndex ^ 1];\n const framebuffer = this._framebuffers[targetIndex];\n if (!currentDepthTarget || !framebuffer || (pass > 0 && !previousDepthTarget)) {\n return false;\n }\n this._hash =\n pass === 0\n ? `${this.getType()}#init#${currentDepthTarget.uid}`\n : `${this.getType()}#peel#${previousDepthTarget!.uid}`;\n ctx.device.pushDeviceStates();\n ctx.device.setFramebuffer(framebuffer);\n ctx.device.clearFrameBuffer(\n pass === 0\n ? [DualDepthPeelingOIT.DEPTH_CLEAR, DualDepthPeelingOIT.FRONT_CLEAR, DualDepthPeelingOIT.BACK_CLEAR]\n : [DualDepthPeelingOIT.DEPTH_CLEAR, null, null],\n null,\n null\n );\n return true;\n }\n\n /**\n * {@inheritDoc OIT.endPass}\n */\n endPass(ctx: DrawContext, _pass: number) {\n ctx.device.popDeviceStates();\n }\n\n /**\n * {@inheritDoc OIT.setupFragmentOutput}\n */\n setupFragmentOutput(scope: PBGlobalScope) {\n const pb = scope.$builder;\n scope.$outputs.Z_DDP_depth = pb.vec2();\n scope.$outputs.Z_DDP_frontColor = pb.vec4();\n scope.$outputs.Z_DDP_backColor = pb.vec4();\n if (this._currentPass > 0) {\n scope.Z_DDP_depthTexture = pb.tex2D().uniform(2).noSampler();\n }\n }\n\n /**\n * {@inheritDoc OIT.outputFragmentColor}\n */\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext) {\n const pb = scope.$builder;\n scope.$outputs.Z_DDP_depth = pb.vec2(-1, -1);\n scope.$outputs.Z_DDP_frontColor = pb.vec4(0, 0, 0, 0);\n scope.$outputs.Z_DDP_backColor = pb.vec4(0, 0, 0, 0);\n // The peeling depth encoding is internal to this algorithm; normalize\n // device depth to standard orientation (0 = near) so the (-front, back)\n // encoding, the max/max blend extraction and the peel window logic stay\n // convention independent.\n scope.$l.Z_DDP_normDepth = REVERSE_Z\n ? pb.sub(1, scope.$builtins.fragCoord.z)\n : scope.$builtins.fragCoord.z;\n if (this._currentPass === 0) {\n scope.$outputs.Z_DDP_depth = pb.vec2(pb.neg(scope.Z_DDP_normDepth), scope.Z_DDP_normDepth);\n } else {\n scope.$l.Z_DDP_prevDepth = pb.textureLoad(\n scope.Z_DDP_depthTexture,\n pb.ivec2(scope.$builtins.fragCoord.xy),\n 0\n ).xy;\n scope.$l.Z_DDP_frontDepth = pb.neg(scope.Z_DDP_prevDepth.x);\n scope.$l.Z_DDP_backDepth = scope.Z_DDP_prevDepth.y;\n scope.$l.Z_DDP_curDepth = scope.Z_DDP_normDepth;\n scope.$l.Z_DDP_outputColor = pb.vec4(color.rgb, ctx.lightBlending ? pb.float(0) : color.a);\n scope\n .$if(\n pb.or(\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\n ),\n function () {\n pb.discard();\n }\n )\n .$elseif(\n pb.and(\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\n ),\n function () {\n this.$outputs.Z_DDP_depth = pb.vec2(pb.neg(this.Z_DDP_normDepth), this.Z_DDP_normDepth);\n }\n )\n .$elseif(\n pb.and(\n pb.lessThan(scope.Z_DDP_curDepth, pb.add(scope.Z_DDP_frontDepth, 0.000001)),\n pb.greaterThan(scope.Z_DDP_curDepth, pb.sub(scope.Z_DDP_frontDepth, 0.000001))\n ),\n function () {\n this.$outputs.Z_DDP_frontColor = this.Z_DDP_outputColor;\n }\n )\n .$else(function () {\n this.$outputs.Z_DDP_backColor = this.Z_DDP_outputColor;\n });\n }\n return true;\n }\n\n /**\n * {@inheritDoc OIT.applyUniforms}\n */\n applyUniforms(_ctx: DrawContext, bindGroup: BindGroup) {\n if (this._currentPass > 0) {\n bindGroup.setTexture('Z_DDP_depthTexture', this._depthTargets[(this._currentPass & 1) ^ 1]!);\n }\n }\n\n /**\n * {@inheritDoc OIT.calculateHash}\n */\n calculateHash() {\n return this._hash;\n }\n\n /**\n * {@inheritDoc OIT.setRenderStates}\n */\n setRenderStates(rs: RenderStateSet) {\n rs.useBlendingState().enable(false).enableAlphaToCoverage(false);\n rs.useDepthState().enableTest(true).enableWrite(false);\n\n rs.useTargetBlendingState(0)\n .enable(true)\n .enableAlphaToCoverage(false)\n .setBlendEquation('max', 'max')\n .setBlendFunc('one', 'one');\n\n rs.useTargetBlendingState(1)\n .enable(true)\n .enableAlphaToCoverage(false)\n .setBlendEquation('add', 'add')\n .setBlendFuncRGB('dst-alpha', 'one')\n .setBlendFuncAlpha('zero', 'inv-src-alpha');\n\n rs.useTargetBlendingState(2)\n .enable(true)\n .enableAlphaToCoverage(false)\n .setBlendEquation('add', 'add')\n .setBlendFuncRGB('one', 'inv-src-alpha')\n .setBlendFuncAlpha('one', 'inv-src-alpha');\n }\n\n /** @internal */\n private createFramebuffers(ctx: DrawContext) {\n const device = ctx.device;\n const width = ctx.depthTexture!.width;\n const height = ctx.depthTexture!.height;\n const depthTarget0 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\n const depthTarget1 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\n const frontTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\n const backTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\n const framebuffer0 = device.pool.createTemporalFramebuffer(\n false,\n [depthTarget0, frontTarget, backTarget],\n ctx.depthTexture\n );\n const framebuffer1 = device.pool.createTemporalFramebuffer(\n false,\n [depthTarget1, frontTarget, backTarget],\n ctx.depthTexture\n );\n device.pool.releaseTexture(depthTarget0);\n device.pool.releaseTexture(depthTarget1);\n device.pool.releaseTexture(frontTarget);\n device.pool.releaseTexture(backTarget);\n this._depthTargets = [depthTarget0, depthTarget1];\n this._frontTarget = frontTarget;\n this._backTarget = backTarget;\n this._framebuffers = [framebuffer0, framebuffer1];\n }\n\n /** @internal */\n private composite(ctx: DrawContext, device: AbstractDevice, frontTarget: Texture2D, backTarget: Texture2D) {\n const currentFramebuffer = device.getFramebuffer();\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\n const singleColorFramebuffer =\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\n ? device.pool.fetchTemporalFramebuffer(\n false,\n 0,\n 0,\n colorAttachment,\n currentFramebuffer.getDepthAttachment(),\n false\n )\n : null;\n if (singleColorFramebuffer) {\n const viewport = device.getViewport();\n const scissor = device.getScissor();\n device.pushDeviceStates();\n device.setFramebuffer(singleColorFramebuffer);\n device.setViewport(viewport);\n device.setScissor(scissor);\n }\n try {\n device.setProgram(DualDepthPeelingOIT.getCompositeProgram(device));\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('frontTex', frontTarget);\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('backTex', backTarget);\n device.setBindGroup(0, DualDepthPeelingOIT._compositeBindGroup!);\n drawFullscreenQuad(DualDepthPeelingOIT._compositeRenderStates!);\n } finally {\n if (singleColorFramebuffer) {\n device.popDeviceStates();\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\n }\n }\n }\n\n /** @internal */\n private releaseFramebuffers() {\n if (this._device) {\n if (this._framebuffers[0]) {\n this._device.pool.releaseFrameBuffer(this._framebuffers[0]);\n }\n if (this._framebuffers[1]) {\n this._device.pool.releaseFrameBuffer(this._framebuffers[1]);\n }\n }\n this._depthTargets = [null, null];\n this._frontTarget = null;\n this._backTarget = null;\n this._framebuffers = [null, null];\n this._device = null;\n }\n\n /** @internal */\n private static getCompositeProgram(device: AbstractDevice) {\n if (!this._compositeProgram) {\n this._compositeProgram = device.buildRenderProgram({\n vertex(pb) {\n this.$inputs.pos = pb.vec2().attrib('position');\n this.$outputs.uv = pb.vec2();\n pb.main(function () {\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\n if (device.type === 'webgpu') {\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\n }\n });\n },\n fragment(pb) {\n this.$outputs.outColor = pb.vec4();\n this.frontTex = pb.tex2D().uniform(0);\n this.backTex = pb.tex2D().uniform(0);\n pb.main(function () {\n this.$l.frontColor = pb.textureSample(this.frontTex, this.$inputs.uv);\n this.$l.backColor = pb.textureSample(this.backTex, this.$inputs.uv);\n this.$l.remainingAlpha = pb.clamp(pb.mul(this.frontColor.a, pb.sub(1, this.backColor.a)), 0, 1);\n this.$outputs.outColor = pb.vec4(\n pb.add(this.frontColor.rgb, pb.mul(this.frontColor.a, this.backColor.rgb)),\n this.remainingAlpha\n );\n });\n }\n })!;\n this._compositeProgram.name = '@DualDepthPeelingOIT_Composite';\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\n this._compositeRenderStates = device.createRenderStateSet();\n this._compositeRenderStates\n .useBlendingState()\n .enable(true)\n .setBlendFuncRGB('one', 'src-alpha')\n .setBlendFuncAlpha('zero', 'one');\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\n }\n return this._compositeProgram;\n }\n\n protected onDispose() {\n super.onDispose();\n this.releaseFramebuffers();\n }\n}\n"],"names":["DEPTH_FORMAT","ACCUM_FORMAT","COLOR_ATTACHMENT_BYTES_PER_SAMPLE","DualDepthPeelingOIT","OIT","type","DEPTH_CLEAR","Vector4","FRONT_CLEAR","BACK_CLEAR","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_numPeels","_currentPass","_hash","_depthTargets","_frontTarget","_backTarget","_framebuffers","_device","numPeels","Math","max","floor","val","supportDeviceCaps","deviceType","caps","framebufferCaps","textureCaps","shaderCaps","miscCaps","webgl2OrBetter","maxUniformBufferSize","maxDrawBuffers","supportPerTargetBlending","maxColorAttachmentBytesPerSample","supportBlendMinMax","supportHalfFloatColorBuffer","supportFloatColorBuffer","supportFloatBlending","getType","supportDevice","device","tryGetApp","getDeviceCaps","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","ctx","releaseFramebuffers","depthTexture","createFramebuffers","end","composite","beginPass","pass","targetIndex","currentDepthTarget","previousDepthTarget","framebuffer","uid","pushDeviceStates","setFramebuffer","clearFrameBuffer","endPass","_pass","popDeviceStates","setupFragmentOutput","scope","pb","$builder","$outputs","Z_DDP_depth","vec2","Z_DDP_frontColor","vec4","Z_DDP_backColor","Z_DDP_depthTexture","tex2D","uniform","noSampler","outputFragmentColor","color","$l","Z_DDP_normDepth","REVERSE_Z","sub","$builtins","fragCoord","z","neg","Z_DDP_prevDepth","textureLoad","ivec2","xy","Z_DDP_frontDepth","x","Z_DDP_backDepth","y","Z_DDP_curDepth","Z_DDP_outputColor","rgb","lightBlending","float","a","$if","or","lessThan","add","greaterThan","discard","$elseif","and","$else","applyUniforms","_ctx","bindGroup","setTexture","calculateHash","setRenderStates","rs","useBlendingState","enable","enableAlphaToCoverage","useDepthState","enableTest","enableWrite","useTargetBlendingState","setBlendEquation","setBlendFunc","setBlendFuncRGB","setBlendFuncAlpha","width","height","depthTarget0","pool","fetchTemporalTexture2D","depthTarget1","frontTarget","backTarget","framebuffer0","createTemporalFramebuffer","framebuffer1","releaseTexture","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","singleColorFramebuffer","length","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","buildRenderProgram","vertex","$inputs","pos","attrib","uv","main","position","DEPTH_FARTHEST","mul","fragment","outColor","frontTex","backTex","frontColor","textureSample","backColor","remainingAlpha","clamp","name","createBindGroup","bindGroupLayouts","createRenderStateSet","onDispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dualdepthpeeling_oit.js","sources":["../../src/render/dualdepthpeeling_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n DeviceCaps,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_FARTHEST, REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\nimport { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { tryGetApp } from '../app/api';\r\n\r\nconst DEPTH_FORMAT: TextureFormat = 'rg32f';\r\nconst ACCUM_FORMAT: TextureFormat = 'rgba16f';\r\nconst COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;\r\n\r\n/**\r\n * Dual depth peeling OIT renderer.\r\n *\r\n * @remarks\r\n * This implementation follows the official dual depth peeling pass structure:\r\n * an initialization pass writes the nearest/farthest transparent depth pair, then\r\n * each peel pass ping-pongs the depth pair while accumulating front and back colors.\r\n *\r\n * It requires MRT, per-target blending, min/max blend equations and blendable\r\n * floating-point color targets. If those capabilities are missing, supportDevice()\r\n * returns false and the transparent pass falls back to sorted alpha blending.\r\n *\r\n * @public\r\n */\r\nexport class DualDepthPeelingOIT extends OIT {\r\n /** Type name of DualDepthPeelingOIT */\r\n public static readonly type = 'ddp';\r\n private static readonly DEPTH_CLEAR = new Vector4(-1, -1, -1, -1);\r\n private static readonly FRONT_CLEAR = new Vector4(0, 0, 0, 1);\r\n private static readonly BACK_CLEAR = new Vector4(0, 0, 0, 0);\r\n private static _compositeProgram: Nullable<GPUProgram> = null;\r\n private static _compositeBindGroup: Nullable<BindGroup> = null;\r\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\r\n private _numPeels: number;\r\n private _currentPass: number;\r\n private _hash: string;\r\n private _depthTargets: [Nullable<Texture2D>, Nullable<Texture2D>];\r\n private _frontTarget: Nullable<Texture2D>;\r\n private _backTarget: Nullable<Texture2D>;\r\n private _framebuffers: [Nullable<FrameBuffer>, Nullable<FrameBuffer>];\r\n private _device: Nullable<AbstractDevice>;\r\n\r\n /**\r\n * Creates an instance of DualDepthPeelingOIT.\r\n *\r\n * @param numPeels - Number of peel iterations after the initialization pass.\r\n */\r\n constructor(numPeels = 8) {\r\n super();\r\n this._numPeels = Math.max(1, Math.floor(numPeels || 0));\r\n this._currentPass = 0;\r\n this._hash = DualDepthPeelingOIT.type;\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\r\n\r\n /** Number of front/back peel iterations after the initialization pass. */\r\n get numPeels() {\r\n return this._numPeels;\r\n }\r\n set numPeels(val: number) {\r\n this._numPeels = Math.max(1, Math.floor(val || 0));\r\n }\r\n\r\n /**\r\n * Checks whether dual depth peeling can run with a capability snapshot.\r\n *\r\n * @param deviceType - The device type.\r\n * @param caps - The device capabilities.\r\n * @returns True if dual depth peeling is supported.\r\n */\r\n static supportDeviceCaps(deviceType: string, caps: DeviceCaps) {\r\n const framebufferCaps = caps.framebufferCaps;\r\n const textureCaps = caps.textureCaps;\r\n const shaderCaps = caps.shaderCaps;\r\n const miscCaps = caps.miscCaps;\r\n const webgl2OrBetter = deviceType !== 'webgl' || shaderCaps.maxUniformBufferSize > 0;\r\n return (\r\n webgl2OrBetter &&\r\n framebufferCaps.maxDrawBuffers >= 3 &&\r\n framebufferCaps.supportPerTargetBlending &&\r\n framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE &&\r\n miscCaps.supportBlendMinMax &&\r\n textureCaps.supportHalfFloatColorBuffer &&\r\n textureCaps.supportFloatColorBuffer &&\r\n textureCaps.supportFloatBlending\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return DualDepthPeelingOIT.type;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(deviceType: string) {\r\n const device = tryGetApp()?.device;\r\n return (\r\n !!device &&\r\n device.type === deviceType &&\r\n DualDepthPeelingOIT.supportDeviceCaps(deviceType, device.getDeviceCaps())\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\r\n */\r\n wantsAdditiveLightPassAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(ctx: DrawContext) {\r\n this.releaseFramebuffers();\r\n if (!ctx.depthTexture) {\r\n return 0;\r\n }\r\n this._device = ctx.device;\r\n this.createFramebuffers(ctx);\r\n return this._numPeels + 1;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(ctx: DrawContext) {\r\n try {\r\n if (this._frontTarget && this._backTarget) {\r\n this.composite(ctx, ctx.device, this._frontTarget, this._backTarget);\r\n }\r\n } finally {\r\n this.releaseFramebuffers();\r\n this._hash = DualDepthPeelingOIT.type;\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, pass: number) {\r\n this._currentPass = pass;\r\n const targetIndex = pass & 1;\r\n const currentDepthTarget = this._depthTargets[targetIndex];\r\n const previousDepthTarget = this._depthTargets[targetIndex ^ 1];\r\n const framebuffer = this._framebuffers[targetIndex];\r\n if (!currentDepthTarget || !framebuffer || (pass > 0 && !previousDepthTarget)) {\r\n return false;\r\n }\r\n this._hash =\r\n pass === 0\r\n ? `${this.getType()}#init#${currentDepthTarget.uid}`\r\n : `${this.getType()}#peel#${previousDepthTarget!.uid}`;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(framebuffer);\r\n ctx.device.clearFrameBuffer(\r\n pass === 0\r\n ? [DualDepthPeelingOIT.DEPTH_CLEAR, DualDepthPeelingOIT.FRONT_CLEAR, DualDepthPeelingOIT.BACK_CLEAR]\r\n : [DualDepthPeelingOIT.DEPTH_CLEAR, null, null],\r\n null,\r\n null\r\n );\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, _pass: number) {\r\n ctx.device.popDeviceStates();\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.setupFragmentOutput}\r\n */\r\n setupFragmentOutput(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.$outputs.Z_DDP_depth = pb.vec2();\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4();\r\n scope.$outputs.Z_DDP_backColor = pb.vec4();\r\n if (this._currentPass > 0) {\r\n scope.Z_DDP_depthTexture = pb.tex2D().uniform(2).noSampler();\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext) {\r\n const pb = scope.$builder;\r\n scope.$outputs.Z_DDP_depth = pb.vec2(-1, -1);\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4(0, 0, 0, 0);\r\n scope.$outputs.Z_DDP_backColor = pb.vec4(0, 0, 0, 0);\r\n // The peeling depth encoding is internal to this algorithm; normalize\r\n // device depth to standard orientation (0 = near) so the (-front, back)\r\n // encoding, the max/max blend extraction and the peel window logic stay\r\n // convention independent.\r\n scope.$l.Z_DDP_normDepth = REVERSE_Z\r\n ? pb.sub(1, scope.$builtins.fragCoord.z)\r\n : scope.$builtins.fragCoord.z;\r\n if (this._currentPass === 0) {\r\n scope.$outputs.Z_DDP_depth = pb.vec2(pb.neg(scope.Z_DDP_normDepth), scope.Z_DDP_normDepth);\r\n } else {\r\n scope.$l.Z_DDP_prevDepth = pb.textureLoad(\r\n scope.Z_DDP_depthTexture,\r\n pb.ivec2(scope.$builtins.fragCoord.xy),\r\n 0\r\n ).xy;\r\n scope.$l.Z_DDP_frontDepth = pb.neg(scope.Z_DDP_prevDepth.x);\r\n scope.$l.Z_DDP_backDepth = scope.Z_DDP_prevDepth.y;\r\n scope.$l.Z_DDP_curDepth = scope.Z_DDP_normDepth;\r\n scope.$l.Z_DDP_outputColor = pb.vec4(color.rgb, ctx.lightBlending ? pb.float(0) : color.a);\r\n scope\r\n .$if(\r\n pb.or(\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n pb.discard();\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_depth = pb.vec2(pb.neg(this.Z_DDP_normDepth), this.Z_DDP_normDepth);\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.lessThan(scope.Z_DDP_curDepth, pb.add(scope.Z_DDP_frontDepth, 0.000001)),\r\n pb.greaterThan(scope.Z_DDP_curDepth, pb.sub(scope.Z_DDP_frontDepth, 0.000001))\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_frontColor = this.Z_DDP_outputColor;\r\n }\r\n )\r\n .$else(function () {\r\n this.$outputs.Z_DDP_backColor = this.Z_DDP_outputColor;\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(_ctx: DrawContext, bindGroup: BindGroup) {\r\n if (this._currentPass > 0) {\r\n bindGroup.setTexture('Z_DDP_depthTexture', this._depthTargets[(this._currentPass & 1) ^ 1]!);\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this._hash;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n rs.useBlendingState().enable(false).enableAlphaToCoverage(false);\r\n rs.useDepthState().enableTest(true).enableWrite(false);\r\n\r\n rs.useTargetBlendingState(0)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('max', 'max')\r\n .setBlendFunc('one', 'one');\r\n\r\n rs.useTargetBlendingState(1)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('dst-alpha', 'one')\r\n .setBlendFuncAlpha('zero', 'inv-src-alpha');\r\n\r\n rs.useTargetBlendingState(2)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('one', 'inv-src-alpha')\r\n .setBlendFuncAlpha('one', 'inv-src-alpha');\r\n }\r\n\r\n /** @internal */\r\n private createFramebuffers(ctx: DrawContext) {\r\n const device = ctx.device;\r\n const width = ctx.depthTexture!.width;\r\n const height = ctx.depthTexture!.height;\r\n const depthTarget0 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const depthTarget1 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const frontTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const backTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const framebuffer0 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget0, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n const framebuffer1 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget1, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n device.pool.releaseTexture(depthTarget0);\r\n device.pool.releaseTexture(depthTarget1);\r\n device.pool.releaseTexture(frontTarget);\r\n device.pool.releaseTexture(backTarget);\r\n this._depthTargets = [depthTarget0, depthTarget1];\r\n this._frontTarget = frontTarget;\r\n this._backTarget = backTarget;\r\n this._framebuffers = [framebuffer0, framebuffer1];\r\n }\r\n\r\n /** @internal */\r\n private composite(ctx: DrawContext, device: AbstractDevice, frontTarget: Texture2D, backTarget: Texture2D) {\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n const singleColorFramebuffer =\r\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n try {\r\n device.setProgram(DualDepthPeelingOIT.getCompositeProgram(device));\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('frontTex', frontTarget);\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('backTex', backTarget);\r\n device.setBindGroup(0, DualDepthPeelingOIT._compositeBindGroup!);\r\n drawFullscreenQuad(DualDepthPeelingOIT._compositeRenderStates!);\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n private releaseFramebuffers() {\r\n if (this._device) {\r\n if (this._framebuffers[0]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[0]);\r\n }\r\n if (this._framebuffers[1]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[1]);\r\n }\r\n }\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\r\n\r\n /** @internal */\r\n private static getCompositeProgram(device: AbstractDevice) {\r\n if (!this._compositeProgram) {\r\n this._compositeProgram = device.buildRenderProgram({\r\n vertex(pb) {\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, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\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.$outputs.outColor = pb.vec4();\r\n this.frontTex = pb.tex2D().uniform(0);\r\n this.backTex = pb.tex2D().uniform(0);\r\n pb.main(function () {\r\n this.$l.frontColor = pb.textureSample(this.frontTex, this.$inputs.uv);\r\n this.$l.backColor = pb.textureSample(this.backTex, this.$inputs.uv);\r\n this.$l.remainingAlpha = pb.clamp(pb.mul(this.frontColor.a, pb.sub(1, this.backColor.a)), 0, 1);\r\n this.$outputs.outColor = pb.vec4(\r\n pb.add(this.frontColor.rgb, pb.mul(this.frontColor.a, this.backColor.rgb)),\r\n this.remainingAlpha\r\n );\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@DualDepthPeelingOIT_Composite';\r\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\r\n this._compositeRenderStates = device.createRenderStateSet();\r\n this._compositeRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'src-alpha')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n return this._compositeProgram;\r\n }\r\n\r\n protected onDispose() {\r\n super.onDispose();\r\n this.releaseFramebuffers();\r\n }\r\n}\r\n"],"names":["DEPTH_FORMAT","ACCUM_FORMAT","COLOR_ATTACHMENT_BYTES_PER_SAMPLE","DualDepthPeelingOIT","OIT","type","DEPTH_CLEAR","Vector4","FRONT_CLEAR","BACK_CLEAR","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_numPeels","_currentPass","_hash","_depthTargets","_frontTarget","_backTarget","_framebuffers","_device","numPeels","Math","max","floor","val","supportDeviceCaps","deviceType","caps","framebufferCaps","textureCaps","shaderCaps","miscCaps","webgl2OrBetter","maxUniformBufferSize","maxDrawBuffers","supportPerTargetBlending","maxColorAttachmentBytesPerSample","supportBlendMinMax","supportHalfFloatColorBuffer","supportFloatColorBuffer","supportFloatBlending","getType","supportDevice","device","tryGetApp","getDeviceCaps","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","ctx","releaseFramebuffers","depthTexture","createFramebuffers","end","composite","beginPass","pass","targetIndex","currentDepthTarget","previousDepthTarget","framebuffer","uid","pushDeviceStates","setFramebuffer","clearFrameBuffer","endPass","_pass","popDeviceStates","setupFragmentOutput","scope","pb","$builder","$outputs","Z_DDP_depth","vec2","Z_DDP_frontColor","vec4","Z_DDP_backColor","Z_DDP_depthTexture","tex2D","uniform","noSampler","outputFragmentColor","color","$l","Z_DDP_normDepth","REVERSE_Z","sub","$builtins","fragCoord","z","neg","Z_DDP_prevDepth","textureLoad","ivec2","xy","Z_DDP_frontDepth","x","Z_DDP_backDepth","y","Z_DDP_curDepth","Z_DDP_outputColor","rgb","lightBlending","float","a","$if","or","lessThan","add","greaterThan","discard","$elseif","and","$else","applyUniforms","_ctx","bindGroup","setTexture","calculateHash","setRenderStates","rs","useBlendingState","enable","enableAlphaToCoverage","useDepthState","enableTest","enableWrite","useTargetBlendingState","setBlendEquation","setBlendFunc","setBlendFuncRGB","setBlendFuncAlpha","width","height","depthTarget0","pool","fetchTemporalTexture2D","depthTarget1","frontTarget","backTarget","framebuffer0","createTemporalFramebuffer","framebuffer1","releaseTexture","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","singleColorFramebuffer","length","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","buildRenderProgram","vertex","$inputs","pos","attrib","uv","main","position","DEPTH_FARTHEST","mul","fragment","outColor","frontTex","backTex","frontColor","textureSample","backColor","remainingAlpha","clamp","name","createBindGroup","bindGroupLayouts","createRenderStateSet","onDispose"],"mappings":"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"}
|
|
@@ -182,7 +182,7 @@ const MAX_NUM_OCTAVES = 16;
|
|
|
182
182
|
outAABB.minPoint.setXYZ(minX, y - maxHeight, minZ);
|
|
183
183
|
outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);
|
|
184
184
|
}
|
|
185
|
-
/** {@inheritDoc WaveGenerator.calcFragmentNormal} */ calcFragmentNormal(scope, xz) {
|
|
185
|
+
/** {@inheritDoc WaveGenerator.calcFragmentNormal} */ calcFragmentNormal(scope, xz, _vertexNormal) {
|
|
186
186
|
const pb = scope.$builder;
|
|
187
187
|
const that = this;
|
|
188
188
|
pb.func('calcFragmentNormal', [
|
|
@@ -193,8 +193,8 @@ const MAX_NUM_OCTAVES = 16;
|
|
|
193
193
|
});
|
|
194
194
|
return scope.calcFragmentNormal(xz);
|
|
195
195
|
}
|
|
196
|
-
/** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */ calcFragmentNormalAndFoam(scope, xz) {
|
|
197
|
-
return scope.$builder.vec4(this.calcFragmentNormal(scope, xz), 0);
|
|
196
|
+
/** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */ calcFragmentNormalAndFoam(scope, xz, _vertexNormal) {
|
|
197
|
+
return scope.$builder.vec4(this.calcFragmentNormal(scope, xz, _vertexNormal), 0);
|
|
198
198
|
}
|
|
199
199
|
/** {@inheritDoc WaveGenerator.setupUniforms} */ setupUniforms(scope, uniformGroup) {
|
|
200
200
|
const pb = scope.$builder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fbm_wavegenerator.js","sources":["../../src/render/fbm_wavegenerator.ts"],"sourcesContent":["import type { AABB, Immutable } from '@zephyr3d/base';\r\nimport { Disposable, Vector2 } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { valueNoise } from '../shaders';\r\nimport { ShaderHelper } from '../material';\r\n\r\nconst MAX_NUM_OCTAVES = 16;\r\n\r\n/**\r\n * FBM wave generator.\r\n * @public\r\n */\r\nexport class FBMWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private readonly _windVelocity: Vector2;\r\n private _numOctaves: number;\r\n private _amplitude: number;\r\n private _frequency: number;\r\n private readonly _lacunarity: number;\r\n private readonly _gain: number;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor() {\r\n super();\r\n this._version = 0;\r\n this._numOctaves = 4;\r\n this._windVelocity = new Vector2(0.1, 0);\r\n this._amplitude = 0.3;\r\n this._frequency = 3;\r\n this._lacunarity = 1.83;\r\n this._gain = 0.57;\r\n }\r\n clone() {\r\n const other = new FBMWaveGenerator();\r\n other.numOctaves = this.numOctaves;\r\n other.wind = this.wind;\r\n other.amplitude = this.amplitude;\r\n other.frequency = this.frequency;\r\n return other as this;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Number of octaves */\r\n get numOctaves() {\r\n return this._numOctaves;\r\n }\r\n set numOctaves(val) {\r\n if (val !== this.numOctaves) {\r\n this._numOctaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave amplitude */\r\n get amplitude() {\r\n return this._amplitude;\r\n }\r\n set amplitude(val) {\r\n if (val !== this._amplitude) {\r\n this._amplitude = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave frequency */\r\n get frequency() {\r\n return this._frequency;\r\n }\r\n set frequency(val) {\r\n if (val !== this._frequency) {\r\n this._frequency = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wind velocity */\r\n get wind(): Immutable<Vector2> {\r\n return this._windVelocity;\r\n }\r\n set wind(val: Immutable<Vector2>) {\r\n if (!val.equalsTo(this._windVelocity)) {\r\n this._windVelocity.set(val);\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n private calcWaveNormal(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n time: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveNormal';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.float('time'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.epsilon = pb.float(0.1);\r\n this.$l.hr = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hl = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hu = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hd = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.dHdx = pb.div(pb.sub(this.hr, this.hl), pb.mul(this.epsilon, 2));\r\n this.$l.dHdz = pb.div(pb.sub(this.hu, this.hd), pb.mul(this.epsilon, 2));\r\n this.$l.normal = pb.normalize(pb.vec3(pb.neg(this.dHdx), 1, pb.neg(this.dHdz)));\r\n this.$return(this.normal);\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n time,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcWaveHeight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveHeight';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.windOffset = pb.mul(this.windVelocity, ShaderHelper.getElapsedTime(this));\r\n this.$l.height = that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.01), this.windOffset),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.3,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.05), pb.mul(this.windOffset, 1.5)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.1,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.1), pb.mul(this.windOffset, 2)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.$return(pb.mul(this.height, this.amplitude));\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private fbm(\r\n scope: PBInsideFunctionScope,\r\n st: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'FBM';\r\n pb.func(\r\n funcName,\r\n [pb.vec2('st'), pb.float('frequency'), pb.float('gain'), pb.float('lacunarity'), pb.int('numOctaves')],\r\n function () {\r\n this.$l.m2 = pb.mat2(0.8, 0.6, -0.6, 0.8);\r\n this.$l.p = this.st; //pb.mul(this.st, 0.05);\r\n this.$l.a = pb.float(0);\r\n this.$l.b = pb.float(1);\r\n this.$l.c = pb.float(0);\r\n this.$for(\r\n pb.int('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_NUM_OCTAVES : this.numOctaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numOctaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.n = pb.sub(valueNoise(this, this.p), 0.5);\r\n this.a = pb.add(this.a, pb.mul(this.n, this.b));\r\n this.c = pb.add(this.c, this.b);\r\n this.b = pb.mul(this.b, this.gain);\r\n this.p = pb.mul(this.m2, this.p, this.frequency);\r\n }\r\n );\r\n this.$return(pb.div(this.a, this.c));\r\n }\r\n );\r\n return scope[funcName](st, frequency, gain, lacunarity, numOctaves) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.update} */\r\n update() {}\r\n /** {@inheritDoc WaveGenerator.needUpdate} */\r\n needUpdate() {\r\n return false;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcClipmapTileAABB} */\r\n calcClipmapTileAABB(minX: number, maxX: number, minZ: number, maxZ: number, y: number, outAABB: AABB) {\r\n const maxHeight = 1.5 * this._amplitude;\r\n outAABB.minPoint.setXYZ(minX, y - maxHeight, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormal} */\r\n calcFragmentNormal(scope: PBInsideFunctionScope, xz: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcFragmentNormal', [pb.vec2('xz')], function () {\r\n this.$l.normal = that.calcWaveNormal(\r\n this,\r\n this.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$return(this.normal);\r\n });\r\n return scope.calcFragmentNormal(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */\r\n calcFragmentNormalAndFoam(scope: PBInsideFunctionScope, xz: PBShaderExp) {\r\n return scope.$builder.vec4(this.calcFragmentNormal(scope, xz), 0);\r\n }\r\n /** {@inheritDoc WaveGenerator.setupUniforms} */\r\n setupUniforms(scope: PBGlobalScope, uniformGroup: number) {\r\n const pb = scope.$builder;\r\n scope.numOctaves = pb.int().uniform(uniformGroup);\r\n scope.windVelocity = pb.vec2().uniform(uniformGroup);\r\n scope.waveAmplitude = pb.float().uniform(uniformGroup);\r\n scope.waveFrequency = pb.float().uniform(uniformGroup);\r\n scope.waveGain = pb.float().uniform(uniformGroup);\r\n scope.waveLacunarity = pb.float().uniform(uniformGroup);\r\n }\r\n /** @internal */\r\n private calcNormalAndPos(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n 'calcPositionAndNormal',\r\n [pb.vec3('inPos'), pb.vec3('outPos').out(), pb.vec3('outNormal').out()],\r\n function () {\r\n this.outNormal = that.calcWaveNormal(\r\n this,\r\n this.inPos.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.h = that.calcWaveHeight(\r\n this,\r\n this.inPos.xz,\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.outPos = pb.add(this.inPos, pb.vec3(0, this.h, 0));\r\n }\r\n );\r\n scope.calcPositionAndNormal(inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcVertexPositionAndNormal} */\r\n calcVertexPositionAndNormal(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n this.calcNormalAndPos(scope, inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.applyWaterBindGroup} */\r\n applyWaterBindGroup(bindGroup: BindGroup) {\r\n bindGroup.setValue('numOctaves', this._numOctaves);\r\n bindGroup.setValue('windVelocity', this._windVelocity);\r\n bindGroup.setValue('waveAmplitude', this._amplitude);\r\n bindGroup.setValue('waveFrequency', this._frequency);\r\n bindGroup.setValue('waveGain', this._gain);\r\n bindGroup.setValue('waveLacunarity', this._lacunarity);\r\n }\r\n /** {@inheritDoc WaveGenerator.isOk} */\r\n isOk() {\r\n return true;\r\n }\r\n /** {@inheritDoc WaveGenerator.getHash} */\r\n getHash() {\r\n return 'FBMWaveGenerator';\r\n }\r\n}\r\n"],"names":["MAX_NUM_OCTAVES","FBMWaveGenerator","Disposable","_version","_windVelocity","_numOctaves","_amplitude","_frequency","_lacunarity","_gain","Vector2","clone","other","numOctaves","wind","amplitude","frequency","version","val","equalsTo","set","scope","worldPos","time","windVelocity","gain","lacunarity","pb","$builder","funcName","that","func","vec2","float","int","$l","epsilon","hr","calcWaveHeight","add","hl","sub","hu","hd","dHdx","div","mul","dHdz","normal","normalize","vec3","neg","$return","windOffset","ShaderHelper","getElapsedTime","height","fbm","st","m2","mat2","p","a","b","c","$for","getDevice","type","$if","greaterThanEqual","i","$break","n","valueNoise","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","minPoint","setXYZ","maxPoint","calcFragmentNormal","xz","calcWaveNormal","waveAmplitude","waveFrequency","waveGain","waveLacunarity","calcFragmentNormalAndFoam","vec4","setupUniforms","uniformGroup","uniform","calcNormalAndPos","inPos","outPos","outNormal","out","h","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fbm_wavegenerator.js","sources":["../../src/render/fbm_wavegenerator.ts"],"sourcesContent":["import type { AABB, Immutable } from '@zephyr3d/base';\r\nimport { Disposable, Vector2 } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { valueNoise } from '../shaders';\r\nimport { ShaderHelper } from '../material';\r\n\r\nconst MAX_NUM_OCTAVES = 16;\r\n\r\n/**\r\n * FBM wave generator.\r\n * @public\r\n */\r\nexport class FBMWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private readonly _windVelocity: Vector2;\r\n private _numOctaves: number;\r\n private _amplitude: number;\r\n private _frequency: number;\r\n private readonly _lacunarity: number;\r\n private readonly _gain: number;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor() {\r\n super();\r\n this._version = 0;\r\n this._numOctaves = 4;\r\n this._windVelocity = new Vector2(0.1, 0);\r\n this._amplitude = 0.3;\r\n this._frequency = 3;\r\n this._lacunarity = 1.83;\r\n this._gain = 0.57;\r\n }\r\n clone() {\r\n const other = new FBMWaveGenerator();\r\n other.numOctaves = this.numOctaves;\r\n other.wind = this.wind;\r\n other.amplitude = this.amplitude;\r\n other.frequency = this.frequency;\r\n return other as this;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Number of octaves */\r\n get numOctaves() {\r\n return this._numOctaves;\r\n }\r\n set numOctaves(val) {\r\n if (val !== this.numOctaves) {\r\n this._numOctaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave amplitude */\r\n get amplitude() {\r\n return this._amplitude;\r\n }\r\n set amplitude(val) {\r\n if (val !== this._amplitude) {\r\n this._amplitude = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave frequency */\r\n get frequency() {\r\n return this._frequency;\r\n }\r\n set frequency(val) {\r\n if (val !== this._frequency) {\r\n this._frequency = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wind velocity */\r\n get wind(): Immutable<Vector2> {\r\n return this._windVelocity;\r\n }\r\n set wind(val: Immutable<Vector2>) {\r\n if (!val.equalsTo(this._windVelocity)) {\r\n this._windVelocity.set(val);\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n private calcWaveNormal(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n time: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveNormal';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.float('time'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.epsilon = pb.float(0.1);\r\n this.$l.hr = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hl = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hu = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hd = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.dHdx = pb.div(pb.sub(this.hr, this.hl), pb.mul(this.epsilon, 2));\r\n this.$l.dHdz = pb.div(pb.sub(this.hu, this.hd), pb.mul(this.epsilon, 2));\r\n this.$l.normal = pb.normalize(pb.vec3(pb.neg(this.dHdx), 1, pb.neg(this.dHdz)));\r\n this.$return(this.normal);\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n time,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcWaveHeight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveHeight';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.windOffset = pb.mul(this.windVelocity, ShaderHelper.getElapsedTime(this));\r\n this.$l.height = that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.01), this.windOffset),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.3,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.05), pb.mul(this.windOffset, 1.5)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.1,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.1), pb.mul(this.windOffset, 2)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.$return(pb.mul(this.height, this.amplitude));\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private fbm(\r\n scope: PBInsideFunctionScope,\r\n st: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'FBM';\r\n pb.func(\r\n funcName,\r\n [pb.vec2('st'), pb.float('frequency'), pb.float('gain'), pb.float('lacunarity'), pb.int('numOctaves')],\r\n function () {\r\n this.$l.m2 = pb.mat2(0.8, 0.6, -0.6, 0.8);\r\n this.$l.p = this.st; //pb.mul(this.st, 0.05);\r\n this.$l.a = pb.float(0);\r\n this.$l.b = pb.float(1);\r\n this.$l.c = pb.float(0);\r\n this.$for(\r\n pb.int('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_NUM_OCTAVES : this.numOctaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numOctaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.n = pb.sub(valueNoise(this, this.p), 0.5);\r\n this.a = pb.add(this.a, pb.mul(this.n, this.b));\r\n this.c = pb.add(this.c, this.b);\r\n this.b = pb.mul(this.b, this.gain);\r\n this.p = pb.mul(this.m2, this.p, this.frequency);\r\n }\r\n );\r\n this.$return(pb.div(this.a, this.c));\r\n }\r\n );\r\n return scope[funcName](st, frequency, gain, lacunarity, numOctaves) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.update} */\r\n update() {}\r\n /** {@inheritDoc WaveGenerator.needUpdate} */\r\n needUpdate() {\r\n return false;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcClipmapTileAABB} */\r\n calcClipmapTileAABB(minX: number, maxX: number, minZ: number, maxZ: number, y: number, outAABB: AABB) {\r\n const maxHeight = 1.5 * this._amplitude;\r\n outAABB.minPoint.setXYZ(minX, y - maxHeight, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormal} */\r\n calcFragmentNormal(scope: PBInsideFunctionScope, xz: PBShaderExp, _vertexNormal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcFragmentNormal', [pb.vec2('xz')], function () {\r\n this.$l.normal = that.calcWaveNormal(\r\n this,\r\n this.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$return(this.normal);\r\n });\r\n return scope.calcFragmentNormal(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */\r\n calcFragmentNormalAndFoam(scope: PBInsideFunctionScope, xz: PBShaderExp, _vertexNormal: PBShaderExp) {\r\n return scope.$builder.vec4(this.calcFragmentNormal(scope, xz, _vertexNormal), 0);\r\n }\r\n /** {@inheritDoc WaveGenerator.setupUniforms} */\r\n setupUniforms(scope: PBGlobalScope, uniformGroup: number) {\r\n const pb = scope.$builder;\r\n scope.numOctaves = pb.int().uniform(uniformGroup);\r\n scope.windVelocity = pb.vec2().uniform(uniformGroup);\r\n scope.waveAmplitude = pb.float().uniform(uniformGroup);\r\n scope.waveFrequency = pb.float().uniform(uniformGroup);\r\n scope.waveGain = pb.float().uniform(uniformGroup);\r\n scope.waveLacunarity = pb.float().uniform(uniformGroup);\r\n }\r\n /** @internal */\r\n private calcNormalAndPos(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n 'calcPositionAndNormal',\r\n [pb.vec3('inPos'), pb.vec3('outPos').out(), pb.vec3('outNormal').out()],\r\n function () {\r\n this.outNormal = that.calcWaveNormal(\r\n this,\r\n this.inPos.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.h = that.calcWaveHeight(\r\n this,\r\n this.inPos.xz,\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.outPos = pb.add(this.inPos, pb.vec3(0, this.h, 0));\r\n }\r\n );\r\n scope.calcPositionAndNormal(inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcVertexPositionAndNormal} */\r\n calcVertexPositionAndNormal(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n this.calcNormalAndPos(scope, inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.applyWaterBindGroup} */\r\n applyWaterBindGroup(bindGroup: BindGroup) {\r\n bindGroup.setValue('numOctaves', this._numOctaves);\r\n bindGroup.setValue('windVelocity', this._windVelocity);\r\n bindGroup.setValue('waveAmplitude', this._amplitude);\r\n bindGroup.setValue('waveFrequency', this._frequency);\r\n bindGroup.setValue('waveGain', this._gain);\r\n bindGroup.setValue('waveLacunarity', this._lacunarity);\r\n }\r\n /** {@inheritDoc WaveGenerator.isOk} */\r\n isOk() {\r\n return true;\r\n }\r\n /** {@inheritDoc WaveGenerator.getHash} */\r\n getHash() {\r\n return 'FBMWaveGenerator';\r\n }\r\n}\r\n"],"names":["MAX_NUM_OCTAVES","FBMWaveGenerator","Disposable","_version","_windVelocity","_numOctaves","_amplitude","_frequency","_lacunarity","_gain","Vector2","clone","other","numOctaves","wind","amplitude","frequency","version","val","equalsTo","set","scope","worldPos","time","windVelocity","gain","lacunarity","pb","$builder","funcName","that","func","vec2","float","int","$l","epsilon","hr","calcWaveHeight","add","hl","sub","hu","hd","dHdx","div","mul","dHdz","normal","normalize","vec3","neg","$return","windOffset","ShaderHelper","getElapsedTime","height","fbm","st","m2","mat2","p","a","b","c","$for","getDevice","type","$if","greaterThanEqual","i","$break","n","valueNoise","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","minPoint","setXYZ","maxPoint","calcFragmentNormal","xz","_vertexNormal","calcWaveNormal","waveAmplitude","waveFrequency","waveGain","waveLacunarity","calcFragmentNormalAndFoam","vec4","setupUniforms","uniformGroup","uniform","calcNormalAndPos","inPos","outPos","outNormal","out","h","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}
|