가우시안 필터

윰이다·2022년 5월 18일
0

내가 언제 또_gpu

목록 보기
2/3

가우시안 필터


우리가 정갈하게 앞머리를 짜르기 위해서는 삐죽나와있는 머리카락을 보통 보이는 머리카락과 길이와 맞게 짜르는 것처럼 (비유가 적절한가..)
가우시안 필터도 마찬가지로 평균적인 값보다 뛰어넘는 값들을 정리하기 위해 쓰이는 필터입니다.


이는 가우시안 블러의 식이며
한 픽셀당 가우시안 블러를 적용하면 연산량이 너무 많아짐으로
우리는 이를 확 2개로 줄일것입니다!


X 방향으로 가우시안 블러를 적용하고, 다음으로 Y 방향으로 가우시안 블러를 적용할 것입니다.

기본적인 가우시안 필터의 작동 원리는 끝났습니다.

이때, 주의해야 할점은 바로, 우리가 두개의 FBO를 사용한다는 것입니다.
우리가 PASS 1 (블링퐁모델 적용) 을 한 값을 첫번째 FBO에 저장하고,
저장한 첫번째 FBO 값을 토대로 PASS 2 (가우시안 블러 적용)을 할 것입니다.

코드 Pass 1

vec3 blinnPhong( vec3 position, vec3 n ) {  
  vec3 ambient = Light.La * Material.Ka;
  vec3 s = normalize( Light.Position.xyz - position );
  float sDotN = max( dot(s,n), 0.0 );
  vec3 diffuse = Material.Kd * sDotN;
  vec3 spec = vec3(0.0);
  if( sDotN > 0.0 ) {
    vec3 v = normalize(-position.xyz);
    vec3 h = normalize( v + s );
    spec = Material.Ks *
            pow( max( dot(h,n), 0.0 ), Material.Shininess );
  }
  return ambient + Light.L * (diffuse + spec);
}

vec4 pass1() {
    return vec4(blinnPhong( Position, normalize(Normal) ),1.0);
}

코드 Pass 2 : x 방향

vec4 pass2() {
   ivec2 pix = ivec2( gl_FragCoord.xy );
   vec4 sum = texelFetch(Texture0, pix, 0) * Weight[0];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(0,1) ) * Weight[1];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(0,-1) ) * Weight[1];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(0,2) ) * Weight[2];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(0,-2) ) * Weight[2];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(0,3) ) * Weight[3];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(0,-3) ) * Weight[3];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(0,4) ) * Weight[4];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(0,-4) ) * Weight[4];
   return sum;
}

코드 Pass 3 : y 방향

vec4 pass3() {
   ivec2 pix = ivec2( gl_FragCoord.xy );
   vec4 sum = texelFetch(Texture0, pix, 0) * Weight[0];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(1,0) ) * Weight[1];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(-1,0) ) * Weight[1];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(2,0) ) * Weight[2];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(-2,0) ) * Weight[2];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(3,0) ) * Weight[3];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(-3,0) ) * Weight[3];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(4,0) ) * Weight[4];
   sum += texelFetchOffset( Texture0, pix, 0, ivec2(-4,0) ) * Weight[4];
   return sum;
}

0개의 댓글