RadialBlur HLSL Shader - 3 сэмпла

Решил добавить в игру простенький эффект радиальной размытия. В нете к счастью нашёл много информации, в результате скомпонованный шейдер получился следующего вида:


sampler ColorMapSampler : register(s0);

float4 radialBlur(float2 vTex:TEXCOORD0):COLOR
{
    float4 result=float4(1,0,0,1);
    //массив с сэмплами. тут их 3 для производительности
    float samples[3] = {0.05 ,0.03,  0.01};





    // 0.5,0.5 центр экранных координат
    // т.е. отнимая от (0.5,0.5) текстурные координаты
    // мы получаем вектор указывающий на центр экрана
    float2 dir = 0.5 - vTex;

    // вычисляем расстояние до центра
    float dist = length(dir);

    // нормализуем
    dir = dir/dist;

    // получаем цвет текущего пикселя
    float4 color = tex2D(ColorMapSampler,vTex);

    float4 sum = color;

    // берём ещё 3 сэмпла из пикселей противоположных центру экрана
    for (int i = 0; i < 3; i++)
    {
      sum += tex2D( ColorMapSampler, vTex + dir * samples[i] * dist );
    }

    // всего взяли 4 сэмпла ( 3 соседних и 1 текущий)
    sum *= 0.25f;

    // коэффициент 0.7 указывается силу эффекта
    float t = dist * 0.7f;
    t = clamp( t ,0.0,1.0);

    //интерполируем текущий цвет с рассчитанным по расстоянию до центра
    result = lerp( color, sum, t );

return result;
}


technique PostProcess
{
pass P1
{
// A post process shader only needs a pixel shader.
PixelShader = compile ps_2_0 radialBlur();
}
}

Комментарии

Популярные сообщения из этого блога

Структуры данных ( АВЛ-дерево , обход графа и построение минимального остовного дерева графа)

2D Физика для игр - Separate Axis Theorem

HLSL шейдеры для чайников