[OptionBool]
GUIName = Bloom
OptionName = C_BLOOM
DefaultValue = true
[OptionBool]
GUIName = Bloom Only
OptionName = A_BLOOMONLY
DefaultValue = false
DependentOption = C_BLOOM
GUIDescription = Only show Bloom effects. (Testing purposes)
[OptionRangeInteger]
GUIName = Mix Mode
OptionName = A_BLOOM_MIXMODE
MinValue = 1
MaxValue = 4
StepAmount = 1
DefaultValue = 2
DependentOption = C_BLOOM
GUIDescription = 1 = Linear add | 2 = Screen add | 3 = Screen/Lighten/Opacity | 4 = Lighten
[OptionRangeFloat]
GUIName = Threshold
OptionName = A_BLOOM_THRESHOLD
MinValue = 0.01
MaxValue = 1.00
StepAmount = 0.01
DefaultValue = 0.80
DependentOption = C_BLOOM
GUIDescription = Every pixel brighter than this value triggers bloom.
[OptionRangeFloat]
GUIName = Amount
OptionName = B_BLOOM_AMOUNT
MinValue = 0.0
MaxValue = 20.0
StepAmount = 0.1
DefaultValue = 0.8
DependentOption = C_BLOOM
GUIDescription = Intensity of bloom.
[OptionRangeFloat]
GUIName = Saturation
OptionName = B_BLOOM_SATURATION
MinValue = 0.00
MaxValue = 2.00
StepAmount = 0.01
DefaultValue = 0.80
DependentOption = C_BLOOM
GUIDescription = Bloom saturation. 0.0 means white bloom, 2.0 means very very colorful bloom.
[OptionRangeFloat]
GUIName = Tint
OptionName = B_BLOOM_TINT
MinValue = 0.00, 0.00, 0.00
MaxValue = 1.00, 1.00, 1.00
StepAmount = 0.01, 0.01, 0.01
DefaultValue = 0.70, 0.80, 1.00
DependentOption = C_BLOOM
GUIDescription = R, G and B components of bloom tintcolor the bloom color gets shifted to.
[OptionBool]
GUIName = Light Scattering
OptionName = D_SCATTERRING
DefaultValue = True
DependentOption = C_BLOOM
[OptionRangeFloat]
GUIName = Density
OptionName = E_SDENSITY
MinValue = 0.0
MaxValue = 1.0
StepAmount = 0.01
DefaultValue = 0.17
DependentOption = C_BLOOM
[OptionRangeFloat]
GUIName = Start
OptionName = F_SSTART
MinValue = 0.0
MaxValue = 0.5
StepAmount = 0.01
DefaultValue = 0.05
DependentOption = C_BLOOM
[OptionRangeFloat]
GUIName = End
OptionName = G_SEND
MinValue = 0.5
MaxValue = 2.0
StepAmount = 0.01
DefaultValue = 2.0
DependentOption = C_BLOOM
[OptionRangeFloat]
GUIName = Default Color
OptionName = H_SCOLOR
MinValue = 0.1, 0.1, 0.1
MaxValue = 1.0, 1.0, 1.0
StepAmount = 0.01, 0.01, 0.01
DefaultValue = 0.91, 0.52, 1
DependentOption = C_BLOOM
[OptionRangeFloat]
GUIName = Scattering Intensity
OptionName = I_SINTENSITY
MinValue = 0.0
MaxValue = 1.0
StepAmount = 0.01
DefaultValue = 0.36
DependentOption = C_BLOOM
[Pass]
EntryPoint = BloomPrePass
DependantOption = C_BLOOM
Input0=PreviousPass
Input0Filter=Linear
Input0Mode=Clamp
[Pass]
EntryPoint = BloomPass1
DependantOption = C_BLOOM
Input0=PreviousPass
Input0Filter=Linear
Input0Mode=Clamp
[Pass]
EntryPoint = BloomPass2
DependantOption = C_BLOOM
OutputScale = 0.5
Input0=PreviousPass
Input0Filter=Linear
Input0Mode=Clamp
[Pass]
EntryPoint = BloomPass3
DependantOption = C_BLOOM
OutputScale = 0.25
Input0=PreviousPass
Input0Filter=Linear
Input0Mode=Clamp
Input1=DepthBuffer
Input1Filter=Nearest
Input1Mode=Clamp
[Pass]
EntryPoint = BloomPass4
DependantOption = C_BLOOM
OutputScale = 0.125
Input0=PreviousPass
Input0Filter=Linear
Input0Mode=Clamp
Input1=DepthBuffer
Input1Filter=Nearest
Input1Mode=Clamp
[Pass]
EntryPoint = BloomScatering
DependantOption = C_BLOOM
OutputScale = 0.03125
Input0=PreviousPass
Input0Filter=Linear
Input0Mode=Clamp
[Pass]
EntryPoint = BloomMerger
DependantOption = C_BLOOM
Input0=Pass9
Input0Filter=Linear
Input0Mode=Clamp
Input1=Pass14
Input1Filter=Linear
Input1Mode=Clamp
Input2=PreviousPass
Input2Filter=Linear
Input2Mode=Clamp
Input3=DepthBuffer
Input3Filter=Nearest
Input3Mode=Clamp
float4 Gauss1dPrev2(float2 coord, float2 axis, float mult)
{
float4 sum = 0;
float weight[11] = { 0.082607, 0.080977, 0.076276, 0.069041, 0.060049, 0.050187, 0.040306, 0.031105, 0.023066, 0.016436, 0.011254 };
axis *= GetInvResolution() * mult;
for (int i = -10; i < 11; i++)
{
float currweight = weight[abs(i)];
sum += SamplePrevLocation(coord.xy + axis.xy * (float)i) * currweight;
}
return sum;
}
//------------------------------------------------------------------------------
// BLOOM
//------------------------------------------------------------------------------
void BloomPrePass()
{
float4 bloom=0.0;
float2 bloomuv;
float2 texcoord = GetCoordinates();
float2 offset[4]=
{
float2(1.0, 1.0),
float2(1.0, 1.0),
float2(-1.0, 1.0),
float2(-1.0, -1.0)
};
for (int i=0; i<4; i++)
{
bloomuv.xy=offset[i]*2;
bloomuv.xy=texcoord.xy + bloomuv.xy;
float4 tempbloom = SampleLocation(bloomuv.xy);
tempbloom.a = max(0,dot(tempbloom.xyz,float3(0.333,0.333,0.333))-GetOption(A_ANAMFLARE_THRESHOLD));
tempbloom.xyz = max(float3(0,0,0), tempbloom.xyz-GetOption(A_BLOOM_THRESHOLD));
bloom+=tempbloom;
}
bloom *= 0.25;
SetOutput(bloom);
}
void BloomPass1()
{
float4 bloom=0.0;
float2 bloomuv;
float2 texcoord = GetCoordinates();
float2 offset[8]=
{
float2(1.0, 1.0),
float2(0.0, -1.0),
float2(-1.0, 1.0),
float2(-1.0, -1.0),
float2(0.0, 1.0),
float2(0.0, -1.0),
float2(1.0, 0.0),
float2(-1.0, 0.0)
};
for (int i=0; i<8; i++)
{
bloomuv.xy=offset[i]*4;
bloomuv.xy=texcoord.xy + bloomuv.xy;
float4 tempbloom=SampleLocation(bloomuv.xy);
bloom+=tempbloom;
}
bloom *= 0.125;
SetOutput(bloom);
}
void BloomPass2()
{
float4 bloom=0.0;
float2 bloomuv;
float2 texcoord = GetCoordinates();
float2 offset[8]=
{
float2(0.707, 0.707),
float2(0.707, -0.707),
float2(-0.707, 0.707),
float2(-0.707, -0.707),
float2(0.0, 1.0),
float2(0.0, -1.0),
float2(1.0, 0.0),
float2(-1.0, 0.0)
};
for (int i=0; i<8; i++)
{
bloomuv.xy=offset[i]*8;
bloomuv.xy=texcoord.xy + bloomuv.xy;
float4 tempbloom=SampleLocation(bloomuv.xy);
bloom+=tempbloom;
}
bloom *= 0.5; //to brighten up the sample, it will lose brightness in H/V gaussian blur
SetOutput(bloom);
}
void BloomPass3()
{
float4 bloom = 0.0;
float2 texcoord = GetCoordinates();
bloom = Gauss1dPrev2(texcoord, float2(1.0, 0.0), 16);
bloom.a *= GetOption(B_ANAMFLARE_AMOUNT);
bloom.xyz *= GetOption(B_BLOOM_AMOUNT);
SetOutput(bloom);
}
void BloomPass4()
{
float4 bloom = 0.0;
float2 texcoord = GetCoordinates();
bloom.xyz = Gauss1dPrev2(texcoord, float2(0.0, 1.0), 16).xyz*2.5;
bloom.a = Gauss1dPrev2(texcoord, float2(1.0, 0.0), 32*GetOption(A_ANAMFLARE_WIDENESS)).a*2.5; //to have anamflare texture (bloom.w) avoid vertical blur
SetOutput(bloom);
}
void BloomScatering()
{
float2 SamplePos[20] = {
float2(0.25, 0.125),
float2(0.375, 0.125),
float2(0.5, 0.125),
float2(0.625, 0.125),
float2(0.75, 0.125),
float2(0.25, 0.25),
float2(0.375, 0.25),
float2(0.5, 0.25),
float2(0.625, 0.25),
float2(0.75, 0.25),
float2(0.25, 0.75),
float2(0.375, 0.75),
float2(0.5, 0.75),
float2(0.625, 0.75),
float2(0.75, 0.75),
float2(0.25, 0.875),
float2(0.375, 0.875),
float2(0.5, 0.875),
float2(0.625, 0.875),
float2(0.75, 0.875),
};
float3 lumColor = GetOption(H_SCOLOR) * 3.0;
float samplecount = 3.0;
for (int i = 0; i < 20; i++)
{
float3 color = SamplePrevLocation(SamplePos[i]).rgb;
lumColor += color;
samplecount += 1.0;
}
lumColor /= samplecount;
float luma = dot(lumColor, lumCoeff);
float maxval = max(max(lumColor.r, lumColor.g), lumColor.b);
lumColor /= maxval;
SetOutput(float4(lumColor, luma * luma));
}
void BloomMerger()
{
float2 texcoord = GetCoordinates();
float4 basecolor = float4(0.0,0.0,0.0,0.0);
float3 colorbloom = float3(0.0,0.0,0.0);
float4 lumColor = SamplePrevLocation(float2(0.5, 0.5));
if (!OptionEnabled(A_BLOOMONLY))
{
basecolor = SampleInput(0);
}
float4 color = basecolor;
colorbloom.xyz += SampleInputLocation(1,texcoord.xy).xyz*9.0;
colorbloom.xyz *= 0.1;
colorbloom.xyz = saturate(colorbloom.xyz);
float colorbloomgray = dot(colorbloom.xyz, 0.333);
colorbloom.xyz = lerp(colorbloomgray, colorbloom.xyz, GetOption(B_BLOOM_SATURATION));
colorbloom.xyz *= GetOption(B_BLOOM_TINT);
float colorgray = dot(color.xyz, 0.333);
if (GetOption(A_BLOOM_MIXMODE) == 1)
{
color.xyz = color.xyz + colorbloom.xyz;
}
else if (GetOption(A_BLOOM_MIXMODE) == 2)
{
color.xyz = 1-(1-color.xyz)*(1-colorbloom.xyz);
}
else if (GetOption(A_BLOOM_MIXMODE) == 3)
{
color.xyz = max(float3(0.0,0.0,0.0),max(color.xyz,lerp(color.xyz,(float3(1.0,1.0,1.0) - (float3(1.0,1.0,1.0) - saturate(colorbloom.xyz)) *(float3(1.0,1.0,1.0) - saturate(colorbloom.xyz * float3(1.0,1.0,1.0)))),float3(1.0,1.0,1.0))));
}
else if (GetOption(A_BLOOM_MIXMODE) == 4)
{
color.xyz = max(color.xyz, colorbloom.xyz);
}
if (OptionEnabled(D_SCATTERRING))
{
float depth = SampleDepth();
float linearcomponent = (GetOption(G_SEND) - depth) / (GetOption(G_SEND) - GetOption(F_SSTART));
depth = depth * GetOption(E_SDENSITY);
lumColor.rgb = lerp(basecolor.rgb, lumColor.rgb, saturate(GetOption(I_SINTENSITY) + lumColor.a));
basecolor.rgb = lerp(lumColor.rgb, basecolor.rgb, clamp(linearcomponent / exp(depth * depth), 0.0, 1.0));
}
color.rgb += basecolor.rgb;
if (OptionEnabled(C_GAUSSIAN_ANAMFLARE))
{
float3 anamflare = SampleInputBicubic(1).w*2*GetOption(C_ANAMFLARE_COLOR);
color.xyz += pow(anamflare.xyz,1/GetOption(B_ANAMFLARE_CURVE));
}
SetOutput(color);
}
Comments
0 B
|👍
/👎