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();
}
}
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();
}
}
Комментарии
Отправить комментарий