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.
Files changed (50) hide show
  1. package/README.md +40 -22
  2. package/dist/engine.d.ts +14 -7
  3. package/dist/engine.d.ts.map +1 -1
  4. package/dist/engine.js +206 -77
  5. package/dist/shaders/body.d.ts +1 -1
  6. package/dist/shaders/body.d.ts.map +1 -1
  7. package/dist/shaders/body.js +58 -47
  8. package/dist/shaders/cloth_rough.d.ts +1 -1
  9. package/dist/shaders/cloth_rough.d.ts.map +1 -1
  10. package/dist/shaders/cloth_rough.js +38 -20
  11. package/dist/shaders/cloth_smooth.d.ts +1 -1
  12. package/dist/shaders/cloth_smooth.d.ts.map +1 -1
  13. package/dist/shaders/cloth_smooth.js +33 -18
  14. package/dist/shaders/default.d.ts +1 -1
  15. package/dist/shaders/default.d.ts.map +1 -1
  16. package/dist/shaders/default.js +45 -42
  17. package/dist/shaders/dfg_lut.d.ts +2 -3
  18. package/dist/shaders/dfg_lut.d.ts.map +1 -1
  19. package/dist/shaders/dfg_lut.js +30 -26
  20. package/dist/shaders/eye.d.ts +1 -1
  21. package/dist/shaders/eye.d.ts.map +1 -1
  22. package/dist/shaders/eye.js +47 -43
  23. package/dist/shaders/face.d.ts +1 -1
  24. package/dist/shaders/face.d.ts.map +1 -1
  25. package/dist/shaders/face.js +47 -23
  26. package/dist/shaders/hair.d.ts +1 -1
  27. package/dist/shaders/hair.d.ts.map +1 -1
  28. package/dist/shaders/hair.js +42 -32
  29. package/dist/shaders/metal.d.ts +1 -1
  30. package/dist/shaders/metal.d.ts.map +1 -1
  31. package/dist/shaders/metal.js +35 -19
  32. package/dist/shaders/nodes.d.ts +1 -1
  33. package/dist/shaders/nodes.d.ts.map +1 -1
  34. package/dist/shaders/nodes.js +79 -37
  35. package/dist/shaders/stockings.d.ts +1 -1
  36. package/dist/shaders/stockings.d.ts.map +1 -1
  37. package/dist/shaders/stockings.js +30 -15
  38. package/package.json +2 -2
  39. package/src/engine.ts +227 -97
  40. package/src/shaders/body.ts +58 -47
  41. package/src/shaders/cloth_rough.ts +38 -20
  42. package/src/shaders/cloth_smooth.ts +33 -18
  43. package/src/shaders/default.ts +46 -42
  44. package/src/shaders/dfg_lut.ts +32 -28
  45. package/src/shaders/eye.ts +48 -43
  46. package/src/shaders/face.ts +47 -23
  47. package/src/shaders/hair.ts +42 -32
  48. package/src/shaders/metal.ts +35 -19
  49. package/src/shaders/nodes.ts +79 -37
  50. 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 / 4096.0;
58
- var vis = 0.0;
59
- for (var y = -1; y <= 1; y++) {
60
- for (var x = -1; x <= 1; x++) {
61
- vis += textureSampleCompare(shadowMap, shadowSampler, suv + vec2f(f32(x), f32(y)) * ts, cmpZ);
62
- }
63
- }
64
- return vis / 9.0;
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
- output.normal = normalize(skinnedNrm);
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
- @fragment fn fs(input: VertexOutput) -> @location(0) vec4f {
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 = hue_sat(0.5, 1.0, 5.0, 1.0, tex_rgb);
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 split_sum = brdf_lut_baked(NV, STOCK_ROUGHNESS);
207
- let reflection_color = F_brdf_multi_scatter(f0, f90, split_sum);
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 * ltc_brdf_scale(NV, STOCK_ROUGHNESS);
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
- return vec4f(final_color, out_alpha);
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.0",
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
+ }