mirror of
https://github.com/bevyengine/bevy
synced 2024-11-23 13:13:49 +00:00
77ed72bc16
Clearcoat is a separate material layer that represents a thin translucent layer of a material. Examples include (from the [Filament spec]) car paint, soda cans, and lacquered wood. This commit implements support for clearcoat following the Filament and Khronos specifications, marking the beginnings of support for multiple PBR layers in Bevy. The [`KHR_materials_clearcoat`] specification describes the clearcoat support in glTF. In Blender, applying a clearcoat to the Principled BSDF node causes the clearcoat settings to be exported via this extension. As of this commit, Bevy parses and reads the extension data when present in glTF. Note that the `gltf` crate has no support for `KHR_materials_clearcoat`; this patch therefore implements the JSON semantics manually. Clearcoat is integrated with `StandardMaterial`, but the code is behind a series of `#ifdef`s that only activate when clearcoat is present. Additionally, the `pbr_feature_layer_material_textures` Cargo feature must be active in order to enable support for clearcoat factor maps, clearcoat roughness maps, and clearcoat normal maps. This approach mirrors the same pattern used by the existing transmission feature and exists to avoid running out of texture bindings on platforms like WebGL and WebGPU. Note that constant clearcoat factors and roughness values *are* supported in the browser; only the relatively-less-common maps are disabled on those platforms. This patch refactors the lighting code in `StandardMaterial` significantly in order to better support multiple layers in a natural way. That code was due for a refactor in any case, so this is a nice improvement. A new demo, `clearcoat`, has been added. It's based on [the corresponding three.js demo], but all the assets (aside from the skybox and environment map) are my original work. [Filament spec]: https://google.github.io/filament/Filament.html#materialsystem/clearcoatmodel [`KHR_materials_clearcoat`]: https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md [the corresponding three.js demo]: https://threejs.org/examples/webgl_materials_physical_clearcoat.html ![Screenshot 2024-04-19 101143](https://github.com/bevyengine/bevy/assets/157897/3444bcb5-5c20-490c-b0ad-53759bd47ae2) ![Screenshot 2024-04-19 102054](https://github.com/bevyengine/bevy/assets/157897/6e953944-75b8-49ef-bc71-97b0a53b3a27) ## Changelog ### Added * `StandardMaterial` now supports a clearcoat layer, which represents a thin translucent layer over an underlying material. * The glTF loader now supports the `KHR_materials_clearcoat` extension, representing materials with clearcoat layers. ## Migration Guide * The lighting functions in the `pbr_lighting` WGSL module now have clearcoat parameters, if `STANDARD_MATERIAL_CLEARCOAT` is defined. * The `R` reflection vector parameter has been removed from some lighting functions, as it was unused.
74 lines
2.4 KiB
TOML
74 lines
2.4 KiB
TOML
[package]
|
|
name = "bevy_pbr"
|
|
version = "0.14.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 = []
|
|
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:serde",
|
|
"dep:bincode",
|
|
"dep:thiserror",
|
|
"dep:range-alloc",
|
|
]
|
|
# Enables processing meshes into meshlet meshes
|
|
meshlet_processor = ["meshlet", "dep:meshopt", "dep:metis", "dep:itertools"]
|
|
|
|
[dependencies]
|
|
# bevy
|
|
bevy_app = { path = "../bevy_app", version = "0.14.0-dev" }
|
|
bevy_asset = { path = "../bevy_asset", version = "0.14.0-dev" }
|
|
bevy_color = { path = "../bevy_color", version = "0.14.0-dev" }
|
|
bevy_core_pipeline = { path = "../bevy_core_pipeline", version = "0.14.0-dev" }
|
|
bevy_ecs = { path = "../bevy_ecs", version = "0.14.0-dev" }
|
|
bevy_math = { path = "../bevy_math", version = "0.14.0-dev" }
|
|
bevy_reflect = { path = "../bevy_reflect", version = "0.14.0-dev", features = [
|
|
"bevy",
|
|
] }
|
|
bevy_render = { path = "../bevy_render", version = "0.14.0-dev" }
|
|
bevy_transform = { path = "../bevy_transform", version = "0.14.0-dev" }
|
|
bevy_utils = { path = "../bevy_utils", version = "0.14.0-dev" }
|
|
bevy_window = { path = "../bevy_window", version = "0.14.0-dev" }
|
|
bevy_derive = { path = "../bevy_derive", version = "0.14.0-dev" }
|
|
|
|
|
|
# other
|
|
bitflags = "2.3"
|
|
fixedbitset = "0.5"
|
|
# meshlet
|
|
lz4_flex = { version = "0.11", default-features = false, features = [
|
|
"frame",
|
|
], optional = true }
|
|
serde = { version = "1", features = ["derive", "rc"], optional = true }
|
|
bincode = { version = "1", optional = true }
|
|
thiserror = { version = "1", optional = true }
|
|
range-alloc = { version = "0.1", optional = true }
|
|
meshopt = { version = "0.2", optional = true }
|
|
metis = { version = "0.2", optional = true }
|
|
itertools = { version = "0.12", 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"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[package.metadata.docs.rs]
|
|
rustdoc-args = ["-Zunstable-options", "--cfg", "docsrs"]
|
|
all-features = true
|