Code:
!!ARBvp1.0
OPTION ARB_position_invariant;
# input:
#--------------------------------
# texcoord[0] = TEX0 texcoords
#
# local[0] = sample offset scale
# local[1] = filter offset scale
PARAM Scale = { 0.16666667, 0.16666667, 0.25, 0.5 };
MOV result.texcoord[0], vertex.texcoord[0];
MUL result.texcoord[1], program.local[0], Scale.w;
MUL result.texcoord[2], program.local[1], Scale.xyzz;
END
#=====================================================================================
!!ARBfp1.0
OPTION ARB_precision_hint_nicest;
# texture 0 = _currentRender
#
# env[0] = 1.0 to _currentRender conversion
# env[1] = fragment.position to 0.0 - 1.0 conversion
OUTPUT oColor = result.color;
ATTRIB fPos = fragment.position;
ATTRIB TC = fragment.texcoord[0];
ATTRIB sScale = fragment.texcoord[1];
ATTRIB fScale = fragment.texcoord[2];
PARAM nonPoT = program.env[0];
PARAM invRes = program.env[1];
# sample offsets
PARAM off1 = { -1.0, 1.0, 1.0, 1.0 };
PARAM off2 = { -1.0, -1.0, 1.0, -1.0 };
PARAM lumVec = { 0.212671, 0.715160, 0.072169 };
PARAM vecX = { -1.0, -1.0, 1.0, 1.0 };
PARAM vecY = { 1.0, -1.0, 1.0, -1.0 };
PARAM EDGE_SHARPNESS = 0.03125;
PARAM MAX_OFFSET = 8.0;
TEMP uv, invres, color, scale, vec, lum, lumMinMax;
TEMP R0, R1, R2, R3, R4;
TEMP T0, T1, T2, T3, T4;
# calculate the non-power-of-two inverse resolution
MUL invres, invRes.xyxy, nonPoT.xyxy;
# calculate the screen texcoord in the 0.0 to 1.0 range
MUL uv, fPos.xyxy, invres.xyxy;
MUL scale, sScale, invres;
MAD_SAT R1, off1, scale, uv; # top / bottom
MAD_SAT R2, off2, scale, uv; # left / right
TEX T0, uv.xyxy, texture[0], 2D;
TEX T1, R1.xyxy, texture[0], 2D;
TEX T2, R1.zwzw, texture[0], 2D;
TEX T3, R2.xyxy, texture[0], 2D;
TEX T4, R2.zwzw, texture[0], 2D;
DP3 T0.w, T0, lumVec;
DP3 lum.x, T1, lumVec;
DP3 lum.y, T2, lumVec;
DP3 lum.z, T3, lumVec;
DP3 lum.w, T4, lumVec;
MIN lumMinMax.xy, lum.xzxz, lum.ywyw;
MIN lumMinMax.x, lumMinMax.x, lumMinMax.y;
MIN lumMinMax.x, lumMinMax.x, T0.w;
MAX lumMinMax.zw, lum.xzxz, lum.ywyw;
MAX lumMinMax.y, lumMinMax.z, lumMinMax.w;
MAX lumMinMax.y, lumMinMax.y, T0.w;
ADD R1, lum.xzxy, lum.ywzw;
ADD vec, R1.xzxz, -R1.ywyw;
ABS vec.zw, vec.xyxy;
DP4 R1.w, lum, 1.0;
MUL R1.w, R1, EDGE_SHARPNESS;
MIN R1.x, vec.z, vec.w;
ADD R1.x, R1.x, R1.w;
RCP R1.x, R1.x;
MUL vec, vec, R1.x;
MAX vec, vec, -MAX_OFFSET;
MIN vec, vec, MAX_OFFSET;
MUL vec, vec, invres;
MAD_SAT R1, vec.xyxy, fScale.xxyy, uv;
MAD_SAT R2, vec.xyxy, fScale.zzww, uv;
# TEX T0, uv.xyxy, texture[0], 2D;
TEX T1, R1.xyxy, texture[0], 2D;
TEX T2, R1.zwzw, texture[0], 2D;
TEX T3, R2.xyxy, texture[0], 2D;
TEX T4, R2.zwzw, texture[0], 2D;
ADD R1, T1, T2;
MUL R1, R1, 0.5;
ADD R2, T3, T4;
MUL R2, R2, 0.25;
MAD R2, R1, 0.5, R2;
DP3 R2.w, R2, lumVec;
SLT R3.x, R2.w, lumMinMax.x;
SLT R3.y, lumMinMax.y, R2.w;
ADD R3.x, R3.x, R3.y;
CMP color, -R3.x, R1, R2;
MOV oColor.xyz, color;
# for visualizing the vector
# MAD oColor, vec, 0.5, 0.5;
# MOV oColor, vec;
# MOV oColor.z, 0;
END