DragonNest/Tools/Shaders/GaussianFilter.fx
Cussrro 243fadee1d 1
2024-12-26 14:04:28 +08:00

155 lines
3.7 KiB
HLSL

//////////////////////////////////////////////////////////////////////////////////////////////
// Global Variable
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
// Custom Param
//////////////////////////////////////////////////////////////////////////////////////////////
float2 g_fBlurRadius : BLURRADIUS;
texture2D g_GaussianSource : GAUSSIANSOURCE;
sampler2D g_GaussianSourceSampler = sampler_state
{
Texture = < g_GaussianSource >;
AddressU = Clamp;
AddressV = Clamp;
MinFilter = Point;
MagFilter = Linear;
MipFilter = Linear;
};
#define BLUR_COUNT 13
float2 g_BlurOffsetHori[ BLUR_COUNT ] =
{
{ -0.5f, 0.0f },
{ -0.416666f, 0.0f },
{ -0.333333f, 0.0f },
{ -0.25f, 0.0f },
{ -0.166666f, 0.0f },
{ -0.0833333f, 0.0f },
{ 0.0f, 0.0f },
{ 0.0833333f, 0.0f },
{ 0.166666f, 0.0f },
{ 0.25f, 0.0f },
{ 0.333333f, 0.0f },
{ 0.416666f, 0.0f },
{ 0.5f, 0.0f },
};
float2 g_BlurOffsetVert[ BLUR_COUNT ] =
{
{ 0, -0.5f },
{ 0, -0.416666f },
{ 0, -0.333333f },
{ 0, -0.25f },
{ 0, -0.166666f },
{ 0, -0.0833333f },
{ 0, 0.0f },
{ 0, 0.0833333f },
{ 0, 0.166666f },
{ 0, 0.25f },
{ 0, 0.333333f },
{ 0, 0.416666f },
{ 0, 0.5f },
};
float g_fBlurWeights[ BLUR_COUNT ] =
{
0.002216,
0.008764,
0.026995,
0.064759,
0.120985,
0.176033,
0.199471,
0.176033,
0.120985,
0.064759,
0.026995,
0.008764,
0.002216,
};
//////////////////////////////////////////////////////////////////////////////////////////////
// Vertex Buffer Declaration
//////////////////////////////////////////////////////////////////////////////////////////////
struct VertexInput
{
float3 Position : POSITION;
float2 TexCoord0 : TEXCOORD0;
};
struct VertexOutput
{
float4 Position : POSITION;
float2 TexCoord0 : TEXCOORD0;
};
//////////////////////////////////////////////////////////////////////////////////////////////
// Start Vertex Shader
//////////////////////////////////////////////////////////////////////////////////////////////
VertexOutput GaussianFilterVS( VertexInput Input )
{
VertexOutput Output;
Output.Position = float4( Input.Position, 1.0f );
Output.TexCoord0 = Input.TexCoord0;
return Output;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Start Pixel Shader
//////////////////////////////////////////////////////////////////////////////////////////////
float4 GaussianHoriPS( float2 TexCoord : TEXCOORD0 ) : COLOR0
{
int i;
float4 Result;
Result = 0.0f;
for( i = 0; i < BLUR_COUNT; i++ )
{
Result.xyz += tex2D( g_GaussianSourceSampler, TexCoord + g_BlurOffsetHori[ i ] * g_fBlurRadius ).xyz * g_fBlurWeights[ i ];
}
Result.w = 1.0f;
return Result;
}
float4 GaussianVertPS( float2 TexCoord : TEXCOORD0 ) : COLOR0
{
int i;
float4 Result;
Result = 0.0f;
for( i = 0; i < BLUR_COUNT; i++ )
{
Result.xyz += tex2D( g_GaussianSourceSampler, TexCoord + g_BlurOffsetVert[ i ] * g_fBlurRadius ).xyz * g_fBlurWeights[ i ];
}
Result.w = 1.0f;
return Result;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Start Technique
//////////////////////////////////////////////////////////////////////////////////////////////
technique BloomHoriTech
{
pass p0
{
VertexShader = compile vs_2_0 GaussianFilterVS();
PixelShader = compile ps_2_0 GaussianHoriPS();
}
}
technique BloomVertTech
{
pass p0
{
VertexShader = compile vs_2_0 GaussianFilterVS();
PixelShader = compile ps_2_0 GaussianVertPS();
}
}