forked from bevyengine/bevy
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
allow extensions to StandardMaterial (bevyengine#7820)
# Objective allow extending `Material`s (including the built in `StandardMaterial`) with custom vertex/fragment shaders and additional data, to easily get pbr lighting with custom modifications, or otherwise extend a base material. # Solution - added `ExtendedMaterial<B: Material, E: MaterialExtension>` which contains a base material and a user-defined extension. - added example `extended_material` showing how to use it - modified AsBindGroup to have "unprepared" functions that return raw resources / layout entries so that the extended material can combine them note: doesn't currently work with array resources, as i can't figure out how to make the OwnedBindingResource::get_binding() work, as wgpu requires a `&'a[&'a TextureView]` and i have a `Vec<TextureView>`. # Migration Guide manual implementations of `AsBindGroup` will need to be adjusted, the changes are pretty straightforward and can be seen in the diff for e.g. the `texture_binding_array` example. --------- Co-authored-by: Robert Swain <[email protected]>
- Loading branch information
Showing
16 changed files
with
856 additions
and
355 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
#import bevy_pbr::pbr_fragment pbr_input_from_standard_material | ||
#import bevy_pbr::pbr_functions alpha_discard | ||
|
||
#ifdef PREPASS_PIPELINE | ||
#import bevy_pbr::prepass_io VertexOutput, FragmentOutput | ||
#import bevy_pbr::pbr_deferred_functions deferred_output | ||
#else | ||
#import bevy_pbr::forward_io VertexOutput, FragmentOutput | ||
#import bevy_pbr::pbr_functions apply_pbr_lighting, main_pass_post_lighting_processing | ||
#endif | ||
|
||
struct MyExtendedMaterial { | ||
quantize_steps: u32, | ||
} | ||
|
||
@group(1) @binding(100) | ||
var<uniform> my_extended_material: MyExtendedMaterial; | ||
|
||
@fragment | ||
fn fragment( | ||
in: VertexOutput, | ||
@builtin(front_facing) is_front: bool, | ||
) -> FragmentOutput { | ||
// generate a PbrInput struct from the StandardMaterial bindings | ||
var pbr_input = pbr_input_from_standard_material(in, is_front); | ||
|
||
// we can optionally modify the input before lighting and alpha_discard is applied | ||
pbr_input.material.base_color.b = pbr_input.material.base_color.r; | ||
|
||
// alpha discard | ||
pbr_input.material.base_color = alpha_discard(pbr_input.material, pbr_input.material.base_color); | ||
|
||
#ifdef PREPASS_PIPELINE | ||
// in deferred mode we can't modify anything after that, as lighting is run in a separate fullscreen shader. | ||
let out = deferred_output(in, pbr_input); | ||
#else | ||
var out: FragmentOutput; | ||
// apply lighting | ||
out.color = apply_pbr_lighting(pbr_input); | ||
|
||
// we can optionally modify the lit color before post-processing is applied | ||
out.color = vec4<f32>(vec4<u32>(out.color * f32(my_extended_material.quantize_steps))) / f32(my_extended_material.quantize_steps); | ||
|
||
// apply in-shader post processing (fog, alpha-premultiply, and also tonemapping, debanding if the camera is non-hdr) | ||
// note this does not include fullscreen postprocessing effects like bloom. | ||
out.color = main_pass_post_lighting_processing(pbr_input, out.color); | ||
|
||
// we can optionally modify the final result here | ||
out.color = out.color * 2.0; | ||
#endif | ||
|
||
return out; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.