|
1 | 1 | const kRgbToXyzMat = mat3x3<f32>( |
2 | | - vec3<f32>(0.4124, 0.2126, 0.0193), |
3 | | - vec3<f32>(0.3576, 0.7152, 0.1192), |
4 | | - vec3<f32>(0.1805, 0.0722, 0.9505)); |
| 2 | + vec3<f32>(0.4124, 0.2126, 0.0193), |
| 3 | + vec3<f32>(0.3576, 0.7152, 0.1192), |
| 4 | + vec3<f32>(0.1805, 0.0722, 0.9505) |
| 5 | +); |
5 | 6 |
|
6 | 7 | fn colRgbToXyz(rgb: vec3<f32>) -> vec3<f32> { |
7 | | - return kRgbToXyzMat * rgb; |
| 8 | + return kRgbToXyzMat * rgb; |
8 | 9 | } |
9 | 10 |
|
10 | 11 | fn colSRgbToXyz(sRgb: vec3<f32>) -> vec3<f32> { |
11 | | - var rgb = select(sRgb / 12.92, |
12 | | - pow((sRgb + 0.055) / 1.055, vec3<f32>(2.4)), |
13 | | - sRgb > vec3<f32>(0.04045)); |
14 | | - return kRgbToXyzMat * rgb; |
| 12 | + var rgb = select(sRgb / 12.92, |
| 13 | + pow((sRgb + 0.055) / 1.055, vec3<f32>(2.4)), |
| 14 | + sRgb > vec3<f32>(0.04045)); |
| 15 | + return kRgbToXyzMat * rgb; |
15 | 16 | } |
16 | 17 |
|
17 | 18 | const kXyzToRgbMat = mat3x3<f32>( |
18 | | - vec3<f32>(3.2046, -0.9689, 0.0577), |
19 | | - vec3<f32>(-1.5372, 1.8758, -0.2040), |
20 | | - vec3<f32>(-0.4986, 0.0415, 1.0570)); |
| 19 | + vec3<f32>(3.2046, -0.9689, 0.0577), |
| 20 | + vec3<f32>(-1.5372, 1.8758, -0.2040), |
| 21 | + vec3<f32>(-0.4986, 0.0415, 1.0570) |
| 22 | +); |
21 | 23 |
|
22 | 24 | fn colXyzToSRgb(xyz: vec3<f32>) -> vec3<f32> { |
23 | | - var rgb = kXyzToRgbMat * xyz; |
| 25 | + var rgb = kXyzToRgbMat * xyz; |
24 | 26 |
|
25 | | - rgb = select(rgb * 12.92, |
26 | | - 1.055 * (pow(rgb, vec3<f32>(1/2.4)) - 0.055), |
27 | | - rgb > vec3<f32>(0.0031308)); |
| 27 | + rgb = select(rgb * 12.92, |
| 28 | + 1.055 * (pow(rgb, vec3<f32>(1 / 2.4)) - 0.055), |
| 29 | + rgb > vec3<f32>(0.0031308)); |
28 | 30 |
|
29 | | - return rgb; |
| 31 | + return rgb; |
30 | 32 | } |
31 | 33 |
|
32 | | -const kReferenceD65 = vec3<f32>(95.0489, 100, 108.884); |
| 34 | +const kReferenceD65 = vec3<f32>(0.950489, 1, 1.08884); |
| 35 | + |
| 36 | + |
| 37 | +// matrix |
| 38 | +// ┌ ┐ |
| 39 | +// │ 0 116 0 -16 │ |
| 40 | +// │ 500 -500 0 0 │ |
| 41 | +// │ 0 200 -200 0 │ |
| 42 | +// └ ┘ |
| 43 | + |
33 | 44 |
|
34 | 45 | const kXyzToLabMat = mat4x3<f32>( |
35 | | - vec3<f32>(0, 500, 0), |
36 | | - vec3<f32>(116, -500, 200), |
37 | | - vec3<f32>(0, 0, -200), |
38 | | - vec3<f32>(-16, 0, 0)); |
| 46 | + vec3<f32>(0, 500, 0), |
| 47 | + vec3<f32>(116, -500, 200), |
| 48 | + vec3<f32>(0, 0, -200), |
| 49 | + vec3<f32>(-16, 0, 0) |
| 50 | +); |
39 | 51 |
|
40 | 52 | fn colXyzToCIELab(xyz: vec3<f32>) -> vec3<f32> { |
41 | | - var s = xyz / kReferenceD65; |
| 53 | + var s = xyz / kReferenceD65; |
42 | 54 |
|
43 | | - const d3 = (6.0 * 6.0 * 6.0) / (29.0 * 29.0 * 29.0); |
44 | | - const i3d2 = (29.0 * 29.0) / (6.0 * 6.0 * 3); |
| 55 | + const d3 = (6.0 * 6.0 * 6.0) / (29.0 * 29.0 * 29.0); |
| 56 | + const i3d2 = (29.0 * 29.0) / (6.0 * 6.0 * 3); |
45 | 57 |
|
46 | | - s = select(s * i3d2 + vec3<f32>(4.0/29.0), |
47 | | - pow(s, vec3<f32>(1/3)), |
48 | | - s > vec3<f32>(d3)); |
| 58 | + s = select(s * i3d2 + vec3<f32>(4.0 / 29.0), |
| 59 | + pow(s, vec3<f32>(1.0 / 3.0)), |
| 60 | + s > vec3<f32>(d3)); |
49 | 61 |
|
50 | | - return kXyzToLabMat * vec4<f32>(s, 1); |
| 62 | + return kXyzToLabMat * vec4<f32>(s, 1); |
51 | 63 | } |
52 | 64 |
|
| 65 | +// matrix |
| 66 | +// ┌ ┐ |
| 67 | +// │ 1/116 1/500 0 16/116 │ |
| 68 | +// │ 1/116 0 0 16/116 │ |
| 69 | +// │ 1/116 0 -1/200 16/116 │ |
| 70 | +// └ ┘ |
53 | 71 | const kLabToXyzMat = mat4x3<f32>( |
54 | | - vec3<f32>(1.0/116.0), |
55 | | - vec3<f32>(1.0/500.0, 0, 0), |
56 | | - vec3<f32>(0, 0, -1.0/200.0), |
57 | | - vec3<f32>(16.0/116.0)); |
| 72 | + vec3<f32>(1.0 / 116.0, 1.0 / 116.0, 1.0 / 116.0), |
| 73 | + vec3<f32>(1.0 / 500.0, 0, 0), |
| 74 | + vec3<f32>(0, 0, -1.0 / 200.0), |
| 75 | + vec3<f32>(16.0 / 116.0, 16.0 / 116.0, 16.0 / 116.0) |
| 76 | +); |
58 | 77 |
|
59 | 78 | fn colCIELabToXyz(lab: vec3<f32>) -> vec3<f32> { |
60 | | - var xyz = kLabToXyzMat * vec4<f32>(lab, 1); |
| 79 | + var xyz = kLabToXyzMat * vec4<f32>(lab, 1); |
61 | 80 |
|
62 | | - const d = vec3<f32>(6.0/29.0); |
63 | | - const t3d2 = vec3<f32>((3.0 * 6.0 * 6.0) / (29.0 * 29.0)); |
| 81 | + // δ = 6/29 24/116 |
| 82 | + const d = vec3<f32>(6.0 / 29.0); |
| 83 | + // 3δ² |
| 84 | + const t3d2 = vec3<f32>((3.0 * 6.0 * 6.0) / (29.0 * 29.0)); |
64 | 85 |
|
65 | | - xyz = select(t3d2 * (xyz - vec3<f32>(4.0/29.0)), |
66 | | - xyz * xyz * xyz, |
67 | | - xyz > d); |
| 86 | + xyz = select(t3d2 * (xyz - vec3<f32>(4.0 / 29.0)), // t ≤ δ → 3δ²(t - 4/29) |
| 87 | + xyz * xyz * xyz, // t > δ → t³ |
| 88 | + xyz > d); |
68 | 89 |
|
69 | | - return xyz * kReferenceD65; |
| 90 | + return xyz * kReferenceD65; |
70 | 91 | } |
71 | 92 |
|
72 | 93 | fn colCIELabToLch(lab: vec3<f32>) -> vec3<f32> { |
73 | | - var h = degrees(atan2(lab.z, lab.y)); |
74 | | - h = select(h + 360, h, h >= 0); |
75 | | - |
76 | | - return vec3<f32>( |
77 | | - lab.x, |
78 | | - length(lab.yz), |
79 | | - h); |
| 94 | + var h = degrees(atan2(lab.z, lab.y)); |
| 95 | + h = select(h + 360, h, h >= 0); |
| 96 | + |
| 97 | + return vec3<f32>( |
| 98 | + lab.x, |
| 99 | + length(lab.yz), |
| 100 | + h |
| 101 | + ); |
80 | 102 | } |
81 | 103 |
|
82 | 104 | fn colCIELchToLab(lch: vec3<f32>) -> vec3<f32> { |
83 | | - var h = radians(lch.z); |
84 | | - return vec3<f32>(lch.x, lch.y * cos(h), lch.y * sin(h)); |
| 105 | + var h = radians(lch.z); |
| 106 | + return vec3<f32>(lch.x, lch.y * sin(h), lch.y * cos(h)); |
85 | 107 | } |
0 commit comments