2016-03-30 3 views
1

Я пытаюсь добиться размытия gaussian, используя пост-обработку. У меня два прохода визуализации; Первый проход отображает сцену, а второй - для эффекта.HLSL: Gaussian Blur Effect

Это мой пиксельный шейдер код:

const float offset[] = { 
    0.0, 1.0, 2.0, 3.0, 4.0 
    }; 
    const float weight[] = { 
     0.2270270270, 0.1945945946, 0.1216216216, 
     0.0540540541, 0.0162162162 
    }; 
    ppColour = SceneTexture.Sample(PointSample, ppIn.UV) * weight[0]; 
    float3 FragmentColor = float3(0.0f, 0.0f, 0.0f); 

    for (int i = 1; i < 5; i++) { 
     // Horizontal-pass 
     FragmentColor += 
      SceneTexture.Sample(PointSample, ppIn.UV + float2(0.0f, offset[i]))*weight[i] + 
      SceneTexture.Sample(PointSample, ppIn.UV - float2(0.0f, offset[i]))*weight[i];  
      // Vertical-pass 
     FragmentColor += 
      SceneTexture.Sample(PointSample, ppIn.UV + float2(offset[i], 0.0f))*weight[i] + 
      SceneTexture.Sample(PointSample, ppIn.UV - float2(offset[i], 0.0f))*weight[i]; 
     } 
ppColour += FragmentColor; 
return (ppColour,1.0); 

Я получаю строку-й вид, как показано: enter image description here

Что я делаю неправильно?

ответ

3

Я думаю, вам нужно визуализировать горизонтальный и вертикальный проход отдельно, используя шейдерный код, например, ниже, но с другим направлением (см. dir равномерная переменная). Так что вам нужно 3 шагов

  • Рендер сцены текстуры A Использование Shader по умолчанию
  • Render текстуре для текстуры B с помощью gaussion размытия шейдеров по горизонтали (реж = {1.0,0.0})
  • Рендер текстуры B на экран используя тот же gaussion размытости шейдер вертикально (реж = {0.0,1.0})
uniform vec2 dir; 

const float offset[] = {0.0, 1.0, 2.0, 3.0, 4.0}; 
const float weight[] = { 
    0.2270270270, 0.1945945946, 0.1216216216, 
    0.0540540541, 0.0162162162 
}; 
ppColour = SceneTexture.Sample(PointSample, ppIn.UV) * weight[0]; 
float3 FragmentColor = float3(0.0f, 0.0f, 0.0f); 

//(1.0, 0.0) -> horizontal blur 
//(0.0, 1.0) -> vertical blur 
float hstep = dir.x; 
float vstep = dir.y; 

for (int i = 1; i < 5; i++) { 
    FragmentColor += 
     SceneTexture.Sample(PointSample, ppIn.UV + float2(hstep*offset[i], vstep*offset[i]))*weight[i] + 
     SceneTexture.Sample(PointSample, ppIn.UV - float2(hstep*offset[i], vstep*offset[i]))*weight[i];  
    } 
ppColour += FragmentColor; 
return (ppColour,1.0); 

См Efficient Gaussion Blur with Linear Sampling

+0

вы имеете в виду I нужен третий проход? –

+0

Как я понимаю, автор предоставленной статьи показывает некоторые подходы к оптимизации производительности. Но это не классическое гауссовское размытие, просто аналогичный результат после нескольких проходов. –