Skip to content
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

Merge KHR_texture_transform. #1372

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
8eec95a
Started on offset/tile extension
Jun 13, 2017
6b8c273
Add schema
Jun 13, 2017
ac265c4
Finish readme, add link from extension list
Jun 13, 2017
fd7d5b6
Fix table formatting
Jun 13, 2017
4cfe683
Rename extension, move data to texture
Jun 13, 2017
59d6db7
Addressed comments
Jun 13, 2017
80d2cd6
Fix missed rename, typos, update schema descriptions
Jun 14, 2017
ab854c8
Moved offset/tile settings to textureInfo objects
Jun 14, 2017
2fcdf48
AVR>EXT, tile>scale, removed value restrictions
stevenvergenz Nov 7, 2017
ee93bfa
Update name again, rewrite schema
stevenvergenz Nov 7, 2017
9fe23ed
Update name to take into account addition of rotation field
stevenvergenz Nov 7, 2017
5561f1d
Change prefix to MSFT
stevenvergenz Nov 8, 2017
7f2168a
Move back to EXT prefix, remove rotation/matrix, add texCoord
stevenvergenz Nov 8, 2017
7a50089
Update schema with missing items
stevenvergenz Nov 10, 2017
60a87fb
Fix schema
stevenvergenz Nov 10, 2017
330a1da
Fix default in readme
stevenvergenz Nov 10, 2017
b81d56e
Add rotation back in
stevenvergenz Feb 22, 2018
28625d4
EXT_texture_transform -> KHR_texture_transform as agreed during Feb21…
Feb 28, 2018
e06463a
Move texture_transform to match new folder structure and fix minor ty…
MiiBond Apr 4, 2018
b386314
Fix examples
lexaknyazev Apr 11, 2018
b912c10
Fix property name in samples
lexaknyazev Apr 12, 2018
22688e1
Add implementation note on UV origin.
May 24, 2018
382b18a
Update status.
Jul 3, 2018
290edd9
Add KHR_materials_unlit extension.
donmccurdy Sep 10, 2017
9ecdc98
Restore vendor extensions list (broken in rebase)
Jul 3, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions extensions/2.0/Khronos/KHR_texture_transform/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# KHR_texture_transform

## Contributors

* Steven Vergenz, Microsoft ([[email protected]](mailto:[email protected]))

## Status

Complete

## Dependencies

Written against the glTF 2.0 spec.

## Overview

Many techniques can be used to optimize resource usage for a 3d scene. Chief among them is the ability to minimize the number of textures the GPU must load. To achieve this, many engines encourage packing many objects' low-resolution textures into a single large texture atlas. The region of the resulting atlas that corresponds with each object is then defined by vertical and horizontal offsets, and the width and height of the region.

To support this use case, this extension adds `offset`, `rotation`, and `scale` properties to textureInfo structures. These properties would typically be implemented as an affine transform on the UV coordinates. In GLSL:

```glsl
varying in vec2 Uv;

uniform vec2 Offset, Scale;
uniform float Rotation;

mat3 translation = mat3(1,0,0, 0,1,0, Offset.x, Offset.y, 1);
mat3 rotation = mat3(
cos(Rotation), sin(Rotation), 0,
-sin(Rotation), cos(Rotation), 0,
0, 0, 1
);
mat3 scale = mat3(Scale.x,0,0, 0,Scale.y,0, 0,0,1);

mat3 matrix = translation * rotation * scale;
vec2 uvTransformed = ( matrix * vec3(Uv.xy, 1) ).xy;
```

This is equivalent to Unity's `Material#SetTextureOffset` and `Material#SetTextureScale`, or Three.js's `Texture#offset` and `Texture#repeat`. UV rotation is not widely supported as of today, but is included here for forward compatibility.

## glTF Schema Updates

The `KHR_texture_transform` extension may be defined on `textureInfo` structures. It may contain the following properties:

| Name | Type | Default | Description
|------------|------------|--------------|---------------------------------
| `offset` | `array[2]` | `[0.0, 0.0]` | The offset of the UV coordinate origin as a factor of the texture dimensions.
| `rotation` | `number` | `0.0` | Rotate the UVs by this many radians counter-clockwise around the origin. This is equivalent to a similar rotation of the image clockwise.
| `scale` | `array[2]` | `[1.0, 1.0]` | The scale factor applied to the components of the UV coordinates.
| `texCoord` | `integer` | | Overrides the textureInfo texCoord value if supplied, and if this extension is supported.

Though this extension's values are unbounded, they will only produce sane results if the texture sampler's `wrap` mode is `REPEAT`, or if the result of the final UV transformation is within the range [0, 1] (i.e. negative scale settings and correspondingly positive offsets).

> **Implementation Note**: For maximum compatibility, it is recommended that exporters generate UV coordinate sets both with and without transforms applied, use the post-transform set in the texture `texCoord` field, then the pre-transform set with this extension. This way, if the extension is not supported by the consuming engine, the model still renders correctly. Including both will increase the size of the model, so if including the fallback UV set is too burdensome, either add this extension to `extensionsRequired` or use the same texCoord value in both places.

> **Implementation Note**: From the glTF core specification, the origin of the UV coordinates (0, 0) corresponds to the upper left corner of a texture image.

### JSON Schema

[KHR_texture_transform.textureInfo.schema.json](schema/KHR_texture_transform.textureInfo.schema.json)

### Example JSON

This example utilizes only the lower left quadrant of the source image, rotated clockwise 90°.

```json
{
"materials": [{
"emissiveTexture": {
"index": 0,
"extensions": {
"KHR_texture_transform": {
"offset": [0, 1],
"rotation": 1.57079632679,
"scale": [0.5, 0.5]
}
}
}
}]
}
```

This example inverts the T axis, effectively defining a bottom-left origin.

```json
{
"materials": [{
"emissiveTexture": {
"index": 0,
"extensions": {
"KHR_texture_transform": {
"offset": [0, 1],
"scale": [1, -1]
}
}
}
}]
}
```

## Known Implementations

* [UnityGLTF](https://github.com/KhronosGroup/UnityGLTF)
* [Babylon.js](https://www.babylonjs.com/)
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"$schema" : "http://json-schema.org/draft-04/schema",
"title" : "KHR_texture_transform textureInfo extension",
"type" : "object",
"description": "glTF extension that enables shifting and scaling UV coordinates on a per-texture basis",
"allOf": [ { "$ref": "glTFProperty.schema.json" } ],
"properties" : {
"offset": {
"type": "array",
"description": "The offset of the UV coordinate origin as a factor of the texture dimensions.",
"items": {
"type": "number"
},
"minItems": 2,
"maxItems": 2,
"default": [ 0.0, 0.0 ]
},
"rotation": {
"type": "number",
"description": "Rotate the UVs by this many radians counter-clockwise around the origin.",
"default": 0.0
},
"scale": {
"type": "array",
"description": "The scale factor applied to the components of the UV coordinates.",
"items": {
"type": "number"
},
"minItems": 2,
"maxItems": 2,
"default": [ 1.0, 1.0 ]
},
"texCoord": {
"type": "integer",
"description": "Overrides the textureInfo texCoord value if supplied, and if this extension is supported.",
"minimum": 0
},
"extensions": { },
"extras": { }
},
"additionalProperties" : false
}
3 changes: 1 addition & 2 deletions extensions/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
* [KHR_materials_pbrSpecularGlossiness](2.0/Khronos/KHR_materials_pbrSpecularGlossiness/README.md)
* [KHR_materials_unlit](2.0/Khronos/KHR_materials_unlit/README.md)
* [KHR_draco_mesh_compression](2.0/Khronos/KHR_draco_mesh_compression/README.md)
* [KHR_texture_transform](2.0/Khronos/KHR_texture_transform/README.md)

#### Draft Khronos extensions
_Draft Khronos extensions are not ratified yet._
* KHR_lights *(in progress)*
* KHR_technique_webgl *(in progress)*
* KHR_texture_transform *(in progress)*

#### Vendor extensions

Expand All @@ -20,7 +20,6 @@ _Draft Khronos extensions are not ratified yet._
* [MSFT_packing_normalRoughnessMetallic](2.0/Vendor/MSFT_packing_normalRoughnessMetallic/README.md)
* [MSFT_packing_occlusionRoughnessMetallic](2.0/Vendor/MSFT_packing_occlusionRoughnessMetallic/README.md)


## Extensions for glTF 1.0

#### Khronos extensions
Expand Down