15#include <vsg/core/Export.h>
16#include <vsg/maths/color.h>
21 enum class CoordinateSpace
27 VSG_type_name(vsg::CoordinateSpace);
30 constexpr T linear_to_sRGB(T c)
32 constexpr T cutoff =
static_cast<T
>(0.04045 / 12.92);
33 constexpr T linearFactor =
static_cast<T
>(12.92);
34 constexpr T nonlinearFactor =
static_cast<T
>(1.055);
35 constexpr T exponent =
static_cast<T
>(1.0 / 2.4);
37 return c * linearFactor;
39 return std::pow(c, exponent) * nonlinearFactor -
static_cast<T
>(0.055);
43 constexpr T sRGB_to_linear(T c)
45 constexpr T cutoff =
static_cast<T
>(0.04045);
46 constexpr T linearFactor =
static_cast<T
>(1.0 / 12.92);
47 constexpr T nonlinearFactor =
static_cast<T
>(1.0 / 1.055);
48 constexpr T exponent =
static_cast<T
>(2.4);
50 return c * linearFactor;
52 return std::pow((c +
static_cast<T
>(0.055)) * nonlinearFactor, exponent);
58 return t_vec3<T>(linear_to_sRGB(src.r), linear_to_sRGB(src.g), linear_to_sRGB(src.b));
64 return t_vec4<T>(linear_to_sRGB(src.r), linear_to_sRGB(src.g), linear_to_sRGB(src.b), src.a);
68 constexpr t_vec3<T> linear_to_sRGB(T r, T g, T b)
70 return t_vec3<T>(linear_to_sRGB(r), linear_to_sRGB(g), linear_to_sRGB(b));
74 constexpr t_vec3<T> linear_to_sRGB(T r, T g, T b, T a)
76 return t_vec4<T>(linear_to_sRGB(r), linear_to_sRGB(g), linear_to_sRGB(b), a);
82 return t_vec3<T>(sRGB_to_linear(src.r), sRGB_to_linear(src.g), sRGB_to_linear(src.b));
88 return t_vec4<T>(sRGB_to_linear(src.r), sRGB_to_linear(src.g), sRGB_to_linear(src.b), src.a);
92 constexpr t_vec3<T> sRGB_to_linear(T r, T g, T b)
94 return t_vec3<T>(sRGB_to_linear(r), sRGB_to_linear(g), sRGB_to_linear(b));
98 constexpr t_vec4<T> sRGB_to_linear(T r, T g, T b, T a)
100 return t_vec4<T>(sRGB_to_linear(r), sRGB_to_linear(g), sRGB_to_linear(b), a);
104 void convert(T& data, CoordinateSpace source, CoordinateSpace target)
106 if (source == CoordinateSpace::sRGB && target == CoordinateSpace::LINEAR)
107 data = sRGB_to_linear(data);
108 else if (source == CoordinateSpace::LINEAR && target == CoordinateSpace::sRGB)
109 data = linear_to_sRGB(data);
113 void convert(
size_t num, T* data, CoordinateSpace source, CoordinateSpace target)
115 if (source == CoordinateSpace::sRGB && target == CoordinateSpace::LINEAR)
116 for (
size_t i = 0; i < num; ++i) data[i] = sRGB_to_linear(data[i]);
117 else if (source == CoordinateSpace::LINEAR && target == CoordinateSpace::sRGB)
118 for (
size_t i = 0; i < num; ++i) data[i] = linear_to_sRGB(data[i]);
121 extern VSG_DECLSPEC VkFormat uNorm_to_sRGB(VkFormat format);
122 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