12 #ifndef hifi_ColorUtils_h
13 #define hifi_ColorUtils_h
15 #include <glm/glm.hpp>
17 #include "SharedUtil.h"
19 #include "DependencyManager.h"
21 extern const float srgbToLinearLookupTable[256];
25 inline static glm::vec3 toVec3(
const glm::u8vec3& color);
28 inline static glm::vec3 toGamma22Vec3(
const glm::vec3& linear);
32 inline static glm::vec3 sRGBToLinearVec3(
const glm::vec3& srgb);
33 inline static glm::vec3 tosRGBVec3(
const glm::vec3& srgb);
35 inline static glm::vec4 sRGBToLinearVec4(
const glm::vec4& srgb);
36 inline static glm::vec4 tosRGBVec4(
const glm::vec4& srgb);
38 inline static float sRGBToLinearFloat(
const float& srgb);
39 inline static float sRGB8ToLinearFloat(
const uint8_t srgb);
40 inline static float tosRGBFloat(
const float& linear);
43 inline glm::vec3 ColorUtils::toVec3(
const glm::u8vec3& color) {
44 const float ONE_OVER_255 = 1.0f / 255.0f;
45 return glm::vec3(color.x * ONE_OVER_255, color.y * ONE_OVER_255, color.z * ONE_OVER_255);
48 inline glm::vec3 ColorUtils::toGamma22Vec3(
const glm::vec3& linear) {
49 const float INV_GAMMA_22 = 1.0f / 2.2f;
51 return glm::vec3(glm::pow(linear.x, INV_GAMMA_22), glm::pow(linear.y, INV_GAMMA_22), glm::pow(linear.z, INV_GAMMA_22));
55 inline glm::vec3 ColorUtils::sRGBToLinearVec3(
const glm::vec3& srgb) {
56 return glm::vec3(sRGBToLinearFloat(srgb.x), sRGBToLinearFloat(srgb.y), sRGBToLinearFloat(srgb.z));
60 inline glm::vec3 ColorUtils::tosRGBVec3(
const glm::vec3& linear) {
61 return glm::vec3(tosRGBFloat(linear.x), tosRGBFloat(linear.y), tosRGBFloat(linear.z));
65 inline glm::vec4 ColorUtils::sRGBToLinearVec4(
const glm::vec4& srgb) {
66 return glm::vec4(sRGBToLinearFloat(srgb.x), sRGBToLinearFloat(srgb.y), sRGBToLinearFloat(srgb.z), srgb.w);
70 inline glm::vec4 ColorUtils::tosRGBVec4(
const glm::vec4& linear) {
71 return glm::vec4(tosRGBFloat(linear.x), tosRGBFloat(linear.y), tosRGBFloat(linear.z), linear.w);
76 inline float ColorUtils::sRGBToLinearFloat(
const float &srgb) {
77 const float SRGB_ELBOW = 0.04045f;
78 float linearValue = 0.0f;
81 if (srgb <= SRGB_ELBOW) {
82 linearValue = srgb / 12.92f;
84 linearValue = powf(((srgb + 0.055f) / 1.055f), 2.4f);
89 inline float ColorUtils::sRGB8ToLinearFloat(
const uint8_t srgb) {
90 return srgbToLinearLookupTable[srgb];
95 inline float ColorUtils::tosRGBFloat(
const float &linear) {
96 const float SRGB_ELBOW_INV = 0.0031308f;
97 float sRGBValue = 0.0f;
100 if (linear <= 0.0f) {
102 }
else if (0 < linear && linear < SRGB_ELBOW_INV) {
103 sRGBValue = 12.92f * linear;
104 }
else if (SRGB_ELBOW_INV <= linear && linear < 1) {
105 sRGBValue = 1.055f * powf(linear, 0.41666f) - 0.055f;