Warning, /plasma/kwin/src/opengl/colormanagement.glsl is written in an unsupported language. File is not indexed.
0001 const int sRGB_EOTF = 0; 0002 const int linear_EOTF = 1; 0003 const int PQ_EOTF = 2; 0004 const int scRGB_EOTF = 3; 0005 const int gamma22_EOTF = 4; 0006 0007 uniform mat4 colorimetryTransform; 0008 uniform int sourceNamedTransferFunction; 0009 uniform int destinationNamedTransferFunction; 0010 uniform float sdrBrightness;// in nits 0011 uniform float maxHdrBrightness; // in nits 0012 0013 vec3 nitsToPq(vec3 nits) { 0014 vec3 normalized = clamp(nits / 10000.0, vec3(0), vec3(1)); 0015 const float c1 = 0.8359375; 0016 const float c2 = 18.8515625; 0017 const float c3 = 18.6875; 0018 const float m1 = 0.1593017578125; 0019 const float m2 = 78.84375; 0020 vec3 powed = pow(normalized, vec3(m1)); 0021 vec3 num = vec3(c1) + c2 * powed; 0022 vec3 denum = vec3(1.0) + c3 * powed; 0023 return pow(num / denum, vec3(m2)); 0024 } 0025 vec3 pqToNits(vec3 pq) { 0026 const float c1 = 0.8359375; 0027 const float c2 = 18.8515625; 0028 const float c3 = 18.6875; 0029 const float m1_inv = 1.0 / 0.1593017578125; 0030 const float m2_inv = 1.0 / 78.84375; 0031 vec3 powed = pow(pq, vec3(m2_inv)); 0032 vec3 num = max(powed - c1, vec3(0.0)); 0033 vec3 den = c2 - c3 * powed; 0034 return 10000.0 * pow(num / den, vec3(m1_inv)); 0035 } 0036 vec3 srgbToLinear(vec3 color) { 0037 bvec3 isLow = lessThanEqual(color, vec3(0.04045f)); 0038 vec3 loPart = color / 12.92f; 0039 vec3 hiPart = pow((color + 0.055f) / 1.055f, vec3(12.0f / 5.0f)); 0040 #if __VERSION__ >= 130 0041 return mix(hiPart, loPart, isLow); 0042 #else 0043 return mix(hiPart, loPart, vec3(isLow.r ? 1.0 : 0.0, isLow.g ? 1.0 : 0.0, isLow.b ? 1.0 : 0.0)); 0044 #endif 0045 } 0046 0047 vec3 linearToSrgb(vec3 color) { 0048 bvec3 isLow = lessThanEqual(color, vec3(0.0031308f)); 0049 vec3 loPart = color * 12.92f; 0050 vec3 hiPart = pow(color, vec3(5.0f / 12.0f)) * 1.055f - 0.055f; 0051 #if __VERSION__ >= 130 0052 return mix(hiPart, loPart, isLow); 0053 #else 0054 return mix(hiPart, loPart, vec3(isLow.r ? 1.0 : 0.0, isLow.g ? 1.0 : 0.0, isLow.b ? 1.0 : 0.0)); 0055 #endif 0056 } 0057 0058 vec3 doTonemapping(vec3 color, float maxBrightness) { 0059 // TODO do something better here 0060 return clamp(color.rgb, vec3(0.0), vec3(maxBrightness)); 0061 } 0062 0063 vec4 encodingToNits(vec4 color, int sourceTransferFunction) { 0064 if (sourceTransferFunction == sRGB_EOTF) { 0065 color.rgb /= max(color.a, 0.001); 0066 color.rgb = sdrBrightness * srgbToLinear(color.rgb); 0067 color.rgb *= color.a; 0068 } else if (sourceTransferFunction == PQ_EOTF) { 0069 color.rgb /= max(color.a, 0.001); 0070 color.rgb = pqToNits(color.rgb); 0071 color.rgb *= color.a; 0072 } else if (sourceTransferFunction == scRGB_EOTF) { 0073 color.rgb *= 80.0; 0074 } else if (sourceTransferFunction == gamma22_EOTF) { 0075 color.rgb /= max(color.a, 0.001); 0076 color.rgb = sdrBrightness * pow(color.rgb, vec3(2.2)); 0077 color.rgb *= color.a; 0078 } 0079 return color; 0080 } 0081 0082 vec4 sourceEncodingToNitsInDestinationColorspace(vec4 color) { 0083 color = encodingToNits(color, sourceNamedTransferFunction); 0084 color.rgb = (colorimetryTransform * vec4(color.rgb, 1.0)).rgb; 0085 return vec4(doTonemapping(color.rgb, maxHdrBrightness), color.a); 0086 } 0087 0088 vec4 nitsToEncoding(vec4 color, int destinationTransferFunction) { 0089 if (destinationTransferFunction == sRGB_EOTF) { 0090 color.rgb /= max(color.a, 0.001); 0091 color.rgb = linearToSrgb(doTonemapping(color.rgb, sdrBrightness) / sdrBrightness); 0092 color.rgb *= color.a; 0093 } else if (destinationTransferFunction == PQ_EOTF) { 0094 color.rgb /= max(color.a, 0.001); 0095 color.rgb = nitsToPq(color.rgb); 0096 color.rgb *= color.a; 0097 } else if (destinationTransferFunction == scRGB_EOTF) { 0098 color.rgb /= 80.0; 0099 } else if (destinationTransferFunction == gamma22_EOTF) { 0100 color.rgb /= max(color.a, 0.001); 0101 color.rgb = pow(color.rgb / sdrBrightness, vec3(1.0 / 2.2)); 0102 color.rgb *= color.a; 0103 } 0104 return color; 0105 } 0106 0107 vec4 nitsToDestinationEncoding(vec4 color) { 0108 return nitsToEncoding(color, destinationNamedTransferFunction); 0109 }