reze-engine 0.11.0 → 0.11.2
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/README.md +40 -22
- package/dist/engine.d.ts +14 -7
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +206 -77
- package/dist/shaders/body.d.ts +1 -1
- package/dist/shaders/body.d.ts.map +1 -1
- package/dist/shaders/body.js +58 -47
- package/dist/shaders/cloth_rough.d.ts +1 -1
- package/dist/shaders/cloth_rough.d.ts.map +1 -1
- package/dist/shaders/cloth_rough.js +38 -20
- package/dist/shaders/cloth_smooth.d.ts +1 -1
- package/dist/shaders/cloth_smooth.d.ts.map +1 -1
- package/dist/shaders/cloth_smooth.js +33 -18
- package/dist/shaders/default.d.ts +1 -1
- package/dist/shaders/default.d.ts.map +1 -1
- package/dist/shaders/default.js +45 -42
- package/dist/shaders/dfg_lut.d.ts +2 -3
- package/dist/shaders/dfg_lut.d.ts.map +1 -1
- package/dist/shaders/dfg_lut.js +30 -26
- package/dist/shaders/eye.d.ts +1 -1
- package/dist/shaders/eye.d.ts.map +1 -1
- package/dist/shaders/eye.js +47 -43
- package/dist/shaders/face.d.ts +1 -1
- package/dist/shaders/face.d.ts.map +1 -1
- package/dist/shaders/face.js +47 -23
- package/dist/shaders/hair.d.ts +1 -1
- package/dist/shaders/hair.d.ts.map +1 -1
- package/dist/shaders/hair.js +42 -32
- package/dist/shaders/metal.d.ts +1 -1
- package/dist/shaders/metal.d.ts.map +1 -1
- package/dist/shaders/metal.js +35 -19
- package/dist/shaders/nodes.d.ts +1 -1
- package/dist/shaders/nodes.d.ts.map +1 -1
- package/dist/shaders/nodes.js +79 -37
- package/dist/shaders/stockings.d.ts +1 -1
- package/dist/shaders/stockings.d.ts.map +1 -1
- package/dist/shaders/stockings.js +30 -15
- package/package.json +2 -2
- package/src/engine.ts +227 -97
- package/src/shaders/body.ts +58 -47
- package/src/shaders/cloth_rough.ts +38 -20
- package/src/shaders/cloth_smooth.ts +33 -18
- package/src/shaders/default.ts +46 -42
- package/src/shaders/dfg_lut.ts +32 -28
- package/src/shaders/eye.ts +48 -43
- package/src/shaders/face.ts +47 -23
- package/src/shaders/hair.ts +42 -32
- package/src/shaders/metal.ts +35 -19
- package/src/shaders/nodes.ts +79 -37
- package/src/shaders/stockings.ts +30 -15
|
@@ -49,19 +49,25 @@ struct LightVP { viewProj: mat4x4f, };
|
|
|
49
49
|
@group(2) @binding(1) var<uniform> material: MaterialUniforms;
|
|
50
50
|
|
|
51
51
|
fn sampleShadow(worldPos: vec3f, n: vec3f) -> f32 {
|
|
52
|
+
// Back-facing to key light: direct contribution is zero anyway, skip 9 texture samples.
|
|
53
|
+
if (dot(n, -light.lights[0].direction.xyz) <= 0.0) { return 0.0; }
|
|
52
54
|
let biasedPos = worldPos + n * 0.08;
|
|
53
55
|
let lclip = lightVP.viewProj * vec4f(biasedPos, 1.0);
|
|
54
56
|
let ndc = lclip.xyz / max(lclip.w, 1e-6);
|
|
55
57
|
let suv = vec2f(ndc.x * 0.5 + 0.5, 0.5 - ndc.y * 0.5);
|
|
56
58
|
let cmpZ = ndc.z - 0.001;
|
|
57
|
-
let ts = 1.0 /
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
59
|
+
let ts = 1.0 / 2048.0;
|
|
60
|
+
// 3x3 PCF unrolled — Safari's Metal backend doesn't unroll nested shadow loops reliably.
|
|
61
|
+
let s00 = textureSampleCompareLevel(shadowMap, shadowSampler, suv + vec2f(-ts, -ts), cmpZ);
|
|
62
|
+
let s10 = textureSampleCompareLevel(shadowMap, shadowSampler, suv + vec2f(0.0, -ts), cmpZ);
|
|
63
|
+
let s20 = textureSampleCompareLevel(shadowMap, shadowSampler, suv + vec2f( ts, -ts), cmpZ);
|
|
64
|
+
let s01 = textureSampleCompareLevel(shadowMap, shadowSampler, suv + vec2f(-ts, 0.0), cmpZ);
|
|
65
|
+
let s11 = textureSampleCompareLevel(shadowMap, shadowSampler, suv, cmpZ);
|
|
66
|
+
let s21 = textureSampleCompareLevel(shadowMap, shadowSampler, suv + vec2f( ts, 0.0), cmpZ);
|
|
67
|
+
let s02 = textureSampleCompareLevel(shadowMap, shadowSampler, suv + vec2f(-ts, ts), cmpZ);
|
|
68
|
+
let s12 = textureSampleCompareLevel(shadowMap, shadowSampler, suv + vec2f(0.0, ts), cmpZ);
|
|
69
|
+
let s22 = textureSampleCompareLevel(shadowMap, shadowSampler, suv + vec2f( ts, ts), cmpZ);
|
|
70
|
+
return (s00 + s10 + s20 + s01 + s11 + s21 + s02 + s12 + s22) * (1.0 / 9.0);
|
|
65
71
|
}
|
|
66
72
|
|
|
67
73
|
const PI_S: f32 = 3.141592653589793;
|
|
@@ -142,13 +148,19 @@ fn ramp_ease_s(f: f32, p0: f32, p1: f32) -> f32 {
|
|
|
142
148
|
skinnedNrm += (mat3x3f(m[0].xyz, m[1].xyz, m[2].xyz) * normal) * w;
|
|
143
149
|
}
|
|
144
150
|
output.position = camera.projection * camera.view * vec4f(skinnedPos.xyz, 1.0);
|
|
145
|
-
|
|
151
|
+
// Skip VS normalize — interpolation denormalizes anyway, and FS always does normalize(input.normal).
|
|
152
|
+
output.normal = skinnedNrm;
|
|
146
153
|
output.uv = uv;
|
|
147
154
|
output.worldPos = skinnedPos.xyz;
|
|
148
155
|
return output;
|
|
149
156
|
}
|
|
150
157
|
|
|
151
|
-
|
|
158
|
+
struct FSOut {
|
|
159
|
+
@location(0) color: vec4f,
|
|
160
|
+
@location(1) bloom_mask: f32,
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
@fragment fn fs(input: VertexOutput) -> FSOut {
|
|
152
164
|
let n = normalize(input.normal);
|
|
153
165
|
let v = normalize(camera.viewPos - input.worldPos);
|
|
154
166
|
let l = -light.lights[0].direction.xyz;
|
|
@@ -192,7 +204,7 @@ fn ramp_ease_s(f: f32, p0: f32, p1: f32) -> f32 {
|
|
|
192
204
|
|
|
193
205
|
// ═══ EMISSION SHADER ═══
|
|
194
206
|
// Hue=0.5 (identity rotation), Sat=1.0, Val=5.0 (5× brightness boost), Fac=1; Strength=1
|
|
195
|
-
let emission =
|
|
207
|
+
let emission = hue_sat_id(1.0, 5.0, 1.0, tex_rgb);
|
|
196
208
|
|
|
197
209
|
// ═══ PRINCIPLED BSDF (EEVEE port) ═══
|
|
198
210
|
// base_color_tint, metallic f0, sheen coarse approx (scales diffuse radiance).
|
|
@@ -203,10 +215,10 @@ fn ramp_ease_s(f: f32, p0: f32, p1: f32) -> f32 {
|
|
|
203
215
|
let dielectric_f0 = vec3f(0.08 * STOCK_SPECULAR);
|
|
204
216
|
let f0 = mix(dielectric_f0, tex_rgb, STOCK_METALLIC);
|
|
205
217
|
let f90 = mix(f0, vec3f(1.0), sqrt(STOCK_SPECULAR));
|
|
206
|
-
let
|
|
207
|
-
let reflection_color = F_brdf_multi_scatter(f0, f90,
|
|
218
|
+
let brdf_lut = brdf_lut_sample(NV, STOCK_ROUGHNESS);
|
|
219
|
+
let reflection_color = F_brdf_multi_scatter(f0, f90, brdf_lut.xy);
|
|
208
220
|
|
|
209
|
-
let spec_direct = bsdf_ggx(n, l, v, STOCK_ROUGHNESS) * sun * shadow *
|
|
221
|
+
let spec_direct = bsdf_ggx(n, l, v, NL, NV, STOCK_ROUGHNESS) * sun * shadow * ltc_brdf_scale_from_lut(brdf_lut);
|
|
210
222
|
let spec_indirect = amb;
|
|
211
223
|
let spec_radiance = (spec_direct + spec_indirect) * reflection_color;
|
|
212
224
|
|
|
@@ -223,7 +235,10 @@ fn ramp_ease_s(f: f32, p0: f32, p1: f32) -> f32 {
|
|
|
223
235
|
// ═══ MIX SHADER: Shader=Emission, Shader_001=Principled, Fac=mask ═══
|
|
224
236
|
let final_color = mix(emission, principled, mask);
|
|
225
237
|
|
|
226
|
-
|
|
238
|
+
var out: FSOut;
|
|
239
|
+
out.color = vec4f(final_color, out_alpha);
|
|
240
|
+
out.bloom_mask = 1.0;
|
|
241
|
+
return out;
|
|
227
242
|
}
|
|
228
243
|
|
|
229
244
|
`;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reze-engine",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.2",
|
|
4
4
|
"description": "A lightweight WebGPU engine for real-time 3D MMD/PMX model rendering",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -43,4 +43,4 @@
|
|
|
43
43
|
"@types/node": "^20",
|
|
44
44
|
"typescript": "^5"
|
|
45
45
|
}
|
|
46
|
-
}
|
|
46
|
+
}
|