mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Branch on lower color values for more accurate speedy color conversion, add simple color conversion benchmarks
This commit is contained in:
parent
71bd7f15ee
commit
d36b263627
@ -37,3 +37,7 @@ criterion = "0.3"
|
||||
[[bench]]
|
||||
name = "chonk_benchmark"
|
||||
harness = false
|
||||
|
||||
[[bench]]
|
||||
name = "color_benchmark"
|
||||
harness = false
|
||||
|
@ -1,7 +1,6 @@
|
||||
#[macro_use]
|
||||
extern crate criterion;
|
||||
|
||||
use criterion::black_box;
|
||||
use criterion::criterion_group;
|
||||
use criterion::criterion_main;
|
||||
use criterion::Criterion;
|
||||
|
||||
use vek::*;
|
||||
|
22
common/benches/color_benchmark.rs
Normal file
22
common/benches/color_benchmark.rs
Normal file
@ -0,0 +1,22 @@
|
||||
use criterion::black_box;
|
||||
use criterion::criterion_group;
|
||||
use criterion::criterion_main;
|
||||
use criterion::Criterion;
|
||||
|
||||
use vek::*;
|
||||
use veloren_common::util::{linear_to_srgb, srgb_to_linear};
|
||||
|
||||
fn criterion_benchmark(c: &mut Criterion) {
|
||||
c.bench_function("color: srgb to linear (0.5, 0.1, 0.5)", |b| {
|
||||
b.iter(|| {
|
||||
black_box(srgb_to_linear(black_box(Rgb::new(0.5, 0.1, 0.5))));
|
||||
})
|
||||
});
|
||||
c.bench_function("color: linear to srgb (0.5, 0.1, 0.5)", |b| {
|
||||
b.iter(|| {
|
||||
black_box(linear_to_srgb(black_box(Rgb::new(0.5, 0.1, 0.5))));
|
||||
})
|
||||
});
|
||||
}
|
||||
criterion_group!(benches, criterion_benchmark);
|
||||
criterion_main!(benches);
|
@ -9,15 +9,27 @@ use vek::{Mat3, Rgb, Rgba, Vec3};
|
||||
|
||||
#[inline(always)]
|
||||
pub fn srgb_to_linear(col: Rgb<f32>) -> Rgb<f32> {
|
||||
0.012522878 * col + 0.682171111 * col * col + 0.305306011 * col * col * col
|
||||
col.map(|c| {
|
||||
if c <= 0.104 {
|
||||
c * 0.08677088
|
||||
} else {
|
||||
0.012522878 * c + 0.682171111 * c * c + 0.305306011 * c * c * c
|
||||
}
|
||||
})
|
||||
}
|
||||
#[inline(always)]
|
||||
pub fn linear_to_srgb(col: Rgb<f32>) -> Rgb<f32> {
|
||||
let s1 = col.sqrt();
|
||||
col.map(|c| {
|
||||
if c <= 0.0060 {
|
||||
c * 11.500726
|
||||
} else {
|
||||
let s1 = c.sqrt();
|
||||
let s2 = s1.sqrt();
|
||||
let s3 = s2.sqrt();
|
||||
0.585122381 * s1 + 0.783140355 * s2 - 0.368262736 * s3
|
||||
}
|
||||
})
|
||||
}
|
||||
#[inline(always)]
|
||||
pub fn srgba_to_linear(col: Rgba<f32>) -> Rgba<f32> {
|
||||
Rgba::from_translucent(srgb_to_linear(Rgb::from(col)), col.a)
|
||||
|
Loading…
Reference in New Issue
Block a user