Divergent/mods/Enhanced Shaders Color Grading/gamedata/shaders/r3/bloom_luminance_2.ps

80 lines
2.1 KiB
PostScript
Raw Normal View History

#include "common.h"
struct v2p
{
float4 tc0: TEXCOORD0; // Central
float4 tc1: TEXCOORD1; // -1,+1
float4 tc2: TEXCOORD2; // -2,+2
float4 tc3: TEXCOORD3; // -3,+3
float4 tc4: TEXCOORD4; // -4,+4
float4 tc5: TEXCOORD5; // -5,+5
float4 tc6: TEXCOORD6; // -6,+6
float4 tc7: TEXCOORD7; // -7,+7
};
//////////////////////////////////////////////////////////////////////////////////////////
// perform 4x4 bilinear, 8x8p, the step (B)
// b): 64x64p => 8x8p
float sample (float2 tc)
{
float4 data = s_image.Sample( smp_rtlinear, tc );
return dot( data, 1.h/4.h ); // sum components
}
float4 main( p_filter I ) : SV_Target
{
float4 ratio = float2( 1/screen_res.x,1/screen_res.y).xyxy;
ratio.x = 1;
//ratio.y = 1.77;
//ratio.y = 0.5625;
ratio.y = screen_res.x/screen_res.y;
//ratio.xyzw = ratio.xyxy;
ratio.xyzw = ratio.xyyx;
float4 UVavg = (I.Tex0+I.Tex1+I.Tex2+I.Tex3+I.Tex4+I.Tex5+I.Tex6+I.Tex7)/8;
//adjust for aspect ratio
I.Tex0 = UVavg + ((I.Tex0 - UVavg) * ratio);
I.Tex1 = UVavg + ((I.Tex1 - UVavg) * ratio);
I.Tex2 = UVavg + ((I.Tex2 - UVavg) * ratio);
I.Tex3 = UVavg + ((I.Tex3 - UVavg) * ratio);
I.Tex4 = UVavg + ((I.Tex4 - UVavg) * ratio);
I.Tex5 = UVavg + ((I.Tex5 - UVavg) * ratio);
I.Tex6 = UVavg + ((I.Tex6 - UVavg) * ratio);
I.Tex7 = UVavg + ((I.Tex7 - UVavg) * ratio);
// sample
float4 accum0;
accum0.x = sample(I.Tex0);
accum0.y = sample(I.Tex1);
accum0.z = sample(I.Tex2);
accum0.w = sample(I.Tex3);
float4 accum1;
accum1.x = sample(I.Tex4);
accum1.y = sample(I.Tex5);
accum1.z = sample(I.Tex6);
accum1.w = sample(I.Tex7);
float4 accum2;
accum2.x = sample(I.Tex0.wz);
accum2.y = sample(I.Tex1.wz);
accum2.z = sample(I.Tex2.wz);
accum2.w = sample(I.Tex3.wz);
float4 accum3;
accum3.x = sample(I.Tex4.wz);
accum3.y = sample(I.Tex5.wz);
accum3.z = sample(I.Tex6.wz);
accum3.w = sample(I.Tex7.wz);
// perform accumulation
float4 final;
final.x = dot(accum0,1.h/4.h);
final.y = dot(accum1,1.h/4.h);
final.z = dot(accum2,1.h/4.h);
final.w = dot(accum3,1.h/4.h);
// OK
return final;
}