|
| 1 | +#if !defined(TONEMAPPING_GLSL_INCLUDE_GUARD) |
| 2 | +#define TONEMAPPING_GLSL_INCLUDE_GUARD |
| 3 | + |
| 4 | + |
| 5 | +vec3 tonemapReinhard(vec3 aColor) |
| 6 | +{ |
| 7 | + return aColor / (aColor + 1); |
| 8 | +} |
| 9 | + |
| 10 | +// |
| 11 | +// ACES |
| 12 | +// see: https://github.com/TheRealMJP/BakingLab/blob/v1.0/BakingLab/ACES.hlsl |
| 13 | +// note: GLSL matrices are column major, so the literal value is transposed |
| 14 | +// |
| 15 | + |
| 16 | +// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT |
| 17 | +const mat3 ACESInputMat = mat3( |
| 18 | + 0.59719, 0.07600, 0.02840, |
| 19 | + 0.35458, 0.90834, 0.13383, |
| 20 | + 0.04823, 0.01566, 0.83777 |
| 21 | +); |
| 22 | + |
| 23 | +// ODT_SAT => XYZ => D60_2_D65 => sRGB |
| 24 | +const mat3 ACESOutputMat = mat3( |
| 25 | + 1.60475, -0.10208, -0.00327, |
| 26 | + -0.53108, 1.10813, -0.07276, |
| 27 | + -0.07367, -0.00605, 1.07602 |
| 28 | +); |
| 29 | + |
| 30 | +vec3 RRTAndODTFit(vec3 v) |
| 31 | +{ |
| 32 | + vec3 a = v * (v + 0.0245786f) - 0.000090537f; |
| 33 | + vec3 b = v * (0.983729f * v + 0.4329510f) + 0.238081f; |
| 34 | + return a / b; |
| 35 | +} |
| 36 | + |
| 37 | +vec3 tonemapAces(vec3 aColor) |
| 38 | +{ |
| 39 | + aColor = ACESInputMat * aColor; |
| 40 | + aColor = RRTAndODTFit(aColor); |
| 41 | + aColor = ACESOutputMat * aColor; |
| 42 | + return clamp(aColor, 0, 1); |
| 43 | +} |
| 44 | + |
| 45 | +vec3 tonemapAces_approx(vec3 v) |
| 46 | +{ |
| 47 | + v *= 0.6f; |
| 48 | + float a = 2.51f; |
| 49 | + float b = 0.03f; |
| 50 | + float c = 2.43f; |
| 51 | + float d = 0.59f; |
| 52 | + float e = 0.14f; |
| 53 | + return clamp( |
| 54 | + (v*(a*v+b)) / (v*(c*v+d)+e), |
| 55 | + 0, 1); |
| 56 | +} |
| 57 | + |
| 58 | + |
| 59 | +#endif //include guard |
0 commit comments