Before AA, I apply tone mapping and after AA, I apply inverse tone mapping.
For the Reinhard operator this is trivial, but what about the Uncharted and ACES operators?
float3 ToneMap_ACESFilmic(float3 hdr) {
static const float a = 2.51f;
static const float b = 0.03f;
static const float c = 2.43f;
static const float d = 0.59f;
static const float e = 0.14f;
return (hdr * (a * hdr + b))
/ (hdr * (c * hdr + d) + e);
}
float3 ToneMap_Uncharted(float3 hdr) {
static const float a = 0.22f;
static const float b = 0.30f;
static const float c = 0.10f;
static const float d = 0.20f;
static const float e = 0.01f;
static const float f = 0.30f;
return ((hdr * (a * hdr + b * c) + d * e)
/ (hdr * (a * hdr + b) + d * f)) - e / f;
}
They claim to be efficient in the number of FLOPs, but the inverse is the opposite and not uniquely defined (you have two choices due to the squares)?
↧