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.
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TOML
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TOML
		
	
	
	
	
	
[package]
 | 
						|
name = "bevy_pbr"
 | 
						|
version = "0.16.0-dev"
 | 
						|
edition = "2021"
 | 
						|
description = "Adds PBR rendering to Bevy Engine"
 | 
						|
homepage = "https://bevyengine.org"
 | 
						|
repository = "https://github.com/bevyengine/bevy"
 | 
						|
license = "MIT OR Apache-2.0"
 | 
						|
keywords = ["bevy"]
 | 
						|
 | 
						|
[features]
 | 
						|
webgl = []
 | 
						|
webgpu = []
 | 
						|
pbr_transmission_textures = []
 | 
						|
pbr_multi_layer_material_textures = []
 | 
						|
pbr_anisotropy_texture = []
 | 
						|
experimental_pbr_pcss = []
 | 
						|
pbr_specular_textures = []
 | 
						|
shader_format_glsl = ["bevy_render/shader_format_glsl"]
 | 
						|
trace = ["bevy_render/trace"]
 | 
						|
ios_simulator = ["bevy_render/ios_simulator"]
 | 
						|
# Enables the meshlet renderer for dense high-poly scenes (experimental)
 | 
						|
meshlet = ["dep:lz4_flex", "dep:range-alloc", "dep:half", "dep:bevy_tasks"]
 | 
						|
# Enables processing meshes into meshlet meshes
 | 
						|
meshlet_processor = [
 | 
						|
  "meshlet",
 | 
						|
  "dep:meshopt",
 | 
						|
  "dep:metis",
 | 
						|
  "dep:itertools",
 | 
						|
  "dep:bitvec",
 | 
						|
]
 | 
						|
 | 
						|
[dependencies]
 | 
						|
# bevy
 | 
						|
bevy_app = { path = "../bevy_app", version = "0.16.0-dev" }
 | 
						|
bevy_asset = { path = "../bevy_asset", version = "0.16.0-dev" }
 | 
						|
bevy_color = { path = "../bevy_color", version = "0.16.0-dev" }
 | 
						|
bevy_core_pipeline = { path = "../bevy_core_pipeline", version = "0.16.0-dev" }
 | 
						|
bevy_derive = { path = "../bevy_derive", version = "0.16.0-dev" }
 | 
						|
bevy_ecs = { path = "../bevy_ecs", version = "0.16.0-dev" }
 | 
						|
bevy_image = { path = "../bevy_image", version = "0.16.0-dev" }
 | 
						|
bevy_math = { path = "../bevy_math", version = "0.16.0-dev" }
 | 
						|
bevy_reflect = { path = "../bevy_reflect", version = "0.16.0-dev", features = [
 | 
						|
  "bevy",
 | 
						|
] }
 | 
						|
bevy_render = { path = "../bevy_render", version = "0.16.0-dev" }
 | 
						|
bevy_tasks = { path = "../bevy_tasks", version = "0.16.0-dev", optional = true }
 | 
						|
bevy_transform = { path = "../bevy_transform", version = "0.16.0-dev" }
 | 
						|
bevy_utils = { path = "../bevy_utils", version = "0.16.0-dev" }
 | 
						|
bevy_window = { path = "../bevy_window", version = "0.16.0-dev" }
 | 
						|
bevy_platform_support = { path = "../bevy_platform_support", version = "0.16.0-dev", default-features = false, features = [
 | 
						|
  "std",
 | 
						|
] }
 | 
						|
 | 
						|
# other
 | 
						|
bitflags = "2.3"
 | 
						|
fixedbitset = "0.5"
 | 
						|
thiserror = { version = "2", default-features = false }
 | 
						|
derive_more = { version = "1", default-features = false, features = ["from"] }
 | 
						|
# meshlet
 | 
						|
lz4_flex = { version = "0.11", default-features = false, features = [
 | 
						|
  "frame",
 | 
						|
], optional = true }
 | 
						|
range-alloc = { version = "0.1.3", optional = true }
 | 
						|
half = { version = "2", features = ["bytemuck"], optional = true }
 | 
						|
meshopt = { version = "0.4.1", optional = true }
 | 
						|
metis = { version = "0.2", optional = true }
 | 
						|
itertools = { version = "0.13", optional = true }
 | 
						|
bitvec = { version = "1", optional = true }
 | 
						|
# direct dependency required for derive macro
 | 
						|
bytemuck = { version = "1", features = ["derive", "must_cast"] }
 | 
						|
radsort = "0.1"
 | 
						|
smallvec = "1.6"
 | 
						|
nonmax = "0.5"
 | 
						|
static_assertions = "1"
 | 
						|
tracing = { version = "0.1", default-features = false, features = ["std"] }
 | 
						|
 | 
						|
[lints]
 | 
						|
workspace = true
 | 
						|
 | 
						|
[package.metadata.docs.rs]
 | 
						|
rustdoc-args = ["-Zunstable-options", "--generate-link-to-definition"]
 | 
						|
all-features = true
 |