Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - Initial tonemapping options #7594

Closed
wants to merge 88 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
b50ab5e
setup initial tonemapping options
DGriffin91 Feb 10, 2023
12c1d45
exr support, more tonemapping, initial test scene
DGriffin91 Feb 12, 2023
a716ef8
add AgX
DGriffin91 Feb 12, 2023
5284938
improve test scene, make methods selectable
DGriffin91 Feb 12, 2023
7300d3e
improve test scenes
DGriffin91 Feb 12, 2023
e77346a
disable grading, fix exmaple test patterns
DGriffin91 Feb 12, 2023
74a8eaf
update example descriptions, tweak settings
DGriffin91 Feb 12, 2023
cd2234b
add blender filmic
DGriffin91 Feb 13, 2023
68a333e
use include_bytes for luts image
DGriffin91 Feb 13, 2023
0c3bf82
make tonemapping work in main pass and sprites
DGriffin91 Feb 14, 2023
95ad250
use 3d LUTs
DGriffin91 Feb 14, 2023
3c6b223
remove bindings from sprite/mesh2d, make tonemapping work in custom t…
DGriffin91 Feb 14, 2023
b628e9a
remove tonemapping bindings from sprite wgsl
DGriffin91 Feb 14, 2023
bf3a340
add basic color grading controls
DGriffin91 Feb 14, 2023
8edb5c2
fix ci stuff, clean up tonemapping code
DGriffin91 Feb 15, 2023
69b3efa
Merge remote-tracking branch 'origin' into tonemap_options
DGriffin91 Feb 15, 2023
d6cf573
merge in main
DGriffin91 Feb 15, 2023
a63ae5a
improve tonemapping example
DGriffin91 Feb 15, 2023
bdb52c8
update sbdt2
DGriffin91 Feb 15, 2023
7cd3a38
misc nits
DGriffin91 Feb 15, 2023
a3405c1
use exr for sbdt2 for now
DGriffin91 Feb 15, 2023
c6dbd4a
remove pr 7564 task pool stuff
DGriffin91 Feb 15, 2023
4535489
use ktx2 for luts, update naming
DGriffin91 Feb 16, 2023
16904fe
remove exr from default features
DGriffin91 Feb 16, 2023
6630c15
WIP tonemapping example refactor
JMS55 Feb 16, 2023
dad817f
update ACES to base implementation without white parameter
DGriffin91 Feb 16, 2023
bfa26d9
More WIP tonemap example
JMS55 Feb 16, 2023
53c810b
Add reset color grading
JMS55 Feb 16, 2023
7b6e43f
Add back matched color grading
JMS55 Feb 16, 2023
3866632
Rename ACES
JMS55 Feb 16, 2023
3d9bebf
Update crates/bevy_core_pipeline/src/tonemapping/mod.rs
JMS55 Feb 16, 2023
2488305
Merge pull request #1 from JMS55/tonemap_options
DGriffin91 Feb 16, 2023
fd85e9d
Revert "Tonemapping example refactor "
DGriffin91 Feb 16, 2023
291ce1f
Merge pull request #2 from DGriffin91/revert-1-tonemap_options
DGriffin91 Feb 16, 2023
afe9ad5
Fix bug
JMS55 Feb 16, 2023
1dac246
Fix bugfix
JMS55 Feb 16, 2023
f128b53
Add reset to scene default vs regular default
JMS55 Feb 16, 2023
7890cc4
Fix mixmatched keys
JMS55 Feb 16, 2023
314bf50
Save color grading per method
JMS55 Feb 16, 2023
0f14b42
Chnage controls
JMS55 Feb 16, 2023
e07121d
Merge branch 'tonemap_options' into tonemap_options
DGriffin91 Feb 16, 2023
315379b
Merge pull request #4 from JMS55/tonemap_options
DGriffin91 Feb 16, 2023
79b5e19
tweak example
DGriffin91 Feb 16, 2023
de00f72
move around entities
DGriffin91 Feb 16, 2023
60b3281
remove TonemappingMethod, make Dither separate Component
DGriffin91 Feb 16, 2023
2011fca
fix crash on arrow up, bring back hide option
DGriffin91 Feb 16, 2023
964cf81
build-example-pages
DGriffin91 Feb 16, 2023
f7b8a94
fix sprite/mesh2d
DGriffin91 Feb 17, 2023
510fda5
improve hide ui ui
DGriffin91 Feb 17, 2023
51c028c
fix ci/clippy errors
DGriffin91 Feb 17, 2023
77f1c28
Merge remote-tracking branch 'origin/main' into tonemap_options
DGriffin91 Feb 17, 2023
cf27b91
improve texture sample exclusion logic
DGriffin91 Feb 17, 2023
e461f83
fix color sweep shader
DGriffin91 Feb 17, 2023
6ebc9aa
remove old godot aces code
DGriffin91 Feb 17, 2023
959748d
update tony_mc_mapface file and attribution
DGriffin91 Feb 17, 2023
5a46cb0
add info for creating luts
DGriffin91 Feb 18, 2023
feabb2a
use ACES Fitted name everywhere
DGriffin91 Feb 18, 2023
d9780d2
add docstring for debanding dither
DGriffin91 Feb 18, 2023
2b2a1bb
Merge branch 'tonemap_options' of https://github.com/DGriffin91/bevy …
DGriffin91 Feb 18, 2023
6412a32
rename Dither component to DebandDither
DGriffin91 Feb 18, 2023
51695a4
remove rgb_to_srgb_simple
DGriffin91 Feb 18, 2023
5e2846f
use tone_mapping for sprite
DGriffin91 Feb 18, 2023
d8a30ac
use tone_mapping for mesh2d and color material
DGriffin91 Feb 18, 2023
c06fc0b
capitalize Tonemapping in Cargo.toml
DGriffin91 Feb 18, 2023
66cb51b
reuse cube mesh
DGriffin91 Feb 18, 2023
43dad10
ColorGrading definitions
DGriffin91 Feb 18, 2023
2053b6a
Tonemapping descriptions
DGriffin91 Feb 18, 2023
25d0d68
update tonemapping descriptions
DGriffin91 Feb 18, 2023
4cbbe25
fix color sweep x offset and add description
DGriffin91 Feb 18, 2023
8acf28b
description for continuous_hue
DGriffin91 Feb 18, 2023
a26b71d
update SomewhatBoringDisplayTransform description
DGriffin91 Feb 18, 2023
647436a
fix dithering nan issue
DGriffin91 Feb 18, 2023
b3a260d
Reset all with space/enter
DGriffin91 Feb 18, 2023
ff38ae7
automatic links for doc check
DGriffin91 Feb 18, 2023
173d3e9
component definitions
DGriffin91 Feb 18, 2023
a354928
TonemappingLuts doc string
DGriffin91 Feb 18, 2023
d0e891e
PipelineKey spacing
DGriffin91 Feb 18, 2023
c336932
ColorGrading doc string
DGriffin91 Feb 18, 2023
2cef295
fix ifdef spacing
DGriffin91 Feb 18, 2023
86e3e09
revert pi precision
DGriffin91 Feb 18, 2023
2530b0c
tonemapping doc string
DGriffin91 Feb 18, 2023
1507b7d
ImageFormat::Exr -> ImageFormat::OpenExr
DGriffin91 Feb 18, 2023
819e768
use full path for camera doc
DGriffin91 Feb 18, 2023
ec8355f
make including luts a default feature
DGriffin91 Feb 18, 2023
cfd37da
keep detection of tonemapping change on the node
DGriffin91 Feb 19, 2023
2b342e9
Update crates/bevy_core_pipeline/src/tonemapping/mod.rs
DGriffin91 Feb 19, 2023
abf5056
Update crates/bevy_core_pipeline/src/tonemapping/tonemapping_shared.wgsl
DGriffin91 Feb 19, 2023
d50e9be
Apply suggestions from code review
DGriffin91 Feb 19, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ default = [
"x11",
"filesystem_watcher",
"android_shared_stdcxx",
"tonemapping_luts"
]

# Force dynamic linking, which improves iterative compile times
Expand Down Expand Up @@ -78,6 +79,7 @@ trace = ["bevy_internal/trace"]
wgpu_trace = ["bevy_internal/wgpu_trace"]

# Image format support for texture loading (PNG and HDR are enabled by default)
exr = ["bevy_internal/exr"]
hdr = ["bevy_internal/hdr"]
png = ["bevy_internal/png"]
tga = ["bevy_internal/tga"]
Expand Down Expand Up @@ -131,6 +133,9 @@ android_shared_stdcxx = ["bevy_internal/android_shared_stdcxx"]
# These trace events are expensive even when off, thus they require compile time opt-in.
detailed_trace = ["bevy_internal/detailed_trace"]

# Include tonemapping LUT KTX2 files.
tonemapping_luts = ["bevy_internal/tonemapping_luts"]

[dependencies]
bevy_dylib = { path = "crates/bevy_dylib", version = "0.9.0", default-features = false, optional = true }
bevy_internal = { path = "crates/bevy_internal", version = "0.9.0", default-features = false }
Expand Down Expand Up @@ -389,6 +394,17 @@ description = "Loads and renders a glTF file as a scene"
category = "3D Rendering"
wasm = true

[[example]]
name = "tonemapping"
path = "examples/3d/tonemapping.rs"
required-features = ["ktx2", "zstd"]

[package.metadata.example.tonemapping]
name = "Tonemapping"
description = "Compares tonemapping options"
category = "3D Rendering"
wasm = true

[[example]]
name = "fxaa"
path = "examples/3d/fxaa.rs"
Expand Down
64 changes: 64 additions & 0 deletions assets/shaders/tonemapping_test_patterns.wgsl
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> {
DGriffin91 marked this conversation as resolved.
Show resolved Hide resolved
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);
}
DGriffin91 marked this conversation as resolved.
Show resolved Hide resolved

// Generates a continuous sRGB sweep.
fn continuous_hue(uv: vec2<f32>) -> vec3<f32> {
DGriffin91 marked this conversation as resolved.
Show resolved Hide resolved
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;
}
1 change: 1 addition & 0 deletions crates/bevy_core_pipeline/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ keywords = ["bevy"]
[features]
trace = []
webgl = []
tonemapping_luts = []

[dependencies]
# bevy
Expand Down
9 changes: 7 additions & 2 deletions crates/bevy_core_pipeline/src/core_2d/camera_2d.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use crate::{clear_color::ClearColorConfig, tonemapping::Tonemapping};
use crate::{
clear_color::ClearColorConfig,
tonemapping::{DebandDither, Tonemapping},
};
use bevy_ecs::prelude::*;
use bevy_reflect::Reflect;
use bevy_render::{
Expand Down Expand Up @@ -27,6 +30,7 @@ pub struct Camera2dBundle {
pub global_transform: GlobalTransform,
pub camera_2d: Camera2d,
pub tonemapping: Tonemapping,
pub deband_dither: DebandDither,
}

impl Default for Camera2dBundle {
Expand Down Expand Up @@ -67,7 +71,8 @@ impl Camera2dBundle {
global_transform: Default::default(),
camera: Camera::default(),
camera_2d: Camera2d::default(),
tonemapping: Tonemapping::Disabled,
tonemapping: Tonemapping::None,
deband_dither: DebandDither::Disabled,
}
}
}
15 changes: 10 additions & 5 deletions crates/bevy_core_pipeline/src/core_3d/camera_3d.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
use crate::{clear_color::ClearColorConfig, tonemapping::Tonemapping};
use crate::{
clear_color::ClearColorConfig,
tonemapping::{DebandDither, Tonemapping},
};
use bevy_ecs::prelude::*;
use bevy_reflect::{Reflect, ReflectDeserialize, ReflectSerialize};
use bevy_render::{
camera::{Camera, CameraRenderGraph, Projection},
extract_component::ExtractComponent,
primitives::Frustum,
render_resource::LoadOp,
view::VisibleEntities,
view::{ColorGrading, VisibleEntities},
};
use bevy_transform::prelude::{GlobalTransform, Transform};
use serde::{Deserialize, Serialize};
Expand Down Expand Up @@ -59,23 +62,25 @@ pub struct Camera3dBundle {
pub global_transform: GlobalTransform,
pub camera_3d: Camera3d,
pub tonemapping: Tonemapping,
pub dither: DebandDither,
pub color_grading: ColorGrading,
}

// NOTE: ideally Perspective and Orthographic defaults can share the same impl, but sadly it breaks rust's type inference
impl Default for Camera3dBundle {
fn default() -> Self {
Self {
camera_render_graph: CameraRenderGraph::new(crate::core_3d::graph::NAME),
tonemapping: Tonemapping::Enabled {
deband_dither: true,
},
camera: Default::default(),
projection: Default::default(),
visible_entities: Default::default(),
frustum: Default::default(),
transform: Default::default(),
global_transform: Default::default(),
camera_3d: Default::default(),
tonemapping: Tonemapping::ReinhardLuminance,
dither: DebandDither::Enabled,
color_grading: ColorGrading::default(),
}
}
}
Binary file not shown.
Binary file not shown.
22 changes: 22 additions & 0 deletions crates/bevy_core_pipeline/src/tonemapping/luts/info.txt
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.
Loading