diff options
author | 2013-08-30 01:05:13 +0000 | |
---|---|---|
committer | 2013-08-30 01:05:13 +0000 | |
commit | 8f613c115bfef732fe63bc58bd992a8e56c3d934 (patch) | |
tree | fec1f0765d3c8e3a0a4d55ebcf43cc69d2a17b2b /hlsl/post.fx | |
parent | 1e764f2c8d04a9c086808333abb278b6b3d42688 (diff) |
more HLSL cleanup, part e of pi (nw)
Diffstat (limited to 'hlsl/post.fx')
-rw-r--r-- | hlsl/post.fx | 72 |
1 files changed, 32 insertions, 40 deletions
diff --git a/hlsl/post.fx b/hlsl/post.fx index 0fb466926ba..89a92fd6969 100644 --- a/hlsl/post.fx +++ b/hlsl/post.fx @@ -2,11 +2,11 @@ // Scanline & Shadowmask Effect //----------------------------------------------------------------------------- -texture Diffuse; +texture DiffuseTexture; sampler DiffuseSampler = sampler_state { - Texture = <Diffuse>; + Texture = <DiffuseTexture>; MipFilter = LINEAR; MinFilter = LINEAR; MagFilter = LINEAR; @@ -15,11 +15,11 @@ sampler DiffuseSampler = sampler_state AddressW = CLAMP; }; -texture Shadow; +texture ShadowTexture; sampler ShadowSampler = sampler_state { - Texture = <Shadow>; + Texture = <ShadowTexture>; MipFilter = LINEAR; MinFilter = LINEAR; MagFilter = LINEAR; @@ -58,9 +58,7 @@ struct PS_INPUT //----------------------------------------------------------------------------- uniform float2 ScreenDims; - uniform float2 SourceDims; - uniform float2 SourceRect; VS_OUTPUT vs_main(VS_INPUT Input) @@ -87,55 +85,50 @@ uniform float PI = 3.14159265f; uniform float PincushionAmount = 0.00f; uniform float CurvatureAmount = 0.08f; -uniform float ScanlineAmount = 1.0f; +uniform float ScanlineAlpha = 1.0f; uniform float ScanlineScale = 1.0f; uniform float ScanlineBrightScale = 1.0f; uniform float ScanlineBrightOffset = 1.0f; uniform float ScanlineOffset = 1.0f; uniform float ScanlineHeight = 0.5f; -uniform float UseShadow = 0.0f; -uniform float ShadowBrightness = 1.0f; -uniform float ShadowPixelSizeX = 3.0f; -uniform float ShadowPixelSizeY = 3.0f; -uniform float ShadowMaskSizeX = 3.0f; -uniform float ShadowMaskSizeY = 3.0f; -uniform float ShadowU = 0.375f; -uniform float ShadowV = 0.375f; -uniform float ShadowWidth = 8.0f; -uniform float ShadowHeight = 8.0f; +uniform float ShadowAlpha = 0.0f; +uniform float2 ShadowCount = float2(320.0f, 240.0f); +uniform float2 ShadowUV = float2(0.375f, 0.375f); +uniform float2 ShadowDims = float2(8.0f, 8.0f); uniform float3 Power = float3(1.0f, 1.0f, 1.0f); uniform float3 Floor = float3(0.0f, 0.0f, 0.0f); float4 ps_main(PS_INPUT Input) : COLOR { - float2 Ratios = 1.0f / SourceRect; - + float2 UsedArea = 1.0f / SourceRect; + float2 HalfRect = SourceRect * 0.5f; + float2 R2 = 1.0f / pow(length(UsedArea), 2.0f); // -- Screen Pincushion Calculation -- - float2 PinUnitCoord = Input.TexCoord * Ratios * 2.0f - 1.0f; - float PincushionR2 = pow(length(PinUnitCoord), 2.0f) / pow(length(Ratios), 2.0f); + float2 PinUnitCoord = Input.TexCoord * UsedArea * 2.0f - 1.0f; + float PincushionR2 = pow(length(PinUnitCoord), 2.0f) * R2; float2 PincushionCurve = PinUnitCoord * PincushionAmount * PincushionR2; float2 BaseCoord = Input.TexCoord; float2 ScanCoord = BaseCoord - 0.5f / ScreenDims; - BaseCoord -= 0.5f / Ratios; - BaseCoord *= 1.0f - PincushionAmount * Ratios * 0.2f; // Warning: Magic constant - BaseCoord += 0.5f / Ratios; + BaseCoord -= HalfRect; + BaseCoord *= 1.0f - PincushionAmount * UsedArea * 0.2f; // Warning: Magic constant + BaseCoord += HalfRect; BaseCoord += PincushionCurve; - ScanCoord -= 0.5f / Ratios; - ScanCoord *= 1.0f - PincushionAmount * Ratios * 0.2f; // Warning: Magic constant - ScanCoord += 0.5f / Ratios; + ScanCoord -= HalfRect; + ScanCoord *= 1.0f - PincushionAmount * UsedArea * 0.2f; // Warning: Magic constant + ScanCoord += HalfRect; ScanCoord += PincushionCurve; - float2 CurveClipUnitCoord = Input.TexCoord * Ratios * 2.0f - 1.0f; - float CurvatureClipR2 = pow(length(CurveClipUnitCoord),2.0f) / pow(length(Ratios), 2.0f); + float2 CurveClipUnitCoord = Input.TexCoord * UsedArea * 2.0f - 1.0f; + float CurvatureClipR2 = pow(length(CurveClipUnitCoord), 2.0f) * R2; float2 CurvatureClipCurve = CurveClipUnitCoord * CurvatureAmount * CurvatureClipR2; float2 ScreenClipCoord = Input.TexCoord; - ScreenClipCoord -= 0.5f / Ratios; - ScreenClipCoord *= 1.0f - CurvatureAmount * Ratios * 0.2f; // Warning: Magic constant - ScreenClipCoord += 0.5f / Ratios; + ScreenClipCoord -= HalfRect; + ScreenClipCoord *= 1.0f - CurvatureAmount * UsedArea * 0.2f; // Warning: Magic constant + ScreenClipCoord += HalfRect; ScreenClipCoord += CurvatureClipCurve; // RGB Pincushion Calculation @@ -151,21 +144,20 @@ float4 ps_main(PS_INPUT Input) : COLOR // -- Scanline Simulation -- float InnerSine = ScanCoord.y * SourceDims.y * ScanlineScale; float ScanBrightMod = sin(InnerSine * PI + ScanlineOffset * SourceDims.y); - float3 ScanBrightness = lerp(1.0f, (pow(ScanBrightMod * ScanBrightMod, ScanlineHeight) * ScanlineBrightScale + 1.0f) * 0.5f, ScanlineAmount); + float3 ScanBrightness = lerp(1.0f, (pow(ScanBrightMod * ScanBrightMod, ScanlineHeight) * ScanlineBrightScale + 1.0f) * 0.5f, ScanlineAlpha); float3 Scanned = BaseTexel.rgb * ScanBrightness; // -- Color Compression (increasing the floor of the signal without affecting the ceiling) -- Scanned = Floor + (1.0f - Floor) * Scanned; - float2 ShadowDims = float2(ShadowWidth, ShadowHeight); - float2 ShadowUV = float2(ShadowU, ShadowV); - float2 ShadowMaskSize = float2(ShadowMaskSizeX, ShadowMaskSizeY); - float2 ShadowFrac = frac(BaseCoord * ShadowMaskSize); - float2 ShadowCoord = ShadowFrac * ShadowUV + float2(1.5f / ShadowWidth, 1.5f / ShadowHeight); - float3 ShadowTexel = lerp(1.0f, tex2D(ShadowSampler, ShadowCoord).rgb, UseShadow); + // Shadow mask + // Note: This is broken right now and needs fixed + float2 ShadowFrac = frac(BaseCoord * ShadowCount); + float2 ShadowCoord = ShadowFrac * ShadowUV + 0.5f / ShadowDims; + float3 ShadowTexel = lerp(1.0f, tex2D(ShadowSampler, ShadowCoord).rgb, ShadowAlpha); // -- Final Pixel -- - float4 Output = float4(Scanned * lerp(1.0f, ShadowTexel, ShadowBrightness), BaseTexel.a) * Input.Color; + float4 Output = float4(Scanned * ShadowTexel, BaseTexel.a) * Input.Color; Output.r = pow(Output.r, Power.r); Output.g = pow(Output.g, Power.g); |