@certe/atmos-renderer 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENCE +674 -0
- package/README.md +166 -0
- package/dist/bloom-pass.d.ts +29 -0
- package/dist/bloom-pass.d.ts.map +1 -0
- package/dist/bloom-pass.js +173 -0
- package/dist/bloom-pass.js.map +1 -0
- package/dist/bloom-shader.d.ts +9 -0
- package/dist/bloom-shader.d.ts.map +1 -0
- package/dist/bloom-shader.js +69 -0
- package/dist/bloom-shader.js.map +1 -0
- package/dist/bounds.d.ts +10 -0
- package/dist/bounds.d.ts.map +1 -0
- package/dist/bounds.js +37 -0
- package/dist/bounds.js.map +1 -0
- package/dist/camera.d.ts +31 -0
- package/dist/camera.d.ts.map +1 -0
- package/dist/camera.js +53 -0
- package/dist/camera.js.map +1 -0
- package/dist/depth-prepass.d.ts +24 -0
- package/dist/depth-prepass.d.ts.map +1 -0
- package/dist/depth-prepass.js +107 -0
- package/dist/depth-prepass.js.map +1 -0
- package/dist/directional-light.d.ts +23 -0
- package/dist/directional-light.d.ts.map +1 -0
- package/dist/directional-light.js +36 -0
- package/dist/directional-light.js.map +1 -0
- package/dist/frustum.d.ts +15 -0
- package/dist/frustum.d.ts.map +1 -0
- package/dist/frustum.js +51 -0
- package/dist/frustum.js.map +1 -0
- package/dist/fullscreen-quad.d.ts +8 -0
- package/dist/fullscreen-quad.d.ts.map +1 -0
- package/dist/fullscreen-quad.js +30 -0
- package/dist/fullscreen-quad.js.map +1 -0
- package/dist/geometry.d.ts +28 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +245 -0
- package/dist/geometry.js.map +1 -0
- package/dist/grid-renderer.d.ts +10 -0
- package/dist/grid-renderer.d.ts.map +1 -0
- package/dist/grid-renderer.js +77 -0
- package/dist/grid-renderer.js.map +1 -0
- package/dist/grid-shader.d.ts +3 -0
- package/dist/grid-shader.d.ts.map +1 -0
- package/dist/grid-shader.js +89 -0
- package/dist/grid-shader.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/light.d.ts +59 -0
- package/dist/light.d.ts.map +1 -0
- package/dist/light.js +184 -0
- package/dist/light.js.map +1 -0
- package/dist/material-asset.d.ts +19 -0
- package/dist/material-asset.d.ts.map +1 -0
- package/dist/material-asset.js +30 -0
- package/dist/material-asset.js.map +1 -0
- package/dist/material.d.ts +50 -0
- package/dist/material.d.ts.map +1 -0
- package/dist/material.js +48 -0
- package/dist/material.js.map +1 -0
- package/dist/mesh-renderer.d.ts +43 -0
- package/dist/mesh-renderer.d.ts.map +1 -0
- package/dist/mesh-renderer.js +162 -0
- package/dist/mesh-renderer.js.map +1 -0
- package/dist/mesh.d.ts +16 -0
- package/dist/mesh.d.ts.map +1 -0
- package/dist/mesh.js +33 -0
- package/dist/mesh.js.map +1 -0
- package/dist/mipmap-generator.d.ts +7 -0
- package/dist/mipmap-generator.d.ts.map +1 -0
- package/dist/mipmap-generator.js +96 -0
- package/dist/mipmap-generator.js.map +1 -0
- package/dist/pbr-wgsl.d.ts +12 -0
- package/dist/pbr-wgsl.d.ts.map +1 -0
- package/dist/pbr-wgsl.js +159 -0
- package/dist/pbr-wgsl.js.map +1 -0
- package/dist/pipeline.d.ts +13 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +77 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/point-light.d.ts +16 -0
- package/dist/point-light.d.ts.map +1 -0
- package/dist/point-light.js +22 -0
- package/dist/point-light.js.map +1 -0
- package/dist/point-shadow-pass.d.ts +24 -0
- package/dist/point-shadow-pass.d.ts.map +1 -0
- package/dist/point-shadow-pass.js +192 -0
- package/dist/point-shadow-pass.js.map +1 -0
- package/dist/point-shadow-shader.d.ts +12 -0
- package/dist/point-shadow-shader.d.ts.map +1 -0
- package/dist/point-shadow-shader.js +52 -0
- package/dist/point-shadow-shader.js.map +1 -0
- package/dist/register-builtins.d.ts +2 -0
- package/dist/register-builtins.d.ts.map +1 -0
- package/dist/register-builtins.js +98 -0
- package/dist/register-builtins.js.map +1 -0
- package/dist/render-system.d.ts +99 -0
- package/dist/render-system.d.ts.map +1 -0
- package/dist/render-system.js +476 -0
- package/dist/render-system.js.map +1 -0
- package/dist/scene-depth.d.ts +36 -0
- package/dist/scene-depth.d.ts.map +1 -0
- package/dist/scene-depth.js +183 -0
- package/dist/scene-depth.js.map +1 -0
- package/dist/shader.d.ts +3 -0
- package/dist/shader.d.ts.map +1 -0
- package/dist/shader.js +144 -0
- package/dist/shader.js.map +1 -0
- package/dist/shadow-fragment-wgsl.d.ts +13 -0
- package/dist/shadow-fragment-wgsl.d.ts.map +1 -0
- package/dist/shadow-fragment-wgsl.js +205 -0
- package/dist/shadow-fragment-wgsl.js.map +1 -0
- package/dist/shadow-manager.d.ts +46 -0
- package/dist/shadow-manager.d.ts.map +1 -0
- package/dist/shadow-manager.js +259 -0
- package/dist/shadow-manager.js.map +1 -0
- package/dist/shadow-pass.d.ts +31 -0
- package/dist/shadow-pass.d.ts.map +1 -0
- package/dist/shadow-pass.js +135 -0
- package/dist/shadow-pass.js.map +1 -0
- package/dist/shadow-shader.d.ts +10 -0
- package/dist/shadow-shader.d.ts.map +1 -0
- package/dist/shadow-shader.js +24 -0
- package/dist/shadow-shader.js.map +1 -0
- package/dist/shadow-uniforms.d.ts +38 -0
- package/dist/shadow-uniforms.d.ts.map +1 -0
- package/dist/shadow-uniforms.js +97 -0
- package/dist/shadow-uniforms.js.map +1 -0
- package/dist/skinned-geometry.d.ts +14 -0
- package/dist/skinned-geometry.d.ts.map +1 -0
- package/dist/skinned-geometry.js +23 -0
- package/dist/skinned-geometry.js.map +1 -0
- package/dist/skinned-mesh-renderer.d.ts +54 -0
- package/dist/skinned-mesh-renderer.d.ts.map +1 -0
- package/dist/skinned-mesh-renderer.js +177 -0
- package/dist/skinned-mesh-renderer.js.map +1 -0
- package/dist/skinned-pipeline.d.ts +16 -0
- package/dist/skinned-pipeline.d.ts.map +1 -0
- package/dist/skinned-pipeline.js +112 -0
- package/dist/skinned-pipeline.js.map +1 -0
- package/dist/skinned-shader.d.ts +7 -0
- package/dist/skinned-shader.d.ts.map +1 -0
- package/dist/skinned-shader.js +52 -0
- package/dist/skinned-shader.js.map +1 -0
- package/dist/skinned-shadow-shader.d.ts +6 -0
- package/dist/skinned-shadow-shader.d.ts.map +1 -0
- package/dist/skinned-shadow-shader.js +31 -0
- package/dist/skinned-shadow-shader.js.map +1 -0
- package/dist/spot-light.d.ts +24 -0
- package/dist/spot-light.d.ts.map +1 -0
- package/dist/spot-light.js +41 -0
- package/dist/spot-light.js.map +1 -0
- package/dist/spot-shadow-pass.d.ts +36 -0
- package/dist/spot-shadow-pass.d.ts.map +1 -0
- package/dist/spot-shadow-pass.js +144 -0
- package/dist/spot-shadow-pass.js.map +1 -0
- package/dist/ssao-pass.d.ts +37 -0
- package/dist/ssao-pass.d.ts.map +1 -0
- package/dist/ssao-pass.js +208 -0
- package/dist/ssao-pass.js.map +1 -0
- package/dist/ssao-shader.d.ts +9 -0
- package/dist/ssao-shader.d.ts.map +1 -0
- package/dist/ssao-shader.js +120 -0
- package/dist/ssao-shader.js.map +1 -0
- package/dist/terrain-mesh-renderer.d.ts +39 -0
- package/dist/terrain-mesh-renderer.d.ts.map +1 -0
- package/dist/terrain-mesh-renderer.js +131 -0
- package/dist/terrain-mesh-renderer.js.map +1 -0
- package/dist/terrain-pipeline.d.ts +17 -0
- package/dist/terrain-pipeline.d.ts.map +1 -0
- package/dist/terrain-pipeline.js +70 -0
- package/dist/terrain-pipeline.js.map +1 -0
- package/dist/terrain-shader.d.ts +10 -0
- package/dist/terrain-shader.d.ts.map +1 -0
- package/dist/terrain-shader.js +154 -0
- package/dist/terrain-shader.js.map +1 -0
- package/dist/texture.d.ts +20 -0
- package/dist/texture.d.ts.map +1 -0
- package/dist/texture.js +87 -0
- package/dist/texture.js.map +1 -0
- package/dist/tonemap-pass.d.ts +22 -0
- package/dist/tonemap-pass.d.ts.map +1 -0
- package/dist/tonemap-pass.js +125 -0
- package/dist/tonemap-pass.js.map +1 -0
- package/dist/unlit-pipeline.d.ts +12 -0
- package/dist/unlit-pipeline.d.ts.map +1 -0
- package/dist/unlit-pipeline.js +59 -0
- package/dist/unlit-pipeline.js.map +1 -0
- package/dist/unlit-shader.d.ts +3 -0
- package/dist/unlit-shader.d.ts.map +1 -0
- package/dist/unlit-shader.js +33 -0
- package/dist/unlit-shader.js.map +1 -0
- package/dist/webgpu-device.d.ts +13 -0
- package/dist/webgpu-device.d.ts.map +1 -0
- package/dist/webgpu-device.js +70 -0
- package/dist/webgpu-device.js.map +1 -0
- package/dist/wireframe-pipeline.d.ts +7 -0
- package/dist/wireframe-pipeline.d.ts.map +1 -0
- package/dist/wireframe-pipeline.js +72 -0
- package/dist/wireframe-pipeline.js.map +1 -0
- package/package.json +28 -0
- package/src/index.ts +87 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Full-scene depth pass for GPU readback (screenToWorldPoint).
|
|
3
|
+
* Renders ALL visible geometry (regular, skinned, terrain) to a non-MSAA
|
|
4
|
+
* depth32float texture with COPY_SRC so individual pixels can be read back.
|
|
5
|
+
* Separate from the SSAO DepthPrepass which only covers a subset of geometry.
|
|
6
|
+
*/
|
|
7
|
+
import { SHADOW_VERTEX_SHADER } from './shadow-shader.js';
|
|
8
|
+
import { SKINNED_SHADOW_VERTEX_SHADER } from './skinned-shadow-shader.js';
|
|
9
|
+
import { VERTEX_STRIDE_BYTES } from './geometry.js';
|
|
10
|
+
import { SKINNED_VERTEX_STRIDE_BYTES } from './skinned-geometry.js';
|
|
11
|
+
import { TERRAIN_VERTEX_STRIDE_BYTES } from './terrain-pipeline.js';
|
|
12
|
+
export class SceneDepthPass {
|
|
13
|
+
_device;
|
|
14
|
+
_vpBuffer;
|
|
15
|
+
_vpBindGroup;
|
|
16
|
+
_vpBGL;
|
|
17
|
+
_objectBGL;
|
|
18
|
+
_depthTexture;
|
|
19
|
+
_width = 0;
|
|
20
|
+
_height = 0;
|
|
21
|
+
// Lazy pipelines
|
|
22
|
+
_regularPipeline = null;
|
|
23
|
+
_skinnedPipeline = null;
|
|
24
|
+
_skinnedBoneBGL = null;
|
|
25
|
+
_terrainPipeline = null;
|
|
26
|
+
get depthTexture() { return this._depthTexture; }
|
|
27
|
+
get width() { return this._width; }
|
|
28
|
+
get height() { return this._height; }
|
|
29
|
+
constructor(device, objectBGL, w, h) {
|
|
30
|
+
this._device = device;
|
|
31
|
+
this._objectBGL = objectBGL;
|
|
32
|
+
this._vpBuffer = device.createBuffer({
|
|
33
|
+
size: 64,
|
|
34
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
35
|
+
});
|
|
36
|
+
this._vpBGL = device.createBindGroupLayout({
|
|
37
|
+
entries: [
|
|
38
|
+
{ binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: 'uniform' } },
|
|
39
|
+
],
|
|
40
|
+
});
|
|
41
|
+
this._vpBindGroup = device.createBindGroup({
|
|
42
|
+
layout: this._vpBGL,
|
|
43
|
+
entries: [{ binding: 0, resource: { buffer: this._vpBuffer } }],
|
|
44
|
+
});
|
|
45
|
+
this._depthTexture = this._createTexture(w, h);
|
|
46
|
+
this._width = w;
|
|
47
|
+
this._height = h;
|
|
48
|
+
}
|
|
49
|
+
_createTexture(w, h) {
|
|
50
|
+
return this._device.createTexture({
|
|
51
|
+
size: { width: w, height: h },
|
|
52
|
+
format: 'depth32float',
|
|
53
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
resize(w, h) {
|
|
57
|
+
if (this._width === w && this._height === h)
|
|
58
|
+
return;
|
|
59
|
+
this._depthTexture.destroy();
|
|
60
|
+
this._depthTexture = this._createTexture(w, h);
|
|
61
|
+
this._width = w;
|
|
62
|
+
this._height = h;
|
|
63
|
+
}
|
|
64
|
+
execute(encoder, vpMatrix, meshRenderers, skinnedRenderers, terrainRenderers) {
|
|
65
|
+
this._device.queue.writeBuffer(this._vpBuffer, 0, vpMatrix);
|
|
66
|
+
const pass = encoder.beginRenderPass({
|
|
67
|
+
colorAttachments: [],
|
|
68
|
+
depthStencilAttachment: {
|
|
69
|
+
view: this._depthTexture.createView(),
|
|
70
|
+
depthClearValue: 1.0,
|
|
71
|
+
depthLoadOp: 'clear',
|
|
72
|
+
depthStoreOp: 'store',
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
// Regular meshes
|
|
76
|
+
if (meshRenderers.length > 0) {
|
|
77
|
+
if (!this._regularPipeline)
|
|
78
|
+
this._regularPipeline = this._createRegularPipeline();
|
|
79
|
+
pass.setPipeline(this._regularPipeline);
|
|
80
|
+
pass.setBindGroup(1, this._vpBindGroup);
|
|
81
|
+
for (const mr of meshRenderers) {
|
|
82
|
+
if (!mr.mesh || !mr.bindGroup)
|
|
83
|
+
continue;
|
|
84
|
+
pass.setBindGroup(0, mr.bindGroup);
|
|
85
|
+
pass.setVertexBuffer(0, mr.mesh.vertexBuffer);
|
|
86
|
+
pass.setIndexBuffer(mr.mesh.indexBuffer, mr.mesh.indexFormat);
|
|
87
|
+
pass.drawIndexed(mr.mesh.indexCount);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Skinned meshes
|
|
91
|
+
if (skinnedRenderers.length > 0) {
|
|
92
|
+
if (!this._skinnedPipeline)
|
|
93
|
+
this._createSkinnedPipeline();
|
|
94
|
+
pass.setPipeline(this._skinnedPipeline);
|
|
95
|
+
pass.setBindGroup(1, this._vpBindGroup);
|
|
96
|
+
for (const smr of skinnedRenderers) {
|
|
97
|
+
if (!smr.mesh || !smr.bindGroup || !smr.shadowBoneBindGroup)
|
|
98
|
+
continue;
|
|
99
|
+
pass.setBindGroup(0, smr.bindGroup);
|
|
100
|
+
pass.setBindGroup(2, smr.shadowBoneBindGroup);
|
|
101
|
+
pass.setVertexBuffer(0, smr.mesh.vertexBuffer);
|
|
102
|
+
pass.setIndexBuffer(smr.mesh.indexBuffer, smr.mesh.indexFormat);
|
|
103
|
+
pass.drawIndexed(smr.mesh.indexCount);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Terrain meshes
|
|
107
|
+
if (terrainRenderers.length > 0) {
|
|
108
|
+
if (!this._terrainPipeline)
|
|
109
|
+
this._terrainPipeline = this._createTerrainPipeline();
|
|
110
|
+
pass.setPipeline(this._terrainPipeline);
|
|
111
|
+
pass.setBindGroup(1, this._vpBindGroup);
|
|
112
|
+
for (const tmr of terrainRenderers) {
|
|
113
|
+
if (!tmr.mesh || !tmr.bindGroup)
|
|
114
|
+
continue;
|
|
115
|
+
pass.setBindGroup(0, tmr.bindGroup);
|
|
116
|
+
pass.setVertexBuffer(0, tmr.mesh.vertexBuffer);
|
|
117
|
+
pass.setIndexBuffer(tmr.mesh.indexBuffer, tmr.mesh.indexFormat);
|
|
118
|
+
pass.drawIndexed(tmr.mesh.indexCount);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
pass.end();
|
|
122
|
+
}
|
|
123
|
+
_createRegularPipeline() {
|
|
124
|
+
const mod = this._device.createShaderModule({ code: SHADOW_VERTEX_SHADER });
|
|
125
|
+
const layout = this._device.createPipelineLayout({
|
|
126
|
+
bindGroupLayouts: [this._objectBGL, this._vpBGL],
|
|
127
|
+
});
|
|
128
|
+
return this._device.createRenderPipeline({
|
|
129
|
+
layout,
|
|
130
|
+
vertex: {
|
|
131
|
+
module: mod, entryPoint: 'main',
|
|
132
|
+
buffers: [{ arrayStride: VERTEX_STRIDE_BYTES, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' }] }],
|
|
133
|
+
},
|
|
134
|
+
primitive: { topology: 'triangle-list', cullMode: 'back' },
|
|
135
|
+
depthStencil: { depthWriteEnabled: true, depthCompare: 'less', format: 'depth32float' },
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
_createSkinnedPipeline() {
|
|
139
|
+
const mod = this._device.createShaderModule({ code: SKINNED_SHADOW_VERTEX_SHADER });
|
|
140
|
+
this._skinnedBoneBGL = this._device.createBindGroupLayout({
|
|
141
|
+
entries: [{ binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } }],
|
|
142
|
+
});
|
|
143
|
+
const layout = this._device.createPipelineLayout({
|
|
144
|
+
bindGroupLayouts: [this._objectBGL, this._vpBGL, this._skinnedBoneBGL],
|
|
145
|
+
});
|
|
146
|
+
this._skinnedPipeline = this._device.createRenderPipeline({
|
|
147
|
+
layout,
|
|
148
|
+
vertex: {
|
|
149
|
+
module: mod, entryPoint: 'main',
|
|
150
|
+
buffers: [{
|
|
151
|
+
arrayStride: SKINNED_VERTEX_STRIDE_BYTES,
|
|
152
|
+
attributes: [
|
|
153
|
+
{ shaderLocation: 0, offset: 0, format: 'float32x3' },
|
|
154
|
+
{ shaderLocation: 3, offset: 32, format: 'uint16x4' },
|
|
155
|
+
{ shaderLocation: 4, offset: 40, format: 'float32x4' },
|
|
156
|
+
],
|
|
157
|
+
}],
|
|
158
|
+
},
|
|
159
|
+
primitive: { topology: 'triangle-list', cullMode: 'back' },
|
|
160
|
+
depthStencil: { depthWriteEnabled: true, depthCompare: 'less', format: 'depth32float' },
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
_createTerrainPipeline() {
|
|
164
|
+
const mod = this._device.createShaderModule({ code: SHADOW_VERTEX_SHADER });
|
|
165
|
+
const layout = this._device.createPipelineLayout({
|
|
166
|
+
bindGroupLayouts: [this._objectBGL, this._vpBGL],
|
|
167
|
+
});
|
|
168
|
+
return this._device.createRenderPipeline({
|
|
169
|
+
layout,
|
|
170
|
+
vertex: {
|
|
171
|
+
module: mod, entryPoint: 'main',
|
|
172
|
+
buffers: [{ arrayStride: TERRAIN_VERTEX_STRIDE_BYTES, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' }] }],
|
|
173
|
+
},
|
|
174
|
+
primitive: { topology: 'triangle-list', cullMode: 'back' },
|
|
175
|
+
depthStencil: { depthWriteEnabled: true, depthCompare: 'less', format: 'depth32float' },
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
destroy() {
|
|
179
|
+
this._depthTexture.destroy();
|
|
180
|
+
this._vpBuffer.destroy();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=scene-depth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-depth.js","sourceRoot":"","sources":["../src/scene-depth.ts"],"names":[],"mappings":"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"}
|
package/dist/shader.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const VERTEX_SHADER = "\nstruct ObjectUniforms {\n mvp: mat4x4<f32>,\n model: mat4x4<f32>,\n normalMatrix: mat4x4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> object: ObjectUniforms;\n\nstruct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) normal: vec3<f32>,\n @location(2) uv: vec2<f32>,\n};\n\nstruct VertexOutput {\n @builtin(position) clipPosition: vec4<f32>,\n @location(0) worldPosition: vec3<f32>,\n @location(1) worldNormal: vec3<f32>,\n @location(2) uv: vec2<f32>,\n};\n\n@vertex\nfn main(input: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n let worldPos = object.model * vec4<f32>(input.position, 1.0);\n output.clipPosition = object.mvp * vec4<f32>(input.position, 1.0);\n output.worldPosition = worldPos.xyz;\n output.worldNormal = (object.normalMatrix * vec4<f32>(input.normal, 0.0)).xyz;\n output.uv = input.uv;\n return output;\n}\n";
|
|
2
|
+
export declare const FRAGMENT_SHADER: string;
|
|
3
|
+
//# sourceMappingURL=shader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader.d.ts","sourceRoot":"","sources":["../src/shader.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,k3BAgCzB,CAAC;AAEF,eAAO,MAAM,eAAe,QA2G3B,CAAC"}
|
package/dist/shader.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { SHADOW_FRAGMENT_WGSL } from './shadow-fragment-wgsl.js';
|
|
2
|
+
import { PBR_FUNCTIONS_WGSL, LIGHT_LOOP_WGSL, FOG_WGSL } from './pbr-wgsl.js';
|
|
3
|
+
export const VERTEX_SHADER = /* wgsl */ `
|
|
4
|
+
struct ObjectUniforms {
|
|
5
|
+
mvp: mat4x4<f32>,
|
|
6
|
+
model: mat4x4<f32>,
|
|
7
|
+
normalMatrix: mat4x4<f32>,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
@group(0) @binding(0) var<uniform> object: ObjectUniforms;
|
|
11
|
+
|
|
12
|
+
struct VertexInput {
|
|
13
|
+
@location(0) position: vec3<f32>,
|
|
14
|
+
@location(1) normal: vec3<f32>,
|
|
15
|
+
@location(2) uv: vec2<f32>,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
struct VertexOutput {
|
|
19
|
+
@builtin(position) clipPosition: vec4<f32>,
|
|
20
|
+
@location(0) worldPosition: vec3<f32>,
|
|
21
|
+
@location(1) worldNormal: vec3<f32>,
|
|
22
|
+
@location(2) uv: vec2<f32>,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
@vertex
|
|
26
|
+
fn main(input: VertexInput) -> VertexOutput {
|
|
27
|
+
var output: VertexOutput;
|
|
28
|
+
let worldPos = object.model * vec4<f32>(input.position, 1.0);
|
|
29
|
+
output.clipPosition = object.mvp * vec4<f32>(input.position, 1.0);
|
|
30
|
+
output.worldPosition = worldPos.xyz;
|
|
31
|
+
output.worldNormal = (object.normalMatrix * vec4<f32>(input.normal, 0.0)).xyz;
|
|
32
|
+
output.uv = input.uv;
|
|
33
|
+
return output;
|
|
34
|
+
}
|
|
35
|
+
`;
|
|
36
|
+
export const FRAGMENT_SHADER = /* wgsl */ `
|
|
37
|
+
const PI: f32 = 3.14159265359;
|
|
38
|
+
const MAX_DIR_LIGHTS: u32 = 4u;
|
|
39
|
+
const MAX_POINT_LIGHTS: u32 = 4u;
|
|
40
|
+
const MAX_SPOT_LIGHTS: u32 = 4u;
|
|
41
|
+
|
|
42
|
+
struct MaterialUniforms {
|
|
43
|
+
albedo: vec4<f32>,
|
|
44
|
+
metallic: f32,
|
|
45
|
+
roughness: f32,
|
|
46
|
+
_pad0: f32,
|
|
47
|
+
alphaCutoff: f32,
|
|
48
|
+
emissive: vec4<f32>, // rgb + intensity in w
|
|
49
|
+
texTiling: vec2<f32>,
|
|
50
|
+
_pad1: vec2<f32>,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
struct DirLight {
|
|
54
|
+
direction: vec4<f32>,
|
|
55
|
+
color: vec4<f32>,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
struct PointLight {
|
|
59
|
+
position: vec4<f32>, // xyz=position, w=range
|
|
60
|
+
color: vec4<f32>, // rgb=color, w=intensity
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
struct SpotLight {
|
|
64
|
+
position: vec4<f32>, // xyz=position, w=range
|
|
65
|
+
direction: vec4<f32>, // xyz=direction, w=outerCos
|
|
66
|
+
color: vec4<f32>, // rgb=color, w=intensity
|
|
67
|
+
extra: vec4<f32>, // x=innerCos
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
struct SceneUniforms {
|
|
71
|
+
cameraPos: vec4<f32>,
|
|
72
|
+
numDirLights: u32,
|
|
73
|
+
numPointLights: u32,
|
|
74
|
+
numSpotLights: u32,
|
|
75
|
+
_pad1: u32,
|
|
76
|
+
dirLights: array<DirLight, 4>,
|
|
77
|
+
pointLights: array<PointLight, 4>,
|
|
78
|
+
spotLights: array<SpotLight, 4>,
|
|
79
|
+
fogEnabled: u32,
|
|
80
|
+
fogMode: u32,
|
|
81
|
+
fogDensity: f32,
|
|
82
|
+
fogStart: f32,
|
|
83
|
+
fogEnd: f32,
|
|
84
|
+
_fogPad: f32,
|
|
85
|
+
fogColor: vec4<f32>,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
@group(1) @binding(0) var<uniform> material: MaterialUniforms;
|
|
89
|
+
@group(1) @binding(1) var<uniform> scene: SceneUniforms;
|
|
90
|
+
@group(1) @binding(2) var albedoTexture: texture_2d<f32>;
|
|
91
|
+
@group(1) @binding(3) var albedoSampler: sampler;
|
|
92
|
+
@group(1) @binding(4) var normalMap: texture_2d<f32>;
|
|
93
|
+
@group(1) @binding(5) var normalSampler: sampler;
|
|
94
|
+
@group(1) @binding(6) var metallicRoughnessMap: texture_2d<f32>;
|
|
95
|
+
@group(1) @binding(7) var mrSampler: sampler;
|
|
96
|
+
|
|
97
|
+
` + SHADOW_FRAGMENT_WGSL + PBR_FUNCTIONS_WGSL + /* wgsl */ `
|
|
98
|
+
|
|
99
|
+
struct FragmentInput {
|
|
100
|
+
@location(0) worldPosition: vec3<f32>,
|
|
101
|
+
@location(1) worldNormal: vec3<f32>,
|
|
102
|
+
@location(2) uv: vec2<f32>,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
@fragment
|
|
106
|
+
fn main(input: FragmentInput) -> @location(0) vec4<f32> {
|
|
107
|
+
let uv = input.uv * material.texTiling;
|
|
108
|
+
let texColor = textureSample(albedoTexture, albedoSampler, uv);
|
|
109
|
+
let alpha = texColor.a * material.albedo.a;
|
|
110
|
+
if (material.alphaCutoff > 0.0 && alpha < material.alphaCutoff) {
|
|
111
|
+
discard;
|
|
112
|
+
}
|
|
113
|
+
let albedo = material.albedo.rgb * texColor.rgb;
|
|
114
|
+
|
|
115
|
+
// Sample metallic-roughness map (G=roughness, B=metallic per glTF convention)
|
|
116
|
+
let mrSample = textureSample(metallicRoughnessMap, mrSampler, uv);
|
|
117
|
+
let metallic = material.metallic * mrSample.b;
|
|
118
|
+
let roughness = material.roughness * mrSample.g;
|
|
119
|
+
|
|
120
|
+
// Normal mapping via cotangent-frame
|
|
121
|
+
let TBN = computeTBN(input.worldPosition, input.worldNormal, uv);
|
|
122
|
+
let normalSample = textureSample(normalMap, normalSampler, uv).rgb * 2.0 - 1.0;
|
|
123
|
+
let N = normalize(TBN * normalSample);
|
|
124
|
+
|
|
125
|
+
let V = normalize(scene.cameraPos.xyz - input.worldPosition);
|
|
126
|
+
let F0 = mix(vec3<f32>(0.04), albedo, metallic);
|
|
127
|
+
let worldPosition = input.worldPosition;
|
|
128
|
+
|
|
129
|
+
var Lo = vec3<f32>(0.0);
|
|
130
|
+
` + LIGHT_LOOP_WGSL + /* wgsl */ `
|
|
131
|
+
// Ambient
|
|
132
|
+
let ambient = vec3<f32>(0.03) * albedo;
|
|
133
|
+
var color = ambient + Lo;
|
|
134
|
+
|
|
135
|
+
// Emissive
|
|
136
|
+
color = color + material.emissive.rgb * material.emissive.w;
|
|
137
|
+
|
|
138
|
+
` + FOG_WGSL + /* wgsl */ `
|
|
139
|
+
|
|
140
|
+
// Output linear HDR (tonemapping done in post-process)
|
|
141
|
+
return vec4<f32>(color, alpha);
|
|
142
|
+
}
|
|
143
|
+
`;
|
|
144
|
+
//# sourceMappingURL=shader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader.js","sourceRoot":"","sources":["../src/shader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9E,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCtC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DxC,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,UAAU,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCzD,GAAG,eAAe,GAAG,UAAU,CAAA;;;;;;;;CAQ/B,GAAG,QAAQ,GAAG,UAAU,CAAA;;;;;CAKxB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared WGSL for multi-shadow sampling (group 2).
|
|
3
|
+
*
|
|
4
|
+
* Supports up to 2 directional (2-cascade each), 2 point (cubemap),
|
|
5
|
+
* and 4 spot shadow slots. Slot assignment is driven by CPU-side
|
|
6
|
+
* light-to-slot maps written into the uniform buffer.
|
|
7
|
+
*
|
|
8
|
+
* Because WGSL cannot pass texture handles as function parameters,
|
|
9
|
+
* each slot gets its own sampling function, and a dispatch function
|
|
10
|
+
* selects the correct slot via a switch statement.
|
|
11
|
+
*/
|
|
12
|
+
export declare const SHADOW_FRAGMENT_WGSL: string;
|
|
13
|
+
//# sourceMappingURL=shadow-fragment-wgsl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow-fragment-wgsl.d.ts","sourceRoot":"","sources":["../src/shadow-fragment-wgsl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkNH,eAAO,MAAM,oBAAoB,QAAmB,CAAC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared WGSL for multi-shadow sampling (group 2).
|
|
3
|
+
*
|
|
4
|
+
* Supports up to 2 directional (2-cascade each), 2 point (cubemap),
|
|
5
|
+
* and 4 spot shadow slots. Slot assignment is driven by CPU-side
|
|
6
|
+
* light-to-slot maps written into the uniform buffer.
|
|
7
|
+
*
|
|
8
|
+
* Because WGSL cannot pass texture handles as function parameters,
|
|
9
|
+
* each slot gets its own sampling function, and a dispatch function
|
|
10
|
+
* selects the correct slot via a switch statement.
|
|
11
|
+
*/
|
|
12
|
+
/* ── constants ──────────────────────────────────────────────────── */
|
|
13
|
+
const MAX_DIR_SHADOW_SLOTS = 2;
|
|
14
|
+
const MAX_POINT_SHADOW_SLOTS = 2;
|
|
15
|
+
const MAX_SPOT_SHADOW_SLOTS = 4;
|
|
16
|
+
/* ── helpers (code-gen) ─────────────────────────────────────────── */
|
|
17
|
+
function genDirPcf(slot, cascade) {
|
|
18
|
+
const tex = `dirCascade${cascade}_${slot}`;
|
|
19
|
+
const vpField = cascade === 0 ? 'cascade0VP' : 'cascade1VP';
|
|
20
|
+
return `fn _pcfDir${cascade}S${slot}(worldPos: vec3<f32>) -> f32 {
|
|
21
|
+
let s = shadow.dirSlots[${slot}];
|
|
22
|
+
let clip = s.${vpField} * vec4(worldPos, 1.0);
|
|
23
|
+
let ndc = clip.xyz / clip.w;
|
|
24
|
+
let uv = ndc.xy * vec2(0.5, -0.5) + 0.5;
|
|
25
|
+
let depth = ndc.z - s.bias;
|
|
26
|
+
let texelSize = 1.0 / f32(textureDimensions(${tex}, 0).x);
|
|
27
|
+
var vis = 0.0;
|
|
28
|
+
for (var y: i32 = -1; y <= 1; y++) { for (var x: i32 = -1; x <= 1; x++) {
|
|
29
|
+
vis += textureSampleCompare(${tex}, shadowSampler, uv + vec2(f32(x), f32(y)) * texelSize, depth);
|
|
30
|
+
}}
|
|
31
|
+
return vis / 9.0;
|
|
32
|
+
}`;
|
|
33
|
+
}
|
|
34
|
+
function genDirSlot(slot) {
|
|
35
|
+
return `fn _sampleDirSlot${slot}(worldPos: vec3<f32>) -> f32 {
|
|
36
|
+
let s = shadow.dirSlots[${slot}];
|
|
37
|
+
let vis0 = _pcfDir0S${slot}(worldPos);
|
|
38
|
+
let vis1 = _pcfDir1S${slot}(worldPos);
|
|
39
|
+
let uv0 = _cascadeUV(worldPos, s.cascade0VP);
|
|
40
|
+
let c0xy = _cascadeCoverageXY(uv0.xy, 0.05);
|
|
41
|
+
let c0z = smoothstep(0.0, 0.02, uv0.z) * smoothstep(0.0, 0.02, 1.0 - uv0.z);
|
|
42
|
+
let c0 = c0xy * c0z;
|
|
43
|
+
let uv1 = _cascadeUV(worldPos, s.cascade1VP);
|
|
44
|
+
let c1xy = _cascadeCoverageXY(uv1.xy, 0.15);
|
|
45
|
+
let c1z = smoothstep(0.0, 0.15, 1.0 - uv1.z);
|
|
46
|
+
let c1 = c1xy * c1z;
|
|
47
|
+
let vis1Faded = mix(1.0, vis1, c1);
|
|
48
|
+
let visibility = mix(vis1Faded, vis0, c0);
|
|
49
|
+
let result = mix(1.0, visibility, s.intensity);
|
|
50
|
+
return select(1.0, result, s.enabled != 0u);
|
|
51
|
+
}`;
|
|
52
|
+
}
|
|
53
|
+
function genPointSlot(slot) {
|
|
54
|
+
const tex = `pointCubeMap${slot}`;
|
|
55
|
+
return `fn _samplePointSlot${slot}(worldPos: vec3<f32>, N: vec3<f32>) -> f32 {
|
|
56
|
+
let s = shadow.pointSlots[${slot}];
|
|
57
|
+
let toFrag = worldPos - s.posAndFar.xyz;
|
|
58
|
+
let dist = length(toFrag);
|
|
59
|
+
let far = s.posAndFar.w;
|
|
60
|
+
let lightDir = toFrag / max(dist, 0.0001);
|
|
61
|
+
let cosTheta = abs(dot(lightDir, N));
|
|
62
|
+
let bias = s.bias * max(1.0, 2.0 / max(cosTheta, 0.05));
|
|
63
|
+
let refDepth = dist / far - bias;
|
|
64
|
+
let vis = textureSampleCompare(${tex}, shadowSampler, toFrag, refDepth);
|
|
65
|
+
let adjusted = mix(1.0, vis, s.intensity);
|
|
66
|
+
let enabled = s.enabled != 0u;
|
|
67
|
+
let inRange = dist < far;
|
|
68
|
+
return select(1.0, adjusted, enabled && inRange);
|
|
69
|
+
}`;
|
|
70
|
+
}
|
|
71
|
+
function genSpotSlot(slot) {
|
|
72
|
+
const tex = `spotDepthMap${slot}`;
|
|
73
|
+
return `fn _sampleSpotSlot${slot}(worldPos: vec3<f32>) -> f32 {
|
|
74
|
+
let s = shadow.spotSlots[${slot}];
|
|
75
|
+
let clip = s.shadowVP * vec4(worldPos, 1.0);
|
|
76
|
+
let ndc = clip.xyz / clip.w;
|
|
77
|
+
let uv = ndc.xy * vec2(0.5, -0.5) + 0.5;
|
|
78
|
+
let depth = ndc.z - s.bias;
|
|
79
|
+
let inBounds = uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0 && ndc.z >= 0.0 && ndc.z <= 1.0;
|
|
80
|
+
let texelSize = 1.0 / f32(textureDimensions(${tex}, 0).x);
|
|
81
|
+
var vis = 0.0;
|
|
82
|
+
for (var y: i32 = -1; y <= 1; y++) { for (var x: i32 = -1; x <= 1; x++) {
|
|
83
|
+
vis += textureSampleCompare(${tex}, shadowSampler, uv + vec2(f32(x), f32(y)) * texelSize, depth);
|
|
84
|
+
}}
|
|
85
|
+
vis = vis / 9.0;
|
|
86
|
+
let adjusted = mix(1.0, vis, s.intensity);
|
|
87
|
+
return select(1.0, adjusted, s.enabled != 0u && inBounds);
|
|
88
|
+
}`;
|
|
89
|
+
}
|
|
90
|
+
/* ── assemble ───────────────────────────────────────────────────── */
|
|
91
|
+
const parts = [];
|
|
92
|
+
// Structs
|
|
93
|
+
parts.push(`
|
|
94
|
+
struct DirShadowSlot {
|
|
95
|
+
cascade0VP: mat4x4<f32>,
|
|
96
|
+
cascade1VP: mat4x4<f32>,
|
|
97
|
+
bias: f32,
|
|
98
|
+
enabled: u32,
|
|
99
|
+
intensity: f32,
|
|
100
|
+
cascadeSplit: f32,
|
|
101
|
+
blendWidth: f32,
|
|
102
|
+
_pad0: f32,
|
|
103
|
+
_pad1: f32,
|
|
104
|
+
_pad2: f32,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
struct PointShadowSlot {
|
|
108
|
+
posAndFar: vec4<f32>,
|
|
109
|
+
bias: f32,
|
|
110
|
+
enabled: u32,
|
|
111
|
+
intensity: f32,
|
|
112
|
+
_pad: f32,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
struct SpotShadowSlot {
|
|
116
|
+
shadowVP: mat4x4<f32>,
|
|
117
|
+
posAndFar: vec4<f32>,
|
|
118
|
+
bias: f32,
|
|
119
|
+
enabled: u32,
|
|
120
|
+
intensity: f32,
|
|
121
|
+
_pad: f32,
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
struct ShadowUniforms {
|
|
125
|
+
dirSlots: array<DirShadowSlot, 2>,
|
|
126
|
+
pointSlots: array<PointShadowSlot, 2>,
|
|
127
|
+
spotSlots: array<SpotShadowSlot, 4>,
|
|
128
|
+
dirLightToSlot: vec4<u32>,
|
|
129
|
+
pointLightToSlot: vec4<u32>,
|
|
130
|
+
spotLightToSlot: vec4<u32>,
|
|
131
|
+
};
|
|
132
|
+
`);
|
|
133
|
+
// Bindings (group 2)
|
|
134
|
+
parts.push(`
|
|
135
|
+
@group(2) @binding(0) var<uniform> shadow: ShadowUniforms;
|
|
136
|
+
@group(2) @binding(1) var shadowSampler: sampler_comparison;
|
|
137
|
+
@group(2) @binding(2) var dirCascade0_0: texture_depth_2d;
|
|
138
|
+
@group(2) @binding(3) var dirCascade0_1: texture_depth_2d;
|
|
139
|
+
@group(2) @binding(4) var dirCascade1_0: texture_depth_2d;
|
|
140
|
+
@group(2) @binding(5) var dirCascade1_1: texture_depth_2d;
|
|
141
|
+
@group(2) @binding(6) var pointCubeMap0: texture_depth_cube;
|
|
142
|
+
@group(2) @binding(7) var pointCubeMap1: texture_depth_cube;
|
|
143
|
+
@group(2) @binding(8) var spotDepthMap0: texture_depth_2d;
|
|
144
|
+
@group(2) @binding(9) var spotDepthMap1: texture_depth_2d;
|
|
145
|
+
@group(2) @binding(10) var spotDepthMap2: texture_depth_2d;
|
|
146
|
+
@group(2) @binding(11) var spotDepthMap3: texture_depth_2d;
|
|
147
|
+
`);
|
|
148
|
+
// Shared helpers
|
|
149
|
+
parts.push(`
|
|
150
|
+
fn _cascadeUV(worldPos: vec3<f32>, lightVP: mat4x4<f32>) -> vec3<f32> {
|
|
151
|
+
let clip = lightVP * vec4(worldPos, 1.0);
|
|
152
|
+
let ndc = clip.xyz / clip.w;
|
|
153
|
+
return vec3(ndc.xy * vec2(0.5, -0.5) + 0.5, ndc.z);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
fn _cascadeCoverageXY(uv: vec2<f32>, fade: f32) -> f32 {
|
|
157
|
+
let fx = min(smoothstep(0.0, fade, uv.x), smoothstep(0.0, fade, 1.0 - uv.x));
|
|
158
|
+
let fy = min(smoothstep(0.0, fade, uv.y), smoothstep(0.0, fade, 1.0 - uv.y));
|
|
159
|
+
return fx * fy;
|
|
160
|
+
}
|
|
161
|
+
`);
|
|
162
|
+
// Per-slot dir PCF + blend
|
|
163
|
+
for (let s = 0; s < MAX_DIR_SHADOW_SLOTS; s++) {
|
|
164
|
+
parts.push(genDirPcf(s, 0));
|
|
165
|
+
parts.push(genDirPcf(s, 1));
|
|
166
|
+
parts.push(genDirSlot(s));
|
|
167
|
+
}
|
|
168
|
+
// Per-slot point
|
|
169
|
+
for (let s = 0; s < MAX_POINT_SHADOW_SLOTS; s++) {
|
|
170
|
+
parts.push(genPointSlot(s));
|
|
171
|
+
}
|
|
172
|
+
// Per-slot spot
|
|
173
|
+
for (let s = 0; s < MAX_SPOT_SHADOW_SLOTS; s++) {
|
|
174
|
+
parts.push(genSpotSlot(s));
|
|
175
|
+
}
|
|
176
|
+
// Dispatch functions
|
|
177
|
+
parts.push(`
|
|
178
|
+
fn sampleDirShadow(slot: u32, worldPos: vec3<f32>) -> f32 {
|
|
179
|
+
switch(slot) {
|
|
180
|
+
case 0u: { return _sampleDirSlot0(worldPos); }
|
|
181
|
+
case 1u: { return _sampleDirSlot1(worldPos); }
|
|
182
|
+
default: { return 1.0; }
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
fn samplePointShadow(slot: u32, worldPos: vec3<f32>, N: vec3<f32>) -> f32 {
|
|
187
|
+
switch(slot) {
|
|
188
|
+
case 0u: { return _samplePointSlot0(worldPos, N); }
|
|
189
|
+
case 1u: { return _samplePointSlot1(worldPos, N); }
|
|
190
|
+
default: { return 1.0; }
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
fn sampleSpotShadow(slot: u32, worldPos: vec3<f32>) -> f32 {
|
|
195
|
+
switch(slot) {
|
|
196
|
+
case 0u: { return _sampleSpotSlot0(worldPos); }
|
|
197
|
+
case 1u: { return _sampleSpotSlot1(worldPos); }
|
|
198
|
+
case 2u: { return _sampleSpotSlot2(worldPos); }
|
|
199
|
+
case 3u: { return _sampleSpotSlot3(worldPos); }
|
|
200
|
+
default: { return 1.0; }
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
`);
|
|
204
|
+
export const SHADOW_FRAGMENT_WGSL = parts.join('\n');
|
|
205
|
+
//# sourceMappingURL=shadow-fragment-wgsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow-fragment-wgsl.js","sourceRoot":"","sources":["../src/shadow-fragment-wgsl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,uEAAuE;AAEvE,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,uEAAuE;AAEvE,SAAS,SAAS,CAAC,IAAY,EAAE,OAAc;IAC7C,MAAM,GAAG,GAAG,aAAa,OAAO,IAAI,IAAI,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IAC5D,OAAO,aAAa,OAAO,IAAI,IAAI;4BACT,IAAI;iBACf,OAAO;;;;gDAIwB,GAAG;;;kCAGjB,GAAG;;;EAGnC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,oBAAoB,IAAI;4BACL,IAAI;wBACR,IAAI;wBACJ,IAAI;;;;;;;;;;;;;EAa1B,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,GAAG,GAAG,eAAe,IAAI,EAAE,CAAC;IAClC,OAAO,sBAAsB,IAAI;8BACL,IAAI;;;;;;;;mCAQC,GAAG;;;;;EAKpC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,eAAe,IAAI,EAAE,CAAC;IAClC,OAAO,qBAAqB,IAAI;6BACL,IAAI;;;;;;gDAMe,GAAG;;;kCAGjB,GAAG;;;;;EAKnC,CAAC;AACH,CAAC;AAED,uEAAuE;AAEvE,MAAM,KAAK,GAAa,EAAE,CAAC;AAE3B,UAAU;AACV,KAAK,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCV,CAAC,CAAC;AAEH,qBAAqB;AACrB,KAAK,CAAC,IAAI,CAAC;;;;;;;;;;;;;CAaV,CAAC,CAAC;AAEH,iBAAiB;AACjB,KAAK,CAAC,IAAI,CAAC;;;;;;;;;;;;CAYV,CAAC,CAAC;AAEH,2BAA2B;AAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,iBAAiB;AACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,EAAE,CAAC,EAAE,EAAE,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,gBAAgB;AAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,qBAAqB,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,qBAAqB;AACrB,KAAK,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BV,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShadowManager — owns all shadow pass state and orchestrates multi-shadow
|
|
3
|
+
* rendering for up to 2 dir, 2 point, and 4 spot shadow casters.
|
|
4
|
+
*/
|
|
5
|
+
import type { Scene } from '@certe/atmos-core';
|
|
6
|
+
import type { Mat4Type } from '@certe/atmos-math';
|
|
7
|
+
import type { SceneLightData } from './light.js';
|
|
8
|
+
import { DirectionalLight } from './directional-light.js';
|
|
9
|
+
export interface ShadowManagerResult {
|
|
10
|
+
bindGroup: GPUBindGroup;
|
|
11
|
+
}
|
|
12
|
+
export declare class ShadowManager {
|
|
13
|
+
private readonly _device;
|
|
14
|
+
private readonly _objectBGL;
|
|
15
|
+
private readonly _shadowBGL;
|
|
16
|
+
private _dirPairs;
|
|
17
|
+
private _pointPasses;
|
|
18
|
+
private _spotPasses;
|
|
19
|
+
private _uniformBuffer;
|
|
20
|
+
private readonly _uniformData;
|
|
21
|
+
private _bindGroup;
|
|
22
|
+
private _dummy;
|
|
23
|
+
private _dirty;
|
|
24
|
+
private readonly _dirSlotLights;
|
|
25
|
+
private readonly _pointSlotLights;
|
|
26
|
+
private readonly _spotSlotLights;
|
|
27
|
+
private readonly _dirVP0;
|
|
28
|
+
private readonly _dirVP1;
|
|
29
|
+
constructor(device: GPUDevice, objectBGL: GPUBindGroupLayout, shadowBGL: GPUBindGroupLayout);
|
|
30
|
+
update(encoder: GPUCommandEncoder, scene: Scene, cameraEye: Float32Array, sceneLights: SceneLightData, extraDraw: ((pass: GPURenderPassEncoder) => void) | undefined, computeCascadeVP: (out: Mat4Type, light: DirectionalLight, eye: Float32Array, size: number, dist: number) => void): ShadowManagerResult;
|
|
31
|
+
/** Select up to MAX_DIR_SHADOW_SLOTS dir lights by highest intensity. */
|
|
32
|
+
private _selectDirLights;
|
|
33
|
+
private _selectClosest;
|
|
34
|
+
private _syncSlot;
|
|
35
|
+
private _syncDirPasses;
|
|
36
|
+
private _syncPointPasses;
|
|
37
|
+
private _syncSpotPasses;
|
|
38
|
+
private _executeDirPasses;
|
|
39
|
+
private _executePointPasses;
|
|
40
|
+
private _executeSpotPasses;
|
|
41
|
+
private _writeUniforms;
|
|
42
|
+
private _writeSlotMap;
|
|
43
|
+
private _buildBindGroup;
|
|
44
|
+
destroy(): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=shadow-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow-manager.d.ts","sourceRoot":"","sources":["../src/shadow-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAY1D,MAAM,WAAW,mBAAmB;IAAG,SAAS,EAAE,YAAY,CAAC;CAAE;AAYjE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,SAAS,CAAsD;IACvE,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,WAAW,CAAuD;IAC1E,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IACrE,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAC5E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuC;IACxE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkD;IAClF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiF;IACzG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiF;gBAE7F,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,kBAAkB;IAM3F,MAAM,CACJ,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EACjE,WAAW,EAAE,cAAc,EAC3B,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC,GAAG,SAAS,EAC7D,gBAAgB,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAChH,mBAAmB;IAmBtB,yEAAyE;IACzE,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,cAAc;IAsDtB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,eAAe;IAqBvB,OAAO,IAAI,IAAI;CAMhB"}
|