bevy/crates
Patrick Walton 1c765c9ae7
Add support for specular tints and maps per the KHR_materials_specular glTF extension. (#14069)
This commit allows specular highlights to be tinted with a color and for
the reflectance and color tint values to vary across a model via a pair
of maps. The implementation follows the [`KHR_materials_specular`] glTF
extension. In order to reduce the number of samplers and textures in the
default `StandardMaterial` configuration, the maps are gated behind the
`pbr_specular_textures` Cargo feature.

Specular tinting is currently unsupported in the deferred renderer,
because I didn't want to bloat the deferred G-buffers. A possible fix
for this in the future would be to make the G-buffer layout more
configurable, so that specular tints could be supported on an opt-in
basis. As an alternative, Bevy could force meshes with specular tints to
render in forward mode. Both of these solutions require some more
design, so I consider them out of scope for now.

Note that the map is a *specular* map, not a *reflectance* map. In Bevy
and Filament terms, the reflectance values in the specular map range
from [0.0, 0.5], rather than [0.0, 1.0]. This is an unfortunate
[`KHR_materials_specular`] specification requirement that stems from the
fact that glTF is specified in terms of a specular strength model, not
the reflectance model that Filament and Bevy use. A workaround, which is
noted in the `StandardMaterial` documentation, is to set the
`reflectance` value to 2.0, which spreads the specular map range from
[0.0, 1.0] as normal.

The glTF loader has been updated to parse the [`KHR_materials_specular`]
extension. Note that, unless the non-default `pbr_specular_textures` is
supplied, the maps are ignored. The `specularFactor` value is applied as
usual. Note that, as with the specular map, the glTF `specularFactor` is
twice Bevy's `reflectance` value.

This PR adds a new example, `specular_tint`, which demonstrates the
specular tint and map features. Note that this example requires the
[`KHR_materials_specular`] Cargo feature.

[`KHR_materials_specular`]:
https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_specular

## Changelog

### Added

* Specular highlights can now be tinted with the `specular_tint` field
in `StandardMaterial`.
* Specular maps are now available in `StandardMaterial`, gated behind
the `pbr_specular_textures` Cargo feature.
* The `KHR_materials_specular` glTF extension is now supported, allowing
for customization of specular reflectance and specular maps. Note that
the latter are gated behind the `pbr_specular_textures` Cargo feature.
2025-01-26 20:38:46 +00:00
..
bevy_a11y Add no_std Support to bevy_a11y (#17505) 2025-01-23 03:52:47 +00:00
bevy_animation Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_app Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_asset Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_audio Relationships (non-fragmenting, one-to-many) (#17398) 2025-01-18 22:20:30 +00:00
bevy_color Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_core_pipeline Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_derive Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_dev_tools Adds update interval config for FpsOverlayPlugin (#17489) 2025-01-24 05:57:36 +00:00
bevy_diagnostic Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_dylib Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_ecs implement EntityIndexMap/Set (#17449) 2025-01-24 08:09:34 +00:00
bevy_encase_derive Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_gilrs Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_gizmos Move Resource trait to its own file (#17469) 2025-01-21 19:47:08 +00:00
bevy_gltf Add support for specular tints and maps per the KHR_materials_specular glTF extension. (#14069) 2025-01-26 20:38:46 +00:00
bevy_image Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_input Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_input_focus Refactored ComponentHook Parameters into HookContext (#17503) 2025-01-23 02:45:24 +00:00
bevy_internal Add support for specular tints and maps per the KHR_materials_specular glTF extension. (#14069) 2025-01-26 20:38:46 +00:00
bevy_log Move Resource trait to its own file (#17469) 2025-01-21 19:47:08 +00:00
bevy_macro_utils Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_math Reworked Segment types into their cartesian forms (#17404) 2025-01-19 03:54:45 +00:00
bevy_mesh Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_mikktspace Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_pbr Add support for specular tints and maps per the KHR_materials_specular glTF extension. (#14069) 2025-01-26 20:38:46 +00:00
bevy_picking Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_platform_support Fix Typo in bevy_platform_support's spin Feature (#17516) 2025-01-23 21:47:21 +00:00
bevy_ptr Update safety docs for Ptr::assert_unique (#17394) 2025-01-16 03:25:19 +00:00
bevy_reflect Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_remote Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_render Procedural atmospheric scattering (#16314) 2025-01-23 22:52:46 +00:00
bevy_scene Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_sprite Proportional scaling for the sprite's texture. (#17258) 2025-01-24 18:24:02 +00:00
bevy_state Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_tasks Move spin to bevy_platform_support out of other crates (#17470) 2025-01-23 05:27:02 +00:00
bevy_text Proportional scaling for the sprite's texture. (#17258) 2025-01-24 18:24:02 +00:00
bevy_time Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_transform Parent -> ChildOf (#17427) 2025-01-20 22:13:29 +00:00
bevy_ui Proportional scaling for the sprite's texture. (#17258) 2025-01-24 18:24:02 +00:00
bevy_utils Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_window Move spin to bevy_platform_support out of other crates (#17470) 2025-01-23 05:27:02 +00:00
bevy_winit Make CustomCursor variants CustomCursorImage/CustomCursorUrl structs (#17518) 2025-01-24 05:39:04 +00:00