블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (666)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (105)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (217)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total343,756
Today5
Yesterday73

이전의 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
64박스 필터 샘플링  (0) 2012.01.30
9콘 필터 샘플링  (0) 2012.01.26
Ambient Aperture Lighting  (0) 2011.07.14
빛의 감쇠 계산  (0) 2011.06.22
Posted by 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함