64박스 필터 샘플링

반응형

이전의 16박스, 9콘 필터 샘플링은 픽셀셰이더 1_1 버전의 한계인 한번의 렌더링에서
읽어들일 수 있는 텍스쳐가 4개
라는 것을 염두에 둔 방식이다.

하지만 ps 2_0에서는 16개의 멀티텍스쳐 수를 지원하므로
16개의 샘플링 점을 읽어 64 텍셀을 한번에 읽는 방법을 사용할 수 있다.

                                            그림 1 : 16개의 샘플링 점들.

위의 그림을 보면 16개의 샘플링 점들이 구성된 모습을 볼 수 있다.

ps에서는 텍스쳐를 16텍셀을 읽어 합계를 평균할 수 있지만 vs에서는 ps로 넘길 수 있는
텍스쳐 좌표의 수가 8개 까지
므로 8개를 넘겨주고 나머지 8개는 좌표이동을 통해 구한다.

                                            그림 2 : 텍셀을 왼쪽으로 이동.

위의 그림처럼 vs로 부터 오른쪽 8개의 텍셀 좌표를 입력받아 -4.0을 연산해 왼쪽 8개의 텍셀 위치를 알아낸다.

vs에서 ps로 넘기는 텍스쳐 좌표를 8개 넘겨야 하므로
struct VS_OUTPUT_H
{
    float4 Pos   : POSITION;
    float2 Tex0   : TEXCOORD0;
    float2 Tex1   : TEXCOORD1;
    float2 Tex2   : TEXCOORD2;
    float2 Tex3   : TEXCOORD3;
    float2 Tex4   : TEXCOORD4;
    float2 Tex5   : TEXCOORD5;
    float2 Tex6   : TEXCOORD6;
    float2 Tex7   : TEXCOORD7;
};

vs에서 우선 오른쪽 여덟개 텍스쳐 좌표 설정.
Out.Tex0 = Tex + float2( 3.0f/WIDTH, -3.0f/HEIGHT);
Out.Tex1 = Tex + float2( 3.0f/WIDTH, -1.0f/HEIGHT);
Out.Tex2 = Tex + float2( 3.0f/WIDTH,  1.0f/HEIGHT);
Out.Tex3 = Tex + float2( 3.0f/WIDTH,  3.0f/HEIGHT);
    
Out.Tex4 = Tex + float2( 1.0f/WIDTH, -3.0f/HEIGHT);
Out.Tex5 = Tex + float2( 1.0f/WIDTH, -1.0f/HEIGHT);
Out.Tex6 = Tex + float2( 1.0f/WIDTH,  1.0f/HEIGHT);
Out.Tex7 = Tex + float2( 1.0f/WIDTH,  3.0f/HEIGHT);

ps에서 넘겨받은 8개의 텍스쳐 좌표로부터 왼쪽으로 네칸 떨어진 왼쪽 8개점 설정.
float2 offSet = float2(-4.0f/WIDTH, 0);
   
float4 t0 = tex2D(SrcSamp, i.Tex0);
float4 t1 = tex2D(SrcSamp, i.Tex1);
float4 t2 = tex2D(SrcSamp, i.Tex2);
float4 t3 = tex2D(SrcSamp, i.Tex3);
   
float4 t4 = tex2D(SrcSamp, i.Tex4);
float4 t5 = tex2D(SrcSamp, i.Tex5);
float4 t6 = tex2D(SrcSamp, i.Tex6);
float4 t7 = tex2D(SrcSamp, i.Tex7);
   
float4 t8 =  tex2D(SrcSamp, i.Tex0 + offSet);
float4 t9 =  tex2D(SrcSamp, i.Tex1 + offSet);
float4 t10 = tex2D(SrcSamp, i.Tex2 + offSet);
float4 t11 = tex2D(SrcSamp, i.Tex3 + offSet);
   
float4 t12 = tex2D(SrcSamp, i.Tex4 + offSet);
float4 t13 = tex2D(SrcSamp, i.Tex5 + offSet);
float4 t14 = tex2D(SrcSamp, i.Tex6 + offSet);
float4 t15 = tex2D(SrcSamp, i.Tex7 + offSet);

마지막 결과값은 평균으로 설정.
o.vColor.rgb = (t0+t1+t2+t3 + t4+t5+t6+t7 + t8+t9+t10+t11 + t12+t13+t14+t15)/16;

대충 이런식임.

'Study > Graphics ' 카테고리의 다른 글

DXT 압축  (0) 2013.03.15
BRDF (Bidrectional Reflectance Distributing Function)  (0) 2012.12.06
9콘 필터 샘플링  (0) 2012.01.26
Ambient Aperture Lighting  (0) 2011.07.14
빛의 감쇠 계산  (0) 2011.06.22
TAGS.

Comments