-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
KHR_draco_mesh_compression #874
Changes from 43 commits
acfd558
6472e25
41432dc
66dfde1
eae186d
3dff72b
54db399
65e79d3
b132fa0
7c48fb7
007e570
7e7ff5d
ca7c8ee
ddf534f
1d4ab96
251452d
260534e
ea273be
198792f
5956b53
f60ff63
61bd686
2c3a051
3c14401
a502855
fba95f4
c765c2f
0cd8f60
6102695
63f07ee
a8f4e06
d0d5fa8
1da7ae2
85673d4
99b131c
306e5bc
ae9c8d6
9039f52
0cdbd3c
d643d96
ae30e83
2cba5c2
e71f0d8
e3cce40
66bfc6d
734b3cb
e42d251
8e9a344
1eba79a
cb478d9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
# KHR_draco_mesh_compression | ||
|
||
## Contributors | ||
|
||
* Fan Zhang, Google, <mailto:zhafang@google.com> | ||
* Ondrej Stava, Google, <mailto:ostava@google.com> | ||
* Frank Galligan, Google, <mailto:fgalligan@google.com> | ||
* Kai Ninomiya, Google, <mailto:kainino@google.com> | ||
* Patrick Cozzi, Cesium, [@pjcozzi](https://twitter.com/pjcozzi) | ||
|
||
## Status | ||
|
||
Draft | ||
|
||
## Dependencies | ||
|
||
Written against the glTF 2.0 spec. | ||
|
||
## Overview | ||
|
||
This extension defines a schema to use [Draco geometry compression](https://github.com/google/draco) libraries in glTF format. This allows glTF to support streaming compressed geometry data instead of the raw data. This extension specification is based on [Draco bitestream version 2.0](https://google.github.io/draco/spec/). | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Draco bitestream version 2.2 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
|
||
The [conformance](#conformance) section specifies what an implementation must do when encountering this extension, and how the extension interacts with the attributes defined in the base specification. | ||
|
||
## glTF Schema Updates | ||
|
||
Draco geometry compression library could be used for `primitive` by adding an `extension` property to a primitive, and defining its `KHR_draco_mesh_compression` property. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unless the loader doesn't support Draco and use the fallback uncompressed data? |
||
|
||
The following picture shows the structure of the schema update. | ||
|
||
**Figure 1**: Structure of geometry compression extension. | ||
![](figures/structure.png) | ||
|
||
In general, we will use the extension to point to the buffer that contains the compressed data. One of the requirements is that a loader/engine should be able to load the glTF assets no matter it supports the extension or not. To achieve that, all the existing components of the glTF specification stays the same when the extension exists, so that a loader doesn't support decoding compressed assets could just ignore the extension. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The Draco extension points to the buffer that contains the compressed data. If the uncompressed version of the asset is not provided, then "extensionsRequired" : [
"KHR_draco_mesh_compression"
]
If If a Draco compressed version of the asset is provided then "extensionsUsed" : [
"KHR_draco_mesh_compression"
]
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done. |
||
|
||
Usage of the extension must be listed in the `extensionUsed`. | ||
|
||
```javascript | ||
"extensionsUsed" : [ | ||
"KHR_draco_mesh_compression" | ||
] | ||
|
||
``` | ||
|
||
The extension then could be used like the following, note that all other nodes stay the same | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Below is an example of what a part of a glTF file may look like if the Draco extension is set. Note that all other nodes stay the same except There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done. |
||
except `primitives`: | ||
|
||
```javascript | ||
|
||
"mesh" : { | ||
"primitives" : [ | ||
{ | ||
"attributes" : { | ||
"POSITION" : 11, | ||
"NORMAL" : 12, | ||
"TEXCOORD_0" : 13, | ||
"WEIGHTS_0" : 14, | ||
"JOINTS_0" : 15, | ||
}, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The attributes above are ignored when the extension is present, correct? Or do these accessors have some special meaning to the Draco extension? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In practical, for an implementation of loader like ThreeJS, it might be OK to ignore the attributes. But it is preferred not to ignore There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So I assume you mean that the primitive might list additional attributes here, beyond those encoded in the Draco buffer? If so, then let's clarify this example by changing
... in which case, a loader would be expected to load POSITION, NORMAL, and TEXCOORD_0 from the Draco buffer, and then to add TEXCOORD_1 from a traditional accessor. Alternatively, do we consider it valid to include POSITION in In previous comments, |
||
"indices" : 10, | ||
"mode" : 4 | ||
"extensions" : { | ||
"KHR_draco_mesh_compression" : { | ||
"bufferView" : 5, | ||
"attributes" : { | ||
"POSITION" : 0, | ||
"NORMAL" : 1, | ||
"TEXCOORD_0" : 2, | ||
"WEIGHTS_0" : 3, | ||
"JOINTS_0" : 4 | ||
}, | ||
} | ||
} | ||
}, | ||
] | ||
} | ||
|
||
"bufferViews" : [ | ||
// ... | ||
// bufferView of Id 5 | ||
{ | ||
"buffer" : 10, | ||
"byteOffset" : 1024, | ||
"byteLength" : 10000 | ||
} | ||
// ... | ||
} | ||
|
||
``` | ||
We will explain each of the property in the following sections. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. properties Should we just remove this line? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Removed. |
||
#### bufferView | ||
The `bufferView` property points to the buffer containing compressed data. The data should be passed to a mesh decoder and decompressed to a | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
mesh. | ||
|
||
### attributes | ||
`attributes` defines the attributes stored in the decompressed geometry. E.g, in the example above, `POSITION`, `NORMAL`, `TEXCOORD_0`, `WEIGHTS_0` and `JOINTS_0`. Each attribute is associated with an attribute id which is its unique id in the compressed data. The `attributes` defined in the extension must be a subset of the attributes of the primitive. To request an attribute, loaders should be able to use the correspondent attribute id specified in the `attributes` to get the attribute from the compressed data. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should -> must There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
|
||
#### Restrictions on geometry type | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When using this extension, the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
When using this extension, the `mode` of `primitive` could only be one of `TRIANGLES` and `TRIANGLE_STRIP` and the mesh data will be decoded accordingly. | ||
|
||
### JSON Schema | ||
|
||
For full details on the `KHR_draco_mesh_compression` extension properties, see the schema: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It could be cool to try the latest wetzel (CesiumGS/wetzel#4) to generate reference doc to paste in here like the glTF spec has. |
||
|
||
* [extension property](schema/node.KHR_draco_mesh_compression.schema.json) `KHR_draco_mesh_compression` extensions object. | ||
|
||
## Conformance | ||
|
||
To process this extension, there are some changes need to be made in loading a glTF asset. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Below is the process when a loader encounters a glTF asset with the Draco extension set: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
* If `KHR_draco_mesh_compression` is in `extensionsRequired` then the loader must support the extension or it will fail loading the assets. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
* If `KHR_draco_mesh_compression` is in `extensionsUsed` but not `extensionsRequired`: | ||
* Check if the loader supports the extension. If not, then load the glTF asset ignoring the compression extension in `primitive`. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If the loader does not support the Draco extension, then load the glTF asset ignoring There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
* If the loader supports the extension, then process the extension and ignore the attributes and indices of the primitive that are contained in the extension. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
* When encountering a `primitive` with the extension the first time, you must process the extension first. Get the data from the pointed `bufferView` in the extension and decompress the data to a geometry of a specific format, e.g. Draco geometry. | ||
* Then, process `attributes` and `indices` properties of the `primitive`. When loading each `accessor`, go to the previously decoded geometry in the `primitive` to get indices and attributes data. A loader could use the decompressed data to overwrite `accessors` or render the decompressed geometry directly (e.g. ThreeJS). | ||
|
||
It is pretty straightforward for top-down loading of a glTF asset, e.g. only | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove this section There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
decompress the geometry data when a `primitive` is met for the first time. However, for | ||
bottom-up loading, loading `accessor` before `primitive` will not get the data. It could only be handled when processing its parent `primitive`. This is based on the consideration that it will rarely happen that | ||
loading an `accessor` without knowing its parent `primitive`. And it should be | ||
easy enough to change the loader to ignore `accessor` without `bufferView` in glTF 2.0. But we are | ||
definitely open to change this if there actually are some use cases that require | ||
loading `accessor` independently. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Per comment above, could I suggest that the |
||
|
||
The extension provides compressed alternatives to one or more of a primitive's uncompressed attributes. A loader may choose to use the uncompressed attributes instead — when the extension is not supported, or for other reasons. When using compressed Draco data, the corresponding uncompressed attributes defined by the primitive should be ignored. If additional uncompressed attributes are defined by the primitive, but are not provided by the Draco extension, the loader must proceed to use these additional attributes as usual. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can remove this section as well and replace it with this (which will be part of the list above.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
|
||
* Implementation note: To prevent transmission of redundant data, exporters should generally write compressed Draco data into a separate buffer from the uncompressed fallback, and shared data into a third buffer. Loaders may then optimize to request only the necessary buffers. | ||
|
||
If the uncompressed version of asset is not provided for the fallback described above, then the extension must be added to `extensionsRequired` so that the loaders/engines don't support the extension could report failure. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can remove this line with the re-worked paragraph above. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
|
||
## Resources | ||
|
||
* [Draco Open Source Library](https://github.com/google/draco) | ||
* [ThreeJS | ||
Loader](https://github.com/mrdoob/three.js/blob/dev/examples/js/loaders/DRACOLoader.js) | ||
and | ||
[example](https://github.com/mrdoob/three.js/blob/dev/examples/webgl_loader_draco.html) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
{ | ||
"$schema": "http://json-schema.org/draft-04/schema", | ||
"title": "KHR_draco_mesh_compression extension", | ||
"type": "object", | ||
"properties": { | ||
"bufferView": { | ||
"allOf": [ { "$ref" : "glTFid.schema.json" } ], | ||
"description": "The index of the bufferView." | ||
}, | ||
"attributes": { | ||
"type": "object", | ||
"minProperties": 1, | ||
"additionalProperties": { | ||
"$ref": "glTFid.schema.json" | ||
}, | ||
"description": "A dictionary object, where each key corresponds to an attribute and its unique attribute id stored in the compressed geometry." | ||
} | ||
}, | ||
"additionalProperties": false, | ||
"required": [ "bufferView", "attributes" ] | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All Khronos specifications should contain the standard Copyright Header:
https://www.khronos.org/members/login/groups/Agreements%20and%20Licenses/Open%20Source%20Repository%20Resources/Khronos%20Specification%20Copyright%20License%20Header%20V3%20May17.txt
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As the Draco extension is referring to significant external documents – namely the Bitstream specification we should also include, and be consistent with the additional header wording for normative clarity:
https://www.khronos.org/members/login/groups/Agreements%20and%20Licenses/Open%20Source%20Repository%20Resources/Khronos%20Copyright%20License%20Header%20Addition%20for%20NORMATIVE%20CLARITY%20Oct17.txt Note - this has some boiler plate that needs to be tweaked to fit the spec.
The key text in the header is:
Some parts of this Specification are purely informative and do not define requirements
necessary for compliance and so are outside the Scope of this Specification. These
parts of the Specification are marked by the "
Note
" icon or designated "Informative
"<replace/insert specific conventions for the specification here>.
And
Where this Specification includes normative references to external documents, only the
specifically identified sections and functionality of those external documents are in
Scope. Requirements defined by external documents not created by Khronos may contain
contributions from non-members of Khronos not covered by the Khronos Intellectual
Property Rights Policy.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done