Files
bluflame/netpoet-coop-8k/src/intro/shaders/aces.hlsl
2026-04-19 00:41:25 +02:00

54 lines
1.5 KiB
HLSL

float3 linear_srgb(float3 x)
{
return lerp(1.055 * pow(x, 1. / 2.4) - 0.055, 12.92 * x, step(x, 0.0031308));
}
static const float3x3 AP1_2_XYZ_MAT =
{
0.6624541811, 0.1340042065, 0.1561876870,
0.2722287168, 0.6740817658, 0.0536895174,
-0.0055746495, 0.0040607335, 1.0103391003
};
static const float3x3 XYZ_2_AP1_MAT =
{
1.6410233797, -0.3248032942, -0.2364246952,
-0.6636628587, 1.6153315917, 0.0167563477,
0.0117218943, -0.0082844420, 0.9883948585
};
static const float3x3 D60_2_D65_CAT =
{
0.98722400, -0.00611327, 0.0159533,
-0.00759836, 1.00186000, 0.0053302,
0.00307257, -0.00509595, 1.0816800
};
static const float3x3 XYZ_2_REC2020_MAT =
{
1.7166511880, -0.3556707838, -0.2533662814,
-0.6666843518, 1.6164812366, 0.0157685458,
0.0176398574, -0.0427706133, 0.9421031212
};
static const float SATURATION = 1.2;
static const float EXPOSURE = 1.2;
// ACES curve fit by Stephen Hill
float3 ToneMap(float3 color)
{
//return color;
//return linear_srgb(color);
float3 v = max(0, mul(float3x3(0.59719, 0.35458, 0.04823, 0.07600, 0.90834, 0.01566, 0.02840, 0.13383, 0.83777), color * EXPOSURE));
float3 a = v * (v + 0.0245786f) - 0.000090537f;
float3 b = v * (0.983729f * v + 0.4329510f) + 0.238081f;
color = a / b;
color = lerp(dot(color, float3(0.272229, 0.674082, 0.0536895)), color, SATURATION);
color = mul(AP1_2_XYZ_MAT, color);
color = mul(D60_2_D65_CAT, color);
color = mul(XYZ_2_REC2020_MAT, color);
//return (color);
return linear_srgb(max(0, color));
}