Bomberman-OverlordEngine-x64 / BombermanGame / Resources / Effects / Post / Blur.fx
Blur.fx
Raw
//=============================================================================
//// Shader uses position and texture
//=============================================================================
SamplerState samPoint
{
    Filter = MIN_MAG_MIP_POINT;
    AddressU = Mirror;
    AddressV = Mirror;
};

Texture2D gTexture;

/// Create Depth Stencil State (ENABLE DEPTH WRITING)
DepthStencilState EnableDepthStencilWriting
{
    DepthEnable = TRUE;
    DepthWriteMask = ALL;
    DepthFunc = LESS;
};

/// Create Rasterizer State (Backface culling) 
RasterizerState gRS_BackfaceCulling
{
    CullMode = BACK;
};

//IN/OUT STRUCTS
//--------------
struct VS_INPUT
{
    float3 Position : POSITION;
	float2 TexCoord : TEXCOORD0;

};

struct PS_INPUT
{
    float4 Position : SV_POSITION;
	float2 TexCoord : TEXCOORD1;
};


//VERTEX SHADER
//-------------
PS_INPUT VS(VS_INPUT input)
{
	PS_INPUT output = (PS_INPUT)0;
    
	// Set the Position
    output.Position = float4(input.Position, 1.0f);

	// Set the TexCoord
    output.TexCoord = input.TexCoord;
	
	return output;
}

//PIXEL SHADER
//------------
float4 PS(PS_INPUT input): SV_Target
{
	// Step 1: find the dimensions of the texture (the texture has a method for that)	
    uint width;
    uint height;
    uint numberOfLevels;
    
    gTexture.GetDimensions(0, width, height, numberOfLevels);
    
    // Step 2: calculate dx and dy (UV space for 1 pixel)	
    float du = 1.0f / width;
    float dv = 1.0f / height;
    
    // Step 3: Create a double for loop (5 iterations each)
	//		   Inside the loop, calculate the offset in each direction. Make sure not to take every pixel but move by 2 pixels each time
	//			Do a texture lookup using your previously calculated uv coordinates + the offset, and add to the final color
    float4 finalColor = float4(0, 0, 0, 0);
    const int step = 2;
    const int iterations = 5;
    int passes = 0;
    for (int i = -iterations; i <= iterations; i += step)
    {
        for (int j = -iterations; j <= iterations; j += step)
        {
            float2 offset = float2(i * du, j * dv);
            finalColor += gTexture.Sample(samPoint, input.TexCoord + offset);
            
            passes++;
        }
    }

    // Step 4: Divide the final color by the number of passes
    finalColor /= float(passes);

    // Step 5: return the final color
    return finalColor;
   
}


//TECHNIQUE
//---------
technique11 Blur
{
    pass P0
    {
		// Set states...
        SetDepthStencilState(EnableDepthStencilWriting, 1);
        SetRasterizerState(gRS_BackfaceCulling);
        SetVertexShader( CompileShader( vs_4_0, VS() ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0, PS() ) );
    }
}