reze-engine 0.2.6 → 0.2.8
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 +24 -57
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +15 -13
- package/package.json +1 -1
- package/src/engine.ts +15 -13
package/README.md
CHANGED
|
@@ -14,37 +14,30 @@ A lightweight engine built with WebGPU and TypeScript for real-time 3D anime cha
|
|
|
14
14
|
- MSAA 4x anti-aliasing
|
|
15
15
|
- GPU-accelerated skinning
|
|
16
16
|
- Bone rotation api
|
|
17
|
+
- VMD animation
|
|
17
18
|
|
|
18
19
|
## Usage
|
|
19
20
|
|
|
20
|
-
```
|
|
21
|
-
export default function
|
|
22
|
-
const canvasRef = useRef<HTMLCanvasElement>
|
|
23
|
-
const engineRef = useRef<Engine
|
|
24
|
-
const [engineError, setEngineError] = useState<string | null>(null)
|
|
25
|
-
const [loading, setLoading] = useState(true)
|
|
26
|
-
const [stats, setStats] = useState<EngineStats>({
|
|
27
|
-
fps: 0,
|
|
28
|
-
frameTime: 0,
|
|
29
|
-
gpuMemory: 0,
|
|
30
|
-
})
|
|
31
|
-
const [progress, setProgress] = useState(0)
|
|
21
|
+
```javascript
|
|
22
|
+
export default function Scene() {
|
|
23
|
+
const canvasRef = useRef < HTMLCanvasElement > null
|
|
24
|
+
const engineRef = useRef < Engine > null
|
|
32
25
|
|
|
33
26
|
const initEngine = useCallback(async () => {
|
|
34
27
|
if (canvasRef.current) {
|
|
35
|
-
// Initialize engine
|
|
36
28
|
try {
|
|
37
|
-
const engine = new Engine(canvasRef.current
|
|
29
|
+
const engine = new Engine(canvasRef.current, {
|
|
30
|
+
ambient: 1.0,
|
|
31
|
+
rimLightIntensity: 0.1,
|
|
32
|
+
bloomIntensity: 0.1,
|
|
33
|
+
})
|
|
38
34
|
engineRef.current = engine
|
|
39
35
|
await engine.init()
|
|
40
36
|
await engine.loadModel("/models/塞尔凯特/塞尔凯特.pmx")
|
|
41
|
-
setLoading(false)
|
|
42
37
|
|
|
43
|
-
engine.runRenderLoop(() => {
|
|
44
|
-
setStats(engine.getStats())
|
|
45
|
-
})
|
|
38
|
+
engine.runRenderLoop(() => {})
|
|
46
39
|
} catch (error) {
|
|
47
|
-
|
|
40
|
+
console.error(error)
|
|
48
41
|
}
|
|
49
42
|
}
|
|
50
43
|
}, [])
|
|
@@ -54,7 +47,6 @@ export default function Home() {
|
|
|
54
47
|
initEngine()
|
|
55
48
|
})()
|
|
56
49
|
|
|
57
|
-
// Cleanup on unmount
|
|
58
50
|
return () => {
|
|
59
51
|
if (engineRef.current) {
|
|
60
52
|
engineRef.current.dispose()
|
|
@@ -62,43 +54,18 @@ export default function Home() {
|
|
|
62
54
|
}
|
|
63
55
|
}, [initEngine])
|
|
64
56
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
setProgress((prev) => {
|
|
69
|
-
if (prev >= 100) {
|
|
70
|
-
return 0
|
|
71
|
-
}
|
|
72
|
-
return prev + 1
|
|
73
|
-
})
|
|
74
|
-
}, 50)
|
|
57
|
+
return <canvas ref={canvasRef} className="w-full h-full" />
|
|
58
|
+
}
|
|
59
|
+
```
|
|
75
60
|
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
}, [loading])
|
|
61
|
+
## Projects Using This Engine
|
|
79
62
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
style={{
|
|
84
|
-
background:
|
|
85
|
-
"radial-gradient(ellipse at center, rgba(35, 35, 45, 0.8) 0%, rgba(35, 35, 45, 0.8) 8%, rgba(8, 8, 12, 0.95) 65%, rgba(0, 0, 0, 1) 100%)",
|
|
86
|
-
}}
|
|
87
|
-
>
|
|
88
|
-
<Header stats={stats} />
|
|
63
|
+
- **[MiKaPo](https://mikapo.vercel.app)** - Online real-time motion capture for MMD using webcam and MediaPipe
|
|
64
|
+
- **[Popo](https://popo.love)** - Fine-tuned LLM that generates MMD poses from natural language descriptions
|
|
65
|
+
- **[MPL](https://mmd-mpl.vercel.app)** - Semantic motion programming language for scripting MMD animations with intuitive syntax
|
|
89
66
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
{loading && !engineError && (
|
|
96
|
-
<div className="absolute inset-0 max-w-xs mx-auto w-full h-full flex items-center justify-center text-white p-6">
|
|
97
|
-
<Progress value={progress} className="rounded-none" />
|
|
98
|
-
</div>
|
|
99
|
-
)}
|
|
100
|
-
<canvas ref={canvasRef} className="absolute inset-0 w-full h-full touch-none z-1" />
|
|
101
|
-
</div>
|
|
102
|
-
)
|
|
103
|
-
}
|
|
104
|
-
```
|
|
67
|
+
## Tutorial
|
|
68
|
+
|
|
69
|
+
Learn WebGPU from scratch by building an anime character renderer in incremental steps. The tutorial covers the complete rendering pipeline from a simple triangle to fully textured, skeletal-animated characters.
|
|
70
|
+
|
|
71
|
+
[How to Render an Anime Character with WebGPU](https://reze.one/tutorial)
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.js
CHANGED
|
@@ -541,11 +541,14 @@ export class Engine {
|
|
|
541
541
|
},
|
|
542
542
|
],
|
|
543
543
|
},
|
|
544
|
-
primitive: { cullMode: "
|
|
544
|
+
primitive: { cullMode: "front" },
|
|
545
545
|
depthStencil: {
|
|
546
546
|
format: "depth24plus-stencil8",
|
|
547
|
-
depthWriteEnabled:
|
|
548
|
-
depthCompare: "less", //
|
|
547
|
+
depthWriteEnabled: true, // Write depth to occlude back of head
|
|
548
|
+
depthCompare: "less-equal", // More lenient to reduce precision conflicts
|
|
549
|
+
depthBias: -0.00005, // Reduced bias to minimize conflicts while still occluding back face
|
|
550
|
+
depthBiasSlopeScale: 0.0,
|
|
551
|
+
depthBiasClamp: 0.0,
|
|
549
552
|
stencilFront: {
|
|
550
553
|
compare: "always",
|
|
551
554
|
failOp: "keep",
|
|
@@ -639,11 +642,14 @@ export class Engine {
|
|
|
639
642
|
},
|
|
640
643
|
],
|
|
641
644
|
},
|
|
642
|
-
primitive: { cullMode: "
|
|
645
|
+
primitive: { cullMode: "front" },
|
|
643
646
|
depthStencil: {
|
|
644
647
|
format: "depth24plus-stencil8",
|
|
645
648
|
depthWriteEnabled: true,
|
|
646
|
-
depthCompare: "less",
|
|
649
|
+
depthCompare: "less-equal", // Match the color pass compare mode for consistency
|
|
650
|
+
depthBias: 0.0,
|
|
651
|
+
depthBiasSlopeScale: 0.0,
|
|
652
|
+
depthBiasClamp: 0.0,
|
|
647
653
|
},
|
|
648
654
|
multisample: { count: this.sampleCount },
|
|
649
655
|
});
|
|
@@ -692,11 +698,11 @@ export class Engine {
|
|
|
692
698
|
},
|
|
693
699
|
],
|
|
694
700
|
},
|
|
695
|
-
primitive: { cullMode: "
|
|
701
|
+
primitive: { cullMode: "front" },
|
|
696
702
|
depthStencil: {
|
|
697
703
|
format: "depth24plus-stencil8",
|
|
698
704
|
depthWriteEnabled: false, // Don't write depth (already written in pre-pass)
|
|
699
|
-
depthCompare: "equal", //
|
|
705
|
+
depthCompare: "less-equal", // More lenient than "equal" to avoid precision issues with MSAA
|
|
700
706
|
stencilFront: {
|
|
701
707
|
compare: "equal", // Only render where stencil == 1 (over eyes)
|
|
702
708
|
failOp: "keep",
|
|
@@ -757,11 +763,11 @@ export class Engine {
|
|
|
757
763
|
},
|
|
758
764
|
],
|
|
759
765
|
},
|
|
760
|
-
primitive: { cullMode: "
|
|
766
|
+
primitive: { cullMode: "front" },
|
|
761
767
|
depthStencil: {
|
|
762
768
|
format: "depth24plus-stencil8",
|
|
763
769
|
depthWriteEnabled: false, // Don't write depth (already written in pre-pass)
|
|
764
|
-
depthCompare: "equal", //
|
|
770
|
+
depthCompare: "less-equal", // More lenient than "equal" to avoid precision issues with MSAA
|
|
765
771
|
stencilFront: {
|
|
766
772
|
compare: "not-equal", // Only render where stencil != 1 (over non-eyes)
|
|
767
773
|
failOp: "keep",
|
|
@@ -1860,10 +1866,6 @@ export class Engine {
|
|
|
1860
1866
|
intensityData[0] = this.bloomIntensity;
|
|
1861
1867
|
this.device.queue.writeBuffer(this.bloomIntensityBuffer, 0, intensityData);
|
|
1862
1868
|
const encoder = this.device.createCommandEncoder();
|
|
1863
|
-
const width = this.canvas.width;
|
|
1864
|
-
const height = this.canvas.height;
|
|
1865
|
-
const bloomWidth = Math.floor(width / this.BLOOM_DOWNSCALE_FACTOR);
|
|
1866
|
-
const bloomHeight = Math.floor(height / this.BLOOM_DOWNSCALE_FACTOR);
|
|
1867
1869
|
// Extract bright areas
|
|
1868
1870
|
const extractPass = encoder.beginRenderPass({
|
|
1869
1871
|
label: "bloom extract",
|
package/package.json
CHANGED
package/src/engine.ts
CHANGED
|
@@ -641,11 +641,14 @@ export class Engine {
|
|
|
641
641
|
},
|
|
642
642
|
],
|
|
643
643
|
},
|
|
644
|
-
primitive: { cullMode: "
|
|
644
|
+
primitive: { cullMode: "front" },
|
|
645
645
|
depthStencil: {
|
|
646
646
|
format: "depth24plus-stencil8",
|
|
647
|
-
depthWriteEnabled:
|
|
648
|
-
depthCompare: "less", //
|
|
647
|
+
depthWriteEnabled: true, // Write depth to occlude back of head
|
|
648
|
+
depthCompare: "less-equal", // More lenient to reduce precision conflicts
|
|
649
|
+
depthBias: -0.00005, // Reduced bias to minimize conflicts while still occluding back face
|
|
650
|
+
depthBiasSlopeScale: 0.0,
|
|
651
|
+
depthBiasClamp: 0.0,
|
|
649
652
|
stencilFront: {
|
|
650
653
|
compare: "always",
|
|
651
654
|
failOp: "keep",
|
|
@@ -741,11 +744,14 @@ export class Engine {
|
|
|
741
744
|
},
|
|
742
745
|
],
|
|
743
746
|
},
|
|
744
|
-
primitive: { cullMode: "
|
|
747
|
+
primitive: { cullMode: "front" },
|
|
745
748
|
depthStencil: {
|
|
746
749
|
format: "depth24plus-stencil8",
|
|
747
750
|
depthWriteEnabled: true,
|
|
748
|
-
depthCompare: "less",
|
|
751
|
+
depthCompare: "less-equal", // Match the color pass compare mode for consistency
|
|
752
|
+
depthBias: 0.0,
|
|
753
|
+
depthBiasSlopeScale: 0.0,
|
|
754
|
+
depthBiasClamp: 0.0,
|
|
749
755
|
},
|
|
750
756
|
multisample: { count: this.sampleCount },
|
|
751
757
|
})
|
|
@@ -795,11 +801,11 @@ export class Engine {
|
|
|
795
801
|
},
|
|
796
802
|
],
|
|
797
803
|
},
|
|
798
|
-
primitive: { cullMode: "
|
|
804
|
+
primitive: { cullMode: "front" },
|
|
799
805
|
depthStencil: {
|
|
800
806
|
format: "depth24plus-stencil8",
|
|
801
807
|
depthWriteEnabled: false, // Don't write depth (already written in pre-pass)
|
|
802
|
-
depthCompare: "equal", //
|
|
808
|
+
depthCompare: "less-equal", // More lenient than "equal" to avoid precision issues with MSAA
|
|
803
809
|
stencilFront: {
|
|
804
810
|
compare: "equal", // Only render where stencil == 1 (over eyes)
|
|
805
811
|
failOp: "keep",
|
|
@@ -861,11 +867,11 @@ export class Engine {
|
|
|
861
867
|
},
|
|
862
868
|
],
|
|
863
869
|
},
|
|
864
|
-
primitive: { cullMode: "
|
|
870
|
+
primitive: { cullMode: "front" },
|
|
865
871
|
depthStencil: {
|
|
866
872
|
format: "depth24plus-stencil8",
|
|
867
873
|
depthWriteEnabled: false, // Don't write depth (already written in pre-pass)
|
|
868
|
-
depthCompare: "equal", //
|
|
874
|
+
depthCompare: "less-equal", // More lenient than "equal" to avoid precision issues with MSAA
|
|
869
875
|
stencilFront: {
|
|
870
876
|
compare: "not-equal", // Only render where stencil != 1 (over non-eyes)
|
|
871
877
|
failOp: "keep",
|
|
@@ -2117,10 +2123,6 @@ export class Engine {
|
|
|
2117
2123
|
this.device.queue.writeBuffer(this.bloomIntensityBuffer, 0, intensityData)
|
|
2118
2124
|
|
|
2119
2125
|
const encoder = this.device.createCommandEncoder()
|
|
2120
|
-
const width = this.canvas.width
|
|
2121
|
-
const height = this.canvas.height
|
|
2122
|
-
const bloomWidth = Math.floor(width / this.BLOOM_DOWNSCALE_FACTOR)
|
|
2123
|
-
const bloomHeight = Math.floor(height / this.BLOOM_DOWNSCALE_FACTOR)
|
|
2124
2126
|
|
|
2125
2127
|
// Extract bright areas
|
|
2126
2128
|
const extractPass = encoder.beginRenderPass({
|