From 37b596b7b43f67ef80cd51d7a33da7f34be227c7 Mon Sep 17 00:00:00 2001 From: ImJezze Date: Sat, 9 Jan 2016 16:15:45 +0100 Subject: Refactored color converge - color converge is now independent from ratio - the radial converge now "translates" the most outer pixel as thay would be translated by the linar converge with the same amount - color converge is now limited to a maximum of 10 - added color converge pass to vector rendering --- hlsl/deconverge.fx | 92 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 40 deletions(-) (limited to 'hlsl') diff --git a/hlsl/deconverge.fx b/hlsl/deconverge.fx index 6ff5c287a7d..3c1cbeeeb1f 100644 --- a/hlsl/deconverge.fx +++ b/hlsl/deconverge.fx @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Ryan Holtz +// copyright-holders:Ryan Holtz,ImJezze //----------------------------------------------------------------------------- // Deconvergence Effect //----------------------------------------------------------------------------- @@ -29,12 +29,8 @@ struct VS_OUTPUT { float4 Position : POSITION; float4 Color : COLOR0; - //float2 RedCoord : TEXCOORD0; - //float2 GrnCoord : TEXCOORD1; - //float2 BluCoord : TEXCOORD2; - float3 CoordX : TEXCOORD0; - float3 CoordY : TEXCOORD1; - float2 TexCoord : TEXCOORD2; + float3 TexCoordX : TEXCOORD0; + float3 TexCoordY : TEXCOORD1; }; struct VS_INPUT @@ -42,61 +38,78 @@ struct VS_INPUT float4 Position : POSITION; float4 Color : COLOR0; float2 TexCoord : TEXCOORD0; - float2 Unused : TEXCOORD1; }; struct PS_INPUT { float4 Color : COLOR0; - //float2 RedCoord : TEXCOORD0; - //float2 GrnCoord : TEXCOORD1; - //float2 BluCoord : TEXCOORD2; - float3 CoordX : TEXCOORD0; - float3 CoordY : TEXCOORD1; - float2 TexCoord : TEXCOORD2; + float3 TexCoordX : TEXCOORD0; + float3 TexCoordY : TEXCOORD1; }; //----------------------------------------------------------------------------- // Deconvergence Vertex Shader //----------------------------------------------------------------------------- -uniform float3 ConvergeX = float3(0.0f, 0.0f, 0.0f); -uniform float3 ConvergeY = float3(0.0f, 0.0f, 0.0f); - uniform float2 ScreenDims; uniform float2 SourceDims; uniform float2 SourceRect; +uniform float2 TargetDims; +uniform float2 QuadDims; + +uniform bool SwapXY = false; +uniform float3 ConvergeX = float3(0.0f, 0.0f, 0.0f); +uniform float3 ConvergeY = float3(0.0f, 0.0f, 0.0f); uniform float3 RadialConvergeX = float3(0.0f, 0.0f, 0.0f); uniform float3 RadialConvergeY = float3(0.0f, 0.0f, 0.0f); -uniform float Prescale; - VS_OUTPUT vs_main(VS_INPUT Input) { VS_OUTPUT Output = (VS_OUTPUT)0; - float2 invDims = 1.0f / SourceDims; - float2 Ratios = SourceRect; + float2 HalfSourceRect = SourceRect * 0.5f; + + float2 QuadRatio = + float2(1.0f, SwapXY + ? QuadDims.y / QuadDims.x + : QuadDims.x / QuadDims.y); + + // imaginary texel dimensions independed from quad dimensions, but dependend on quad ratio + float2 FixedTexelDims = (1.0f / 1024.0) * SourceRect * QuadRatio; + Output.Position = float4(Input.Position.xyz, 1.0f); Output.Position.xy /= ScreenDims; - Output.Position.y = 1.0f - Output.Position.y; - Output.Position.xy -= 0.5f; - Output.Position *= float4(2.0f, 2.0f, 1.0f, 1.0f); - Output.Color = Input.Color; + Output.Position.y = 1.0f - Output.Position.y; // flip y + Output.Position.xy -= 0.5f; // center + Output.Position.xy *= 2.0f; // toom + float2 TexCoord = Input.TexCoord; + TexCoord += 0.5f / TargetDims; // half texel offset correction (DX9) + + Output.Color = Input.Color; + + Output.TexCoordX = TexCoord.xxx; + Output.TexCoordY = TexCoord.yyy; + + // center coordinates + Output.TexCoordX -= HalfSourceRect.xxx; + Output.TexCoordY -= HalfSourceRect.yyy; + + // radial converge offset to "translate" the most outer pixel as thay would be translated by the linar converge with the same amount + float2 radialConvergeOffset = 2.0f / SourceRect; - float2 RadialRed = float2(RadialConvergeX.x, RadialConvergeY.x); - float2 RadialGrn = float2(RadialConvergeX.y, RadialConvergeY.y); - float2 RadialBlu = float2(RadialConvergeX.z, RadialConvergeY.z); - float2 ConvergeRed = float2(ConvergeX.x, ConvergeY.x); - float2 ConvergeGrn = float2(ConvergeX.y, ConvergeY.y); - float2 ConvergeBlu = float2(ConvergeX.z, ConvergeY.z); - float2 ScaledRatio = ((TexCoord * SourceRect) - 0.5f); + // radial converge + Output.TexCoordX *= 1.0f + RadialConvergeX * FixedTexelDims.xxx * radialConvergeOffset.xxx; + Output.TexCoordY *= 1.0f + RadialConvergeY * FixedTexelDims.yyy * radialConvergeOffset.yyy; + + // un-center coordinates + Output.TexCoordX += HalfSourceRect.xxx; + Output.TexCoordY += HalfSourceRect.yyy; - Output.CoordX = ((((TexCoord.x / Ratios.x) - 0.5f)) * (1.0f + RadialConvergeX / SourceDims.x) + 0.5f) * Ratios.x + ConvergeX * invDims.x; - Output.CoordY = ((((TexCoord.y / Ratios.y) - 0.5f)) * (1.0f + RadialConvergeY / SourceDims.y) + 0.5f) * Ratios.y + ConvergeY * invDims.y; - Output.TexCoord = TexCoord; + // linear converge + Output.TexCoordX += ConvergeX * FixedTexelDims.xxx; + Output.TexCoordY += ConvergeY * FixedTexelDims.yyy; return Output; } @@ -107,12 +120,11 @@ VS_OUTPUT vs_main(VS_INPUT Input) float4 ps_main(PS_INPUT Input) : COLOR { - float Alpha = tex2D(DiffuseSampler, Input.TexCoord).a; - float RedTexel = tex2D(DiffuseSampler, float2(Input.CoordX.x, Input.CoordY.x)).r; - float GrnTexel = tex2D(DiffuseSampler, float2(Input.CoordX.y, Input.CoordY.y)).g; - float BluTexel = tex2D(DiffuseSampler, float2(Input.CoordX.z, Input.CoordY.z)).b; + float r = tex2D(DiffuseSampler, float2(Input.TexCoordX.x, Input.TexCoordY.x)).r; + float g = tex2D(DiffuseSampler, float2(Input.TexCoordX.y, Input.TexCoordY.y)).g; + float b = tex2D(DiffuseSampler, float2(Input.TexCoordX.z, Input.TexCoordY.z)).b; - return float4(RedTexel, GrnTexel, BluTexel, Alpha); + return float4(r, g, b, 1.0f); } //----------------------------------------------------------------------------- -- cgit v1.2.3-70-g09d2