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

Texture2D gTexture;

float3 blackPoint = float3(0, 0, 0); // input: location of complete black (range: 0.0 - 1.0)
float3 whitePoint = float3(0.9f, 0.9f, 0.9f); // input: location of complete white (range: 0.0 - 1.0)
float3 gamma = float3(2.5f, 2.5f, 2.5f); // input: midtones adjustment (range: 1.0 - 3.0)

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

BlendState NoBlending
{
    BlendEnable[0] = FALSE;
};

// 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: sample the texture
    float4 color = gTexture.Sample(samPoint, input.TexCoord);
    
    // Step 2: apply Levels adjustment
    color.rgb = (color.rgb - blackPoint) / (whitePoint - blackPoint); // Remap colors based on black and white points
    color.rgb = pow(color.rgb, 1.0 / gamma); // Adjust midtones based on gamma

    // Clamp values to [0, 1] range in case they are out of bounds after Levels adjustment
    color.rgb = clamp(color.rgb, 0.0, 1.0);
    
    // Step 3: return the color
    return color;
}

//TECHNIQUE
//---------
technique11 LevelsAdjustment
{
    pass P0
    {
        // Set states...
        SetDepthStencilState(EnableDepthStencilWriting, 1);
        SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); // added
        SetRasterizerState(gRS_BackfaceCulling);
        SetVertexShader(CompileShader(vs_4_0, VS()));
        SetGeometryShader(NULL);
        SetPixelShader(CompileShader(ps_4_0, PS()));
    }
}