2010-03-13 1 views
3
uniform sampler2D sampler0; 
uniform vec2 tc_offset[9]; 
void blur() 
{ 
    vec4 sample[9]; 
    for(int i = 0; i < 9; ++i) 
    sample[i] = texture2D(sampler0, gl_TexCoord[0].st + tc_offset[i]); 

    gl_FragColor = (sample[0] + (2.0 * sample[1]) + sample[2] + 
     (2.0 * sample[3]) + sample[4] + 2.0 * sample[5] + 
     sample[6] + 2.0 * sample[7] + sample[8])/13.0; 
} 

sample [i] = texture2D (sample0, ...) 행은 어떻게 작동합니까?조각 - 쉐이더 흐림 ... 어떻게 작동합니까?

이미지가 흐리게 보이는 것처럼 보입니다. 먼저 이미지를 생성해야합니다. 아직 여기에서, 저는 어떻게 든 생성하는 바로 그 iamge를 쿼리하려고합니다. 이게 어떻게 작동합니까?

+0

@skaffman : 왜 c 태그입니까? – anon

답변

4

이미지가 흐리게 보이게하려면 먼저 이미지를 만들고 그 다음 이미지를 흐리게 처리해야합니다. 이 쉐이더는 두 번째 단계를 수행하여 이전에 생성 된 이미지를 흐리게 처리합니다. 흐리게 처리되지 않은 이미지를 생성하려면 추가 코드가 필요합니다.

6

이미지에 흐림 효과가 적용됩니다. tc_offset 적절히 좌표 실제 텍스쳐 샘플링 포인트 주변의 3 × 3 영역을 형성하기 위해 애플리케이션에 의해 초기화 될 필요가있다 :

0 0 0 
0 x 0 
0 0 0 

(가정 X가 원래 좌표). 왼쪽 위 샘플링 포인트의 오프셋은 -1/width,-1/height입니다. 중심점에 대한 오프셋은 텍셀 중심에 조심스럽게 정렬되어야합니다 (0.5 by-by-by-by-by-0.5 문제). 또한 하드웨어 바이 리니어 필터를 사용하여 (텍셀 간 샘플링을 통해) 블러의 양을 값 싸게 증가시킬 수 있습니다.

나머지 쉐이더는 샘플을 거리에 따라 비율을 조정합니다. 일반적으로 다음과 같이 사전 계산됩니다.

5

원본 이미지를 생성하여 화면이 아닌 텍스처로 렌더링하는 것도 한 가지 방법입니다. 그리고이 쉐이더와 텍스쳐를 사용하여 이미지를 포스트 프로세스하기 위해 풀 스크린 쿼드를 그립니다.