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.
Initial tonemapping options (bevyengine#7594)
# Objective Splits tone mapping from bevyengine#6677 into a separate PR. Address bevyengine#2264. Adds tone mapping options: - None: Bypasses tonemapping for instances where users want colors output to match those set. - Reinhard - Reinhard Luminance: Bevy's exiting tonemapping - [ACES](https://github.com/TheRealMJP/BakingLab/blob/master/BakingLab/ACES.hlsl) (Fitted version, based on the same implementation that Godot 4 uses) see bevyengine#2264 - [AgX](https://github.com/sobotka/AgX) - SomewhatBoringDisplayTransform - TonyMcMapface - Blender Filmic This PR also adds support for EXR images so they can be used to compare tonemapping options with reference images. ## Migration Guide - Tonemapping is now an enum with NONE and the various tonemappers. - The DebandDither is now a separate component. Co-authored-by: JMS55 <[email protected]>
- Loading branch information
1 parent
d46427b
commit 912fb58
Showing
37 changed files
with
1,849 additions
and
154 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,64 @@ | ||
#import bevy_pbr::mesh_view_bindings | ||
#import bevy_pbr::mesh_bindings | ||
#import bevy_pbr::utils | ||
|
||
#ifdef TONEMAP_IN_SHADER | ||
#import bevy_core_pipeline::tonemapping | ||
#endif | ||
|
||
struct FragmentInput { | ||
@builtin(front_facing) is_front: bool, | ||
@builtin(position) frag_coord: vec4<f32>, | ||
#import bevy_pbr::mesh_vertex_output | ||
}; | ||
|
||
// Sweep across hues on y axis with value from 0.0 to +15EV across x axis | ||
// quantized into 24 steps for both axis. | ||
fn color_sweep(uv: vec2<f32>) -> vec3<f32> { | ||
var uv = uv; | ||
let steps = 24.0; | ||
uv.y = uv.y * (1.0 + 1.0 / steps); | ||
let ratio = 2.0; | ||
|
||
let h = PI * 2.0 * floor(1.0 + steps * uv.y) / steps; | ||
let L = floor(uv.x * steps * ratio) / (steps * ratio) - 0.5; | ||
|
||
var color = vec3(0.0); | ||
if uv.y < 1.0 { | ||
color = cos(h + vec3(0.0, 1.0, 2.0) * PI * 2.0 / 3.0); | ||
let maxRGB = max(color.r, max(color.g, color.b)); | ||
let minRGB = min(color.r, min(color.g, color.b)); | ||
color = exp(15.0 * L) * (color - minRGB) / (maxRGB - minRGB); | ||
} else { | ||
color = vec3(exp(15.0 * L)); | ||
} | ||
return color; | ||
} | ||
|
||
fn hsv_to_srgb(c: vec3<f32>) -> vec3<f32> { | ||
let K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); | ||
let p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); | ||
return c.z * mix(K.xxx, clamp(p - K.xxx, vec3(0.0), vec3(1.0)), c.y); | ||
} | ||
|
||
// Generates a continuous sRGB sweep. | ||
fn continuous_hue(uv: vec2<f32>) -> vec3<f32> { | ||
return hsv_to_srgb(vec3(uv.x, 1.0, 1.0)) * max(0.0, exp2(uv.y * 9.0) - 1.0); | ||
} | ||
|
||
@fragment | ||
fn fragment(in: FragmentInput) -> @location(0) vec4<f32> { | ||
var uv = in.uv; | ||
var out = vec3(0.0); | ||
if uv.y > 0.5 { | ||
uv.y = 1.0 - uv.y; | ||
out = color_sweep(vec2(uv.x, uv.y * 2.0)); | ||
} else { | ||
out = continuous_hue(vec2(uv.y * 2.0, uv.x)); | ||
} | ||
var color = vec4(out, 1.0); | ||
#ifdef TONEMAP_IN_SHADER | ||
color = tone_mapping(color); | ||
#endif | ||
return color; | ||
} |
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 |
---|---|---|
|
@@ -15,6 +15,7 @@ keywords = ["bevy"] | |
[features] | ||
trace = [] | ||
webgl = [] | ||
tonemapping_luts = [] | ||
|
||
[dependencies] | ||
# bevy | ||
|
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
Binary file added
BIN
+17.4 KB
crates/bevy_core_pipeline/src/tonemapping/luts/AgX-default_contrast.ktx2
Binary file not shown.
Binary file not shown.
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,22 @@ | ||
--- Process for recreating AgX-default_contrast.ktx2 --- | ||
Download: | ||
https://github.com/MrLixm/AgXc/blob/898198e0490b0551ed81412a0c22e0b72fffb7cd/obs/obs-script/AgX-default_contrast.lut.png | ||
Convert to vertical strip exr with: | ||
https://gist.github.com/DGriffin91/fc8e0cfd55aaa175ac10199403bc19b8 | ||
Convert exr to 3D ktx2 with: | ||
https://gist.github.com/DGriffin91/49401c43378b58bce32059291097d4ca | ||
|
||
--- Process for recreating tony_mc_mapface.ktx2 --- | ||
Download: | ||
https://github.com/h3r2tic/tony-mc-mapface/blob/909e51c8a74251fd828770248476cb084081e08c/tony_mc_mapface.dds | ||
Convert dds to 3D ktx2 with: | ||
https://gist.github.com/DGriffin91/49401c43378b58bce32059291097d4ca | ||
|
||
--- Process for recreating Blender_-11_12.ktx2 --- | ||
Create LUT stimulus with: | ||
https://gist.github.com/DGriffin91/e119bf32b520e219f6e102a6eba4a0cf | ||
Open LUT image in Blender's image editor and make sure color space is set to linear. | ||
Export from Blender as 32bit EXR, override color space to Filmic sRGB. | ||
Import EXR back into blender set color space to sRGB, then export as 32bit EXR override color space to linear. | ||
Convert exr to 3D ktx2 with: | ||
https://gist.github.com/DGriffin91/49401c43378b58bce32059291097d4ca |
Binary file not shown.
Oops, something went wrong.