15#include <vsg/maths/color.h>
20 enum class CoordinateSpace
26 VSG_type_name(vsg::CoordinateSpace);
29 constexpr T linear_to_sRGB(T c)
31 constexpr T cutoff =
static_cast<T
>(0.04045 / 12.92);
32 constexpr T linearFactor =
static_cast<T
>(12.92);
33 constexpr T nonlinearFactor =
static_cast<T
>(1.055);
34 constexpr T exponent =
static_cast<T
>(1.0 / 2.4);
36 return c * linearFactor;
38 return std::pow(c, exponent) * nonlinearFactor -
static_cast<T
>(0.055);
42 constexpr T sRGB_to_linear(T c)
44 constexpr T cutoff =
static_cast<T
>(0.04045);
45 constexpr T linearFactor =
static_cast<T
>(1.0 / 12.92);
46 constexpr T nonlinearFactor =
static_cast<T
>(1.0 / 1.055);
47 constexpr T exponent =
static_cast<T
>(2.4);
49 return c * linearFactor;
51 return std::pow((c +
static_cast<T
>(0.055)) * nonlinearFactor, exponent);
57 return t_vec3<T>(linear_to_sRGB(src.r), linear_to_sRGB(src.g), linear_to_sRGB(src.b));
63 return t_vec4<T>(linear_to_sRGB(src.r), linear_to_sRGB(src.g), linear_to_sRGB(src.b), src.a);
67 constexpr t_vec3<T> linear_to_sRGB(T r, T g, T b)
69 return t_vec3<T>(linear_to_sRGB(r), linear_to_sRGB(g), linear_to_sRGB(b));
73 constexpr t_vec3<T> linear_to_sRGB(T r, T g, T b, T a)
75 return t_vec4<T>(linear_to_sRGB(r), linear_to_sRGB(g), linear_to_sRGB(b), a);
81 return t_vec3<T>(sRGB_to_linear(src.r), sRGB_to_linear(src.g), sRGB_to_linear(src.b));
87 return t_vec4<T>(sRGB_to_linear(src.r), sRGB_to_linear(src.g), sRGB_to_linear(src.b), src.a);
91 constexpr t_vec3<T> sRGB_to_linear(T r, T g, T b)
93 return t_vec3<T>(sRGB_to_linear(r), sRGB_to_linear(g), sRGB_to_linear(b));
97 constexpr t_vec4<T> sRGB_to_linear(T r, T g, T b, T a)
99 return t_vec4<T>(sRGB_to_linear(r), sRGB_to_linear(g), sRGB_to_linear(b), a);
103 void convert(T& data, CoordinateSpace source, CoordinateSpace target)
105 if (source == CoordinateSpace::sRGB && target == CoordinateSpace::LINEAR)
106 data = sRGB_to_linear(data);
107 else if (source == CoordinateSpace::LINEAR && target == CoordinateSpace::sRGB)
108 data = linear_to_sRGB(data);
112 void convert(
size_t num, T* data, CoordinateSpace source, CoordinateSpace target)
114 if (source == CoordinateSpace::sRGB && target == CoordinateSpace::LINEAR)
115 for (
size_t i = 0; i < num; ++i) data[i] = sRGB_to_linear(data[i]);
116 else if (source == CoordinateSpace::LINEAR && target == CoordinateSpace::sRGB)
117 for (
size_t i = 0; i < num; ++i) data[i] = linear_to_sRGB(data[i]);
120 extern VSG_DECLSPEC VkFormat uNorm_to_sRGB(VkFormat format);
121 extern VSG_DECLSPEC VkFormat sRGB_to_uNorm(VkFormat format);
t_vec3 template class that represents a 3D vector
Definition vec3.h:34
t_vec4 template class that represents a 4D vector
Definition vec4.h:35