Few bits and pieces also, you have x,y for light center + screen width /height.
Replacing by :
float2 light;
float2 screenResolution;
Then in your code:
float2 delta = (light - texCoord.xy) * screenResolution;
Should remove 2 more instructions.
Next is the use of atan2, which is likely to be the most hungry one.
You can declare another float2 (float2 vecshift), where x = cos(AngleShift) and y = sin(angleShift). Just precompute this one in CPU.
Then you can do the following (basically do a cross product to extract angle instead of using atan2):
float2 dn = normalize(delta);
float cr = dn.x *vecshift.y -dn.y * vecshift.x;
float distQ = dot(delta, delta) - sin((asin(cr))*13) *screenZoomQTimesX;
Please note than I'm not too keen on sin of asin of something, but polynomial form would not fit in your use case. I'm sure there's a much cleaner version to modulate than using sin*asin tho ))
Using ? construct instead of if/else can also (sometimes) help for your instruction count.
color.rgb = lerp(newColor.rgb, color.rgb, distQ < viewsizeQ ? timeFactor : timeFactor * (1 - (distQ - viewsizeQ) / (fadesizeQ - viewsizeQ)));
Does reduce 2 more instructions.
Full version here, sets to 60 instructions.
// Normalized timefactor (1 = fully enabled)
float timeFactor;
float2 light;
float viewsizeQ;
float fadesizeQ;
float2 screenResolution;
float screenZoomQTimesX;
float2 vecshift;
// Texture sampler
sampler TextureSampler : register(s0);
float4 method(float2 texCoord : TEXCOORD0) : COLOR0
{
// New color after transformation
float4 newColor;
// Look up the texture color.
float4 color =tex2D(Samp, texCoord);
// Calculate distance
float2 delta = (light - texCoord.xy) * screenResolution;
float2 dn = normalize(delta);
float cr = dn.x *vecshift.y -dn.y * vecshift.x;
float distQ = dot(delta, delta) - sin((asin(cr))*13) *screenZoomQTimesX;
//float distQ = dot(delta, delta) - a13 *screenZoomQTimesX;
if (distQ < fadesizeQ)
{
// Make greyscale
float grey = dot(color.rgb, float3(0.3, 0.59, 0.11));
// Increase contrast by applying a color transformation based on a quasi-sigmoid gamma curve
grey = 1 / (1 + pow(1.25-grey/2, 16) );
// Transform Black/White color range to Black/Red/White color range
// 1 -> 0.5f ... White -> Red
if (grey >= 0.75)
{
newColor.r = 0.7 + 0.3 * color.r;
grey = (grey - 0.75) * 4;
newColor.gb = 0.7 * grey + 0.3 * color.gb;
}
else // 0.5f -> 0 ... Red -> Black
{
newColor.r = 1.5 * 0.7 * grey + 0.3 * color.r;
newColor.gb = 0.3 * color.gb ;
}
color.rgb = lerp(newColor.rgb, color.rgb, distQ < viewsizeQ ? timeFactor : timeFactor * (1 - (distQ - viewsizeQ) / (fadesizeQ - viewsizeQ)));
}
return color;
}