bevy/assets/models/AnisotropyBarnLamp/AnisotropyBarnLamp.gltf

350 lines
6.7 KiB
Text
Raw Normal View History

Implement PBR anisotropy per `KHR_materials_anisotropy`. (#13450) This commit implements support for physically-based anisotropy in Bevy's `StandardMaterial`, following the specification for the [`KHR_materials_anisotropy`] glTF extension. [*Anisotropy*] (not to be confused with [anisotropic filtering]) is a PBR feature that allows roughness to vary along the tangent and bitangent directions of a mesh. In effect, this causes the specular light to stretch out into lines instead of a round lobe. This is useful for modeling brushed metal, hair, and similar surfaces. Support for anisotropy is a common feature in major game and graphics engines; Unity, Unreal, Godot, three.js, and Blender all support it to varying degrees. Two new parameters have been added to `StandardMaterial`: `anisotropy_strength` and `anisotropy_rotation`. Anisotropy strength, which ranges from 0 to 1, represents how much the roughness differs between the tangent and the bitangent of the mesh. In effect, it controls how stretched the specular highlight is. Anisotropy rotation allows the roughness direction to differ from the tangent of the model. In addition to these two fixed parameters, an *anisotropy texture* can be supplied. Such a texture should be a 3-channel RGB texture, where the red and green values specify a direction vector using the same conventions as a normal map ([0, 1] color values map to [-1, 1] vector values), and the the blue value represents the strength. This matches the format that the [`KHR_materials_anisotropy`] specification requires. Such textures should be loaded as linear and not sRGB. Note that this texture does consume one additional texture binding in the standard material shader. The glTF loader has been updated to properly parse the `KHR_materials_anisotropy` extension. A new example, `anisotropy`, has been added. This example loads and displays the barn lamp example from the [`glTF-Sample-Assets`] repository. Note that the textures were rather large, so I shrunk them down and converted them to a mixture of JPEG and KTX2 format, in the interests of saving space in the Bevy repository. [*Anisotropy*]: https://google.github.io/filament/Filament.md.html#materialsystem/anisotropicmodel [anisotropic filtering]: https://en.wikipedia.org/wiki/Anisotropic_filtering [`KHR_materials_anisotropy`]: https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_anisotropy/README.md [`glTF-Sample-Assets`]: https://github.com/KhronosGroup/glTF-Sample-Assets/ ## Changelog ### Added * Physically-based anisotropy is now available for materials, which enhances the look of surfaces such as brushed metal or hair. glTF scenes can use the new feature with the `KHR_materials_anisotropy` extension. ## Screenshots With anisotropy: ![Screenshot 2024-05-20 233414](https://github.com/bevyengine/bevy/assets/157897/379f1e42-24e9-40b6-a430-f7d1479d0335) Without anisotropy: ![Screenshot 2024-05-20 233420](https://github.com/bevyengine/bevy/assets/157897/aa220f05-b8e7-417c-9671-b242d4bf9fc4)
2024-06-03 23:46:06 +00:00
{
"asset": {
"version": "2.0",
"generator": "3ds Max, Max2Babylon, Visual Studio Code, glTF Tools",
"copyright": "(c) 2023 Wayfair, model and textures by Eric Chadwick, CC BY 4.0."
},
"extensionsUsed": [
"KHR_materials_anisotropy",
"KHR_materials_clearcoat",
"KHR_materials_emissive_strength",
"KHR_materials_transmission",
"KHR_materials_volume"
],
"scene": 0,
"scenes": [
{
"nodes": [
0,
1,
2
]
}
],
"nodes": [
{
"mesh": 0,
"name": "Lamp Metal"
},
{
"mesh": 1,
"name": "Lamp Filament"
},
{
"mesh": 2,
"name": "Lamp Glass"
}
],
"meshes": [
{
"primitives": [
{
"attributes": {
"POSITION": 1,
"TANGENT": 2,
"NORMAL": 3,
"TEXCOORD_0": 4
},
"indices": 0,
"material": 0
}
],
"name": "Lamp Metal"
},
{
"primitives": [
{
"attributes": {
"POSITION": 6,
"NORMAL": 7
},
"indices": 5,
"material": 1
}
],
"name": "Lamp Filament"
},
{
"primitives": [
{
"attributes": {
"POSITION": 9,
"NORMAL": 10
},
"indices": 8,
"material": 2
}
],
"name": "Lamp Glass"
}
],
"accessors": [
{
"bufferView": 0,
"componentType": 5123,
"count": 25257,
"type": "SCALAR",
"name": "accessorIndices"
},
{
"bufferView": 1,
"componentType": 5126,
"count": 6803,
"max": [
0.08619007,
0.056946706,
0.226538792
],
"min": [
-0.104619145,
-0.172301471,
-2.43595832E-06
],
"type": "VEC3",
"name": "accessorPositions"
},
{
"bufferView": 2,
"componentType": 5126,
"count": 6803,
"type": "VEC4",
"name": "accessorTangents"
},
{
"bufferView": 1,
"byteOffset": 81636,
"componentType": 5126,
"count": 6803,
"type": "VEC3",
"name": "accessorNormals"
},
{
"bufferView": 3,
"componentType": 5126,
"count": 6803,
"type": "VEC2",
"name": "accessorUVs"
},
{
"bufferView": 0,
"byteOffset": 50516,
"componentType": 5123,
"count": 840,
"type": "SCALAR",
"name": "accessorIndices"
},
{
"bufferView": 1,
"byteOffset": 163272,
"componentType": 5126,
"count": 140,
"max": [
8.701398E-05,
-0.12128906,
0.142439723
],
"min": [
-0.0193775147,
-0.170719177,
0.122564256
],
"type": "VEC3",
"name": "accessorPositions"
},
{
"bufferView": 1,
"byteOffset": 164952,
"componentType": 5126,
"count": 140,
"type": "VEC3",
"name": "accessorNormals"
},
{
"bufferView": 0,
"byteOffset": 52196,
"componentType": 5123,
"count": 4512,
"type": "SCALAR",
"name": "accessorIndices"
},
{
"bufferView": 1,
"byteOffset": 166632,
"componentType": 5126,
"count": 769,
"max": [
0.01725974,
-0.0980222151,
0.15841879
],
"min": [
-0.03568878,
-0.198292032,
0.106095724
],
"type": "VEC3",
"name": "accessorPositions"
},
{
"bufferView": 1,
"byteOffset": 175860,
"componentType": 5126,
"count": 769,
"type": "VEC3",
"name": "accessorNormals"
}
],
"bufferViews": [
{
"buffer": 0,
"byteLength": 61220,
"name": "bufferViewScalar",
"target": 34963
},
{
"buffer": 0,
"byteOffset": 61220,
"byteLength": 185088,
"byteStride": 12,
"name": "bufferViewFloatVec3",
"target": 34962
},
{
"buffer": 0,
"byteOffset": 246308,
"byteLength": 108848,
"byteStride": 16,
"name": "bufferViewFloatVec4",
"target": 34962
},
{
"buffer": 0,
"byteOffset": 355156,
"byteLength": 54424,
"byteStride": 8,
"name": "bufferViewFloatVec2",
"target": 34962
}
],
"buffers": [
{
"uri": "AnisotropyBarnLamp.bin",
"byteLength": 409580
}
],
"materials": [
{
"name": "Lamp Metal",
"pbrMetallicRoughness": {
"baseColorTexture": {
"index": 2
},
"metallicRoughnessTexture": {
"index": 1
}
},
"normalTexture": {
"index": 0
},
"occlusionTexture": {
"index": 1
},
"extensions": {
"KHR_materials_anisotropy": {
"anisotropyStrength": 1,
"anisotropyRotation": 0,
"anisotropyTexture": {
"index": 3
}
},
"KHR_materials_clearcoat": {
"clearcoatFactor": 0.25,
"clearcoatRoughnessFactor": 0.15,
"clearcoatNormalTexture": {
"index": 0
}
}
}
},
{
"name": "Lamp Filament",
"pbrMetallicRoughness": {
"baseColorFactor": [
0.09,
0.09,
0.09,
1
],
"metallicFactor": 0,
"roughnessFactor": 0.7
},
"emissiveFactor": [
1,
0.5,
0.25
],
"extensions": {
"KHR_materials_emissive_strength": {
"emissiveStrength": 25
}
}
},
{
"name": "Lamp Glass",
"pbrMetallicRoughness": {
"metallicFactor": 0,
"roughnessFactor": 0
},
"extensions": {
"KHR_materials_transmission": {
"transmissionFactor": 1
},
"KHR_materials_volume": {
"thicknessFactor": 0.01
}
}
}
],
"textures": [
{
"sampler": 0,
"source": 0,
"name": "AnisotropyBarnLamp_normalbump.ktx2"
},
{
"sampler": 0,
"source": 1,
"name": "AnisotropyBarnLamp_occlusionroughnessmetal.ktx2"
},
{
"sampler": 0,
"source": 2,
"name": "AnisotropyBarnLamp_basecolor.jpeg"
},
{
"sampler": 0,
"source": 3,
"name": "AnisotropyBarnLamp_anisotropy.ktx2"
}
],
"images": [
{
"uri": "AnisotropyBarnLamp_normalbump.ktx2"
},
{
"uri": "AnisotropyBarnLamp_occlusionroughnessmetal.ktx2"
},
{
"uri": "AnisotropyBarnLamp_basecolor.jpeg"
},
{
"uri": "AnisotropyBarnLamp_anisotropy.ktx2"
}
],
"samplers": [
{
"magFilter": 9729,
"minFilter": 9987
}
]
}