summaryrefslogtreecommitdiffstatshomepage
path: root/hlsl/phosphor.fx
diff options
context:
space:
mode:
Diffstat (limited to 'hlsl/phosphor.fx')
-rw-r--r--hlsl/phosphor.fx46
1 files changed, 21 insertions, 25 deletions
diff --git a/hlsl/phosphor.fx b/hlsl/phosphor.fx
index 579a110eb6d..2505b27e17f 100644
--- a/hlsl/phosphor.fx
+++ b/hlsl/phosphor.fx
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Ryan Holtz
+// copyright-holders:Ryan Holtz, Westley M. Martinez
//-----------------------------------------------------------------------------
// Phosphor Effect
//-----------------------------------------------------------------------------
@@ -95,12 +95,14 @@ VS_OUTPUT vs_main(VS_INPUT Input)
// Phosphor Pixel Shader
//-----------------------------------------------------------------------------
-uniform bool LCD = false;
uniform int Mode = 0;
uniform float DeltaTime = 0.0f;
-uniform float LCDTau = 0.0f;
uniform float3 TimeConstant = { 0.0f, 0.0f, 0.0f };
uniform float3 Beta = { 0.0f, 0.0f, 0.0f };
+static const float TAU_FACTOR = 0.4342944819;
+static const float GAMMA_INV_FACTOR = TAU_FACTOR / 100;
+// sRGB half-step for small intensities
+float THRESHOLD = 0.5f / 255.0f / 12.92f;
float4 ps_main(PS_INPUT Input) : COLOR
{
@@ -110,47 +112,41 @@ float4 ps_main(PS_INPUT Input) : COLOR
float g = PrevPix.g;
float b = PrevPix.b;
- if (LCD) {
- r *= LCDTau == 0 ? 0 : exp(-DeltaTime / LCDTau);
- g *= LCDTau == 0 ? 0 : exp(-DeltaTime / LCDTau);
- b *= LCDTau == 0 ? 0 : exp(-DeltaTime / LCDTau);
- }
- else if (Mode == 0) {
+ if (Mode == 0) {
r = 0;
g = 0;
b = 0;
}
else if (Mode == 1) {
- float3 tau = TimeConstant * 0.4342944819;
+ float3 tau = TimeConstant * TAU_FACTOR;
r *= tau.r == 0 ? 0 : exp(-DeltaTime / tau.r);
g *= tau.g == 0 ? 0 : exp(-DeltaTime / tau.g);
b *= tau.b == 0 ? 0 : exp(-DeltaTime / tau.b);
}
else {
- float3 gamma = 1 / (TimeConstant * 0.004342944819);
+ float3 gamma = 1 / (TimeConstant * GAMMA_INV_FACTOR);
if (r != 0.0f)
- r = pow(gamma.r * DeltaTime + pow(1 / r, 1 / Beta.r), -Beta.r);
+ r = pow(gamma.r * DeltaTime + pow(1 / r, 1 / Beta.r),
+ -Beta.r);
if (g != 0.0f)
- g = pow(gamma.g * DeltaTime + pow(1 / g, 1 / Beta.g), -Beta.g);
+ g = pow(gamma.g * DeltaTime + pow(1 / g, 1 / Beta.g),
+ -Beta.g);
if (b != 0.0f)
- b = pow(gamma.b * DeltaTime + pow(1 / b, 1 / Beta.b), -Beta.b);
+ b = pow(gamma.b * DeltaTime + pow(1 / b, 1 / Beta.b),
+ -Beta.b);
}
// Prevent burn-in
if (DeltaTime > 0.0f) {
- float threshold = 0.5f / 255.0f / 12.92; // Half-color increment
- r = max(0.0f, r - threshold);
- g = max(0.0f, g - threshold);
- b = max(0.0f, b - threshold);
+ r = max(0.0f, r - THRESHOLD);
+ g = max(0.0f, g - THRESHOLD);
+ b = max(0.0f, b - THRESHOLD);
}
-
- float RedMax = max(CurrPix.r, r);
- float GreenMax = max(CurrPix.g, g);
- float BlueMax = max(CurrPix.b, b);
-
- return Passthrough ?
- CurrPix : float4(RedMax, GreenMax, BlueMax, CurrPix.a);
+ r = max(CurrPix.r, r);
+ g = max(CurrPix.g, g);
+ b = max(CurrPix.b, b);
+ return Passthrough ? CurrPix : float4(r, g, b, CurrPix.a);
}
//-----------------------------------------------------------------------------