Skip to content

Commit eafc640

Browse files
authored
Merge pull request #12 from MPEGGroup/dev/MPEG_GS
Support for MPEG_GS extension AHG 26/04/26
2 parents c2e52b5 + 9f877da commit eafc640

9 files changed

Lines changed: 823 additions & 0 deletions

extensions/2.0/Vendor/MPEG_gaussian_splatting_transport/README.md

Lines changed: 572 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema",
3+
"title": "MPEG_gaussian_splatting_transport",
4+
"type": "object",
5+
"description": "MPEG transport and streaming extension for KHR_gaussian_splatting. Provides alternative SH coefficient layouts, progressive download signaling, timed media support, and mesh stitching.",
6+
"allOf": [{ "$ref": "glTFProperty.schema.json" }],
7+
"properties": {
8+
"shEncoding": {
9+
"$ref": "MPEG_gaussian_splatting_transport.shEncoding.schema.json"
10+
},
11+
"stitching": {
12+
"$ref": "MPEG_gaussian_splatting_transport.stitching.schema.json"
13+
},
14+
"extensions": {},
15+
"extras": {}
16+
},
17+
"required": ["shEncoding"]
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema",
3+
"title": "MPEG_gaussian_splatting_transport.shEncoding.mpegPerChannel",
4+
"type": "object",
5+
"description": "SH coefficients stored as per-channel SCALAR accessors. The DC term is excluded. Each channel contains 15 values per splat for degrees 1 to 3.",
6+
"allOf": [{ "$ref": "glTFProperty.schema.json" }],
7+
"properties": {
8+
"r": {
9+
"type": "integer",
10+
"description": "Accessor index for red channel coefficients (15 scalar values per splat).",
11+
"minimum": 0
12+
},
13+
"g": {
14+
"type": "integer",
15+
"description": "Accessor index for green channel coefficients (15 scalar values per splat).",
16+
"minimum": 0
17+
},
18+
"b": {
19+
"type": "integer",
20+
"description": "Accessor index for blue channel coefficients (15 scalar values per splat).",
21+
"minimum": 0
22+
},
23+
"extensions": {},
24+
"extras": {}
25+
},
26+
"required": ["r", "g", "b"]
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema",
3+
"title": "MPEG_gaussian_splatting_transport.shEncoding.mpegProgressive",
4+
"type": "object",
5+
"description": "SH coefficients stored as degree-group SCALAR accessors. The DC term is excluded.",
6+
"allOf": [{ "$ref": "glTFProperty.schema.json" }],
7+
"properties": {
8+
"first": {
9+
"type": "integer",
10+
"description": "Accessor index for degree 1 coefficients (9 scalar values per splat: 3 RGB triplets for coef 0..2).",
11+
"minimum": 0
12+
},
13+
"second": {
14+
"type": "integer",
15+
"description": "Accessor index for degree 2 coefficients (15 scalar values per splat: 5 RGB triplets for coef 0..4).",
16+
"minimum": 0
17+
},
18+
"third": {
19+
"type": "integer",
20+
"description": "Accessor index for degree 3 coefficients (21 scalar values per splat: 7 RGB triplets for coef 0..6).",
21+
"minimum": 0
22+
},
23+
"extensions": {},
24+
"extras": {}
25+
},
26+
"required": ["first"]
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema",
3+
"title": "MPEG_gaussian_splatting_transport.shEncoding.progressive",
4+
"type": "object",
5+
"description": "Progressive ordering of accessors for incremental download.",
6+
"allOf": [{ "$ref": "glTFProperty.schema.json" }],
7+
"properties": {
8+
"stages": {
9+
"type": "array",
10+
"description": "Array of progressive stages ordered from lower to higher fidelity.",
11+
"items": {
12+
"$ref": "MPEG_gaussian_splatting_transport.shEncoding.progressive.stage.schema.json"
13+
},
14+
"minItems": 1
15+
},
16+
"extensions": {},
17+
"extras": {}
18+
},
19+
"required": ["stages"]
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema",
3+
"title": "MPEG_gaussian_splatting_transport.shEncoding.progressive.stage",
4+
"type": "object",
5+
"description": "A progressive stage listing accessors that should be fetched together.",
6+
"allOf": [{ "$ref": "glTFProperty.schema.json" }],
7+
"properties": {
8+
"accessors": {
9+
"type": "array",
10+
"description": "Array of accessor indices to fetch for this stage. An accessor is timed if and only if it carries MPEG_accessor_timed.",
11+
"items": {
12+
"type": "integer",
13+
"minimum": 0
14+
},
15+
"minItems": 1
16+
},
17+
"extensions": {},
18+
"extras": {}
19+
},
20+
"required": ["accessors"]
21+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema",
3+
"title": "MPEG_gaussian_splatting_transport.shEncoding",
4+
"type": "object",
5+
"description": "Signals how SH coefficients are encoded for this splat primitive.",
6+
"allOf": [
7+
{ "$ref": "glTFProperty.schema.json" },
8+
{
9+
"if": {
10+
"properties": {
11+
"layout": { "const": "mpegProgressive" }
12+
}
13+
},
14+
"then": {
15+
"required": ["mpegProgressive"]
16+
}
17+
},
18+
{
19+
"if": {
20+
"properties": {
21+
"layout": { "const": "mpegPerChannel" }
22+
}
23+
},
24+
"then": {
25+
"required": ["mpegPerChannel"]
26+
}
27+
},
28+
{
29+
"if": {
30+
"properties": {
31+
"layout": { "const": "mpegProgressive" },
32+
"maxDegree": { "minimum": 2 }
33+
},
34+
"required": ["layout", "maxDegree"]
35+
},
36+
"then": {
37+
"properties": {
38+
"mpegProgressive": {
39+
"required": ["first", "second"]
40+
}
41+
}
42+
}
43+
}
44+
],
45+
"properties": {
46+
"layout": {
47+
"type": "string",
48+
"description": "Indicates the encoding mode of the SH coefficients.",
49+
"enum": ["khrPacked", "mpegProgressive", "mpegPerChannel"]
50+
},
51+
"maxDegree": {
52+
"type": "integer",
53+
"description": "Maximum SH degree available to the receiver.",
54+
"minimum": 0,
55+
"maximum": 3
56+
},
57+
"dcFromColor0": {
58+
"type": "boolean",
59+
"description": "If true, receivers reconstruct the degree-0 (DC) term from COLOR_0.rgb. If false, degree 0 is carried explicitly via KHR_gaussian_splatting:SH_DEGREE_0_COEF_0."
60+
},
61+
"mpegProgressive": {
62+
"$ref": "MPEG_gaussian_splatting_transport.shEncoding.mpegProgressive.schema.json"
63+
},
64+
"mpegPerChannel": {
65+
"$ref": "MPEG_gaussian_splatting_transport.shEncoding.mpegPerChannel.schema.json"
66+
},
67+
"progressive": {
68+
"$ref": "MPEG_gaussian_splatting_transport.shEncoding.progressive.schema.json"
69+
},
70+
"extensions": {},
71+
"extras": {}
72+
},
73+
"required": ["layout", "maxDegree", "dcFromColor0"]
74+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema",
3+
"title": "MPEG_gaussian_splatting_transport.stitching",
4+
"type": "object",
5+
"description": "Parameters to attach Gaussian splats to a 3D triangular mesh primitive.",
6+
"allOf": [{ "$ref": "glTFProperty.schema.json" }],
7+
"properties": {
8+
"mesh": {
9+
"type": "integer",
10+
"description": "Index of the mesh in the glTF meshes array to which the Gaussian splats are stitched.",
11+
"minimum": 0
12+
},
13+
"primitive": {
14+
"type": "integer",
15+
"description": "Index of the mesh primitive to which the Gaussian splats are stitched.",
16+
"minimum": 0
17+
},
18+
"vertices": {
19+
"type": "integer",
20+
"description": "Accessor index containing vertex indices defining splat locations on mesh vertices. Mutually exclusive with faces and weights.",
21+
"minimum": 0
22+
},
23+
"faces": {
24+
"type": "integer",
25+
"description": "Accessor index containing face indices defining splat locations on triangular faces. Mutually exclusive with vertices.",
26+
"minimum": 0
27+
},
28+
"weights": {
29+
"type": "integer",
30+
"description": "Accessor index containing barycentric weight triplets (VEC3). Required when faces is present.",
31+
"minimum": 0
32+
},
33+
"distances": {
34+
"type": "integer",
35+
"description": "Accessor index containing scalar distance values along the vertex or face normal.",
36+
"minimum": 0
37+
},
38+
"displacement": {
39+
"type": "integer",
40+
"description": "Accessor index containing 3D displacement vectors (VEC3) from the mesh surface.",
41+
"minimum": 0
42+
},
43+
"extensions": {},
44+
"extras": {}
45+
},
46+
"oneOf": [
47+
{
48+
"required": ["vertices"],
49+
"not": {
50+
"anyOf": [
51+
{ "required": ["faces"] },
52+
{ "required": ["weights"] }
53+
]
54+
}
55+
},
56+
{
57+
"required": ["faces", "weights"],
58+
"not": {
59+
"required": ["vertices"]
60+
}
61+
}
62+
]
63+
}

extensions/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ Vendor extensions are not covered by the Khronos IP framework.
102102
* [MPEG_animation_timing](2.0/Vendor/MPEG_animation_timing/README.md)
103103
* [MPEG_audio_spatial](2.0/Vendor/MPEG_audio_spatial/README.md)
104104
* [MPEG_buffer_circular](2.0/Vendor/MPEG_buffer_circular/README.md)
105+
* [MPEG_gaussian_splatting_transport](2.0/Vendor/MPEG_gaussian_splatting_transport/README.md)
105106
* [MPEG_media](2.0/Vendor/MPEG_media/README.md)
106107
* [MPEG_mesh_linking](2.0/Vendor/MPEG_mesh_linking/README.md)
107108
* [MPEG_scene_dynamic](2.0/Vendor/MPEG_scene_dynamic/README.md)

0 commit comments

Comments
 (0)