Presentation is loading. Please wait.

Presentation is loading. Please wait.

DirectX9 셰이더 프로그리밍 7 -1 흐림필터 7 -2 가우스 필터 7 -3 크로스 필터 3D 프로그래밍 스터디 유대훈

Similar presentations


Presentation on theme: "DirectX9 셰이더 프로그리밍 7 -1 흐림필터 7 -2 가우스 필터 7 -3 크로스 필터 3D 프로그래밍 스터디 유대훈"— Presentation transcript:

1 DirectX9 셰이더 프로그리밍 7 -1 흐림필터 7 -2 가우스 필터 7 -3 크로스 필터 3D 프로그래밍 스터디 유대훈
흐림필터 7 -2 가우스 필터 7 -3 크로스 필터 3D 프로그래밍 스터디 유대훈

2 사전지식 구현에 앞서 알고 있어야 하는 내용 택스처 필터링 typedef enum D3DTEXTUREFILTERTYPE {
D3DTEXF_NONE = 0, D3DTEXF_POINT = 1, D3DTEXF_LINEAR = 2, D3DTEXF_ANISOTROPIC = 3, D3DTEXF_PYRAMIDALQUAD = 6, D3DTEXF_GAUSSIANQUAD = 7, D3DTEXF_CONVOLUTIONMONO = 8, D3DTEXF_FORCE_DWORD = 0x7fffffff, } D3DTEXTUREFILTERTYPE, *LPD3DTEXTUREFILTERTYPE; MipFilter

3 사전지식 D3DTEXF_NONE 밉맵 처리를 무효로 한다. 대신 확대 필터가 사용됨 D3DTEXF_POINT
목적 픽셀값에 가장 가까운 좌표를 가지는 텍셀을 사용한다. D3DTEXF_LINEAR 목적 픽셀의 둘러싸고 있는 2x2 영역 텍셀의 가중평균을 사용한다.

4 사전지식 D3DTEXF_ANISOTROPIC 텍스처 폴리곤과 스키린 평면간의 각도의 위상차에 의해 일어나는
왜곡을 보정한다. D3DTEXF_PYRAMIDALQUAD 4샘플 텐트 필터 지원이 되지 않는 카드가 많음(Cap를 이용한 사용여부 조사후 사용)

5 사전지식 D3DTEXF_GAUSSIANQUAD 4샘플 가우스 필터 D3DTEXF_CONVOLUTIONMONO
지원이 되지 않는 카드가 많음(Cap를 이용한 사용여부 조사후 사용) D3DTEXF_CONVOLUTIONMONO Convolution filter for monochrome textures. See D3DFMT_A1

6 사전지식 택스쳐 샘플 스테이트 typedef enum _D3DSAMPLERSTATETYPE { D3DSAMP_ADDRESSU = 1, D3DSAMP_ADDRESSV = 2, D3DSAMP_ADDRESSW = 3, D3DSAMP_BORDERCOLOR = 4, D3DSAMP_MAGFILTER = 5, D3DSAMP_MINFILTER = 6, D3DSAMP_MIPFILTER = 7, D3DSAMP_MIPMAPLODBIAS = 8, D3DSAMP_MAXMIPLEVEL = 9, D3DSAMP_MAXANISOTROPY = 10, D3DSAMP_SRGBTEXTURE = 11, D3DSAMP_ELEMENTINDEX = 12, D3DSAMP_DMAPOFFSET = 13, D3DSAMP_FORCE_DWORD = 0x7fffffff } D3DSAMPLERSTATETYPE;

7 사전지식 D3DSAMP_ADDRESSUu 좌표로 사용하는 텍스처어드레싱모드.
디폴트는 D3DTADDRESS_WRAP 이다. 더 자세한 정보는, 「D3DTEXTUREADDRESS 」를 참조할것. D3DSAMP_ADDRESSVv 좌표로 사용하는 텍스처어드레싱모드. D3DSAMP_ADDRESSWw 좌표로 사용하는 텍스처어드레싱모드. D3DSAMP_BORDERCOLORD3DCOLOR 형의 경계색. 디폴트의 색은 0x 이다.

8 사전지식 D3DSAMP_MAGFILTERD3DTEXTUREFILTERTYPE 형의 확대 필터.
디폴트값은 D3DTEXF_POINT 이다. D3DSAMP_MINFILTERD3DTEXTUREFILTERTYPE 형의 축소 필터. D3DSAMP_MIPFILTER축소시에 사용하는 밉맵 필터. 「D3DTEXTUREFILTERTYPE 」를 참조할것. 디폴트값은 D3DTEXF_NONE 이다.

9 사전지식 D3DSAMP_MIPMAPLODBIAS밉맵의 상세 레벨 (LOD) 바이어스. 디폴트값은 0 이다.
D3DSAMP_MAXMIPLEVEL사용하는 최대의 맵의 LOD 인덱스. 값의 범위는 0 ~ (n-1)로, 0 이 최대이다. 디폴트값은 0 이다. D3DSAMP_MAXANISOTROPY최대의 비등방성을 나타내는 DWORD 값. 디폴트값은 1 이다.

10 사전지식 D3DSAMP_SRGBTEXTURE감마 보정값. 디폴트값은 0 이다.
이것은 감마가 1.0 으로, 보정이 불필요한 일을 의미한다. 그 이외의 경우, 샘플러에서는 컨텐츠의 감마가 2.2 이라고 가정해, 픽셀 셰이더에 건네주기 전에 선형 (감마 1.0)으로 변환할 필요가 있는 것을 의미한다. D3DSAMP_ELEMENTINDEX샘플러에 멀티 엘리먼트 텍스처를 할당하는 경우에, 사용하는 요소의 인덱스를 나타낸다. 디폴트값은 0 이다. D3DSAMP_DMAPOFFSET프리샘플링 된 디스플레이스먼트 맵에 있어서의 정점 오프셋(offset). 테설레이터가 사용하는 정수로, 값은 256 이다.

11 사전지식 typedef enum _D3DTEXTUREADDRESS { D3DTADDRESS_WRAP = 1, D3DTADDRESS_MIRROR = 2, D3DTADDRESS_CLAMP = 3, D3DTADDRESS_BORDER = 4, D3DTADDRESS_MIRRORONCE = 5, D3DTADDRESS_FORCE_DWORD = 0x7fffffff } D3DTEXTUREADDRESS;

12 사전지식 D3DTADDRESS_WRAP모든 정수 접합점으로써 텍스처를 붙여 맞춘다.
예를 들어, u 의 값이 0 에서 3 까지의 경우, 텍스처는 3 회 반복해져 미러링은 행해지지 않는다. D3DTADDRESS_MIRROR모든 정수 접합점으로써 텍스처의 플립핑이 일어나는 것을 제외하면, D3DTADDRESS_WRAP 와 같다. 예를 들어, u 의 값이 0 에서 1 의 범위에 있는 경우, 텍스처의 처리는 보통대로 행해지지만, 1 에서 2 의 범위에 있는 경우는 플립 (미러화)을 해 2 에서 3 의 범위의 경우는 다시 보통의 처리를 한다. 이후, 이 패턴이 반복된다.

13 사전지식 D3DTADDRESS_CLAMP범위 [0.0, 1.0] 의 외측의 텍스처 좌표가, 각각, 0.0 으로 1.0 의 텍스처 컬러로 설정된다. D3DTADDRESS_BORDER범위 [0.0, 1.0] 의 외측의 텍스처 좌표는, 경계색으로 설정된다.

14 사전지식 D3DTADDRESS_MIRRORONCE
D3DTADDRESS_MIRROR 및 D3DTADDRESS_CLAMP 에 유사하고 있다. 텍스처 좌표의 절대치를 취득해 (0 을 중심으로 미러링 되고), 최대치에 제한한다. 가장 일반적인 용도는 볼륨 텍스처로 사용하는 것이다. 볼륨 텍스처에서는, 완전한 D3DTADDRESS_MIRRORONCE 텍스처어드레싱모드는 필요없지만, 데이터는 1 개의 축으로 따라 대칭이다.

15 사전지식 택스쳐 SetSamplerState Set HRESULT SetSamplerState( DWORD Sampler,
    D3DSAMPLERSTATETYPE Type,     DWORD Value );

16 사전지식 택스쳐 SetSamplerState Set HLSL을 이용하는 방법
Differences between Direct3D 9 and Direct3D 10: Here is the syntax for a sampler in Direct3D 9. sampler Name = SamplerType {   Texture = <texture_variable>;   [state_name = state_value;]   ... }; The syntax for a sampler in Direct3D 10 is changed slightly to support texture objects and sampler arrays. SamplerType Name[Index]

17 사전지식 택스쳐 SetSamplerState Set HLSL을 이용하는 방법 예제
Differences between Direct3D 9 and Direct3D 10: Here is a partial example of a Direct3D 9 sampler from BasicHLSL Sample. sampler MeshTextureSampler = sampler_state { Texture = <g_MeshTexture>; MipFilter = LINEAR; MinFilter = LINEAR; MagFilter = LINEAR; }; Here is a partial example of a Direct3D 10 sampler from BasicHLSL10 Sample. SamplerState MeshTextureSampler Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap;

18 사전지식 택스쳐 SetSamplerState Set HLSL을 이용하는 방법 예제 pass Plast {
AddressU[4] = Wrap; AddressV[4] = Wrap; } 꼭 SamplerState 상태를 기본 상태로 되돌려줘야 합니다. 많은 오류의 원인이 될 수 있고, 문제를 검색하기도 어렵습니다.

19 ** D3D이용 2D출력시 마법의 숫자 -0.5 에 대하여 ** copyrightⓒ Gamza
사전지식 ** D3D이용 2D출력시 마법의 숫자 -0.5 에 대하여 ** copyrightⓒ Gamza

20 사전지식 FSQuadVertex kFSQV[4];
kFSQV[0].vPos = D3DXVECTOR4( -1.0f, 1.0f, 0.5f, 1.0f ); kFSQV[0].vTexCoord = D3DXVECTOR2( 0.0f, 0.0f ); kFSQV[1].vPos = D3DXVECTOR4( 1.0f, 1.0f, 0.5f, 1.0f ); kFSQV[1].vTexCoord = D3DXVECTOR2( 1.0f, 0.0f ); kFSQV[2].vPos = D3DXVECTOR4( -1.0f, -1.0f, 0.5f, 1.0f ); kFSQV[2].vTexCoord = D3DXVECTOR2( 0.0f, 1.0f ); kFSQV[3].vPos = D3DXVECTOR4( 1.0f, -1.0f, 0.5f, 1.0f ); kFSQV[3].vTexCoord = D3DXVECTOR2( 1.0f, 1.0f ); hFSQuadVB = pkManagerVB->CreateVertexBuffer( sizeof( XgFSQuadVertex ) * 4, sizeof( XgFSQuadVertex ), 0 ); XgFSQuadVertex* pvVertex = (XgFSQuadVertex*)pkManagerVB->LockVertexBuffer( m_hFSQuadVB ); memcpy( pvVertex, kFSQV, sizeof( XgFSQuadVertex ) * 4 ); pkManagerVB->UnLockVertexBuffer( m_hFSQuadVB ); DWORD dwWidth, dwHeight; Renderer->GetCurrentBackbufferSize( &dwWidth, &dwHeight ); D3DXVECTOR2 vHalfPixel = D3DXVECTOR2( 0.5f / dwWidth, 0.5f / dwHeight ); HANDLE hHalfPixel = m_pkFinal->GetParamByName( "g_vHalfPixel" ); pkFinal->SetValue( hHalfPixel, (void*)vHalfPixel, sizeof(D3DXVECTOR2) ); Renderer->DrawPrimitive( XGPT_TRIANGLESTRIP, 0, 2 );

21 사전지식 ////////////////////////////////////////////////////////////////////////// /// Vertex Shader VS_OUTPUT VS_pp_base( VS_INPUT i ) { VS_OUTPUT o; /// 1. Pos o.vPos = i.vPos; /// 2.TexCoord o.vTexCoord0 = i.vTexCoord0 + g_vHalfPixel; return o; }

22 흐림 필터 Burl Filter는 그림의 부드럽게 표현합니다. 흔히들 말하는 뽀샤시 필터를 의미합니다.
그림 1 원본화면 texture/base.bmp 그림 2 적용된 화면 texture/LUpDownSize.bmp

23 흐림 필터 선형 택스처 필터링을 이용한 블러 Idea ! D3DTEXF_LINEAR 를 이용한 복사를 통해
주변 4점을 평균값을 취한다. 축소한후 다시 값을 가져오는것도한 LINEAR하게 얻어오므로 흐림효과를 얻어낼수 있다.

24 흐림 필터 선형 택스처 필터링을 이용한 블러 택스쳐 설정 /// texture
Texture TexLDR //Base Texture // Sampler Sampler SamplerLDR = sampler_state { Texture = <TexLDR>; MipFilter = LINEAR; MinFilter = LINEAR; MagFilter = LINEAR; AddressU = Clamp; AddressV = Clamp; };

25 흐림 필터 선형 택스처 필터링을 이용한 블러 PS float4 PSTest_BLUR( VS_OUTPUT i ) {
PS_OUTPUT o; float4 vDiffuse; vDiffuse = tex2D( SamplerLDR, i.vTexCoord0); o.vColor = vDiffuse; return o; }

26 흐림 필터 선형 택스처 필터링을 이용한 블러 결과 texture/base.bmp //원본
texture/Lcopy.bmp //리니어 필터링을 통한 같은 사이즈 복사 texture/LDownSize //리니어 필터링을 통한 축소 texture/LUpDownSize //리니어 필터링을 통해 축소한 사이즈의 택스쳐를 다리 확대 texture/base2.bmp //원본 texture/Pcopy //포인터 필터링을 통한 같은 사이즈 복사 texture/PDownSize //포인터 필터링을 통한 다운사이즈 texture/PUpDownSize //포인터 필터링을 통해 축소한 사이즈의 택스쳐를 확대

27 흐림 필터 16박스 필터 샘플링 Idea ! 원하는 점의 값을 취득하여 값을 사용하지 않고, 1택셀씩의 변화값을
주어 4가지 정보를 얻어와 평균값을 사용한다. 취득하여 오는 점의 정보를 Linear하게 얻오어므로 4*4 박스 필터링이 된다. 그림을 별 상관없으나, 관련설명을 해보려 첨부

28 흐림 필터 16박스 필터 샘플링 PS PS_OUTPUT PSTest_BLUR( VS_OUTPUT i ) {
PS_OUTPUT o; float4 vDiffuse; float2 vOnePixel = g_vHalfPixel * 2.0f; float2 vRectTexCoord0 = float2( i.vTexCoord0.x - vOnePixel.x, i.vTexCoord0.y - vOnePixel.y ); float2 vRectTexCoord1 = float2( i.vTexCoord0.x + vOnePixel.x, i.vTexCoord0.y - vOnePixel.y ); float2 vRectTexCoord2 = float2( i.vTexCoord0.x - vOnePixel.x, i.vTexCoord0.y + vOnePixel.y ); float2 vRectTexCoord3 = float2( i.vTexCoord0.x + vOnePixel.x, i.vTexCoord0.y + vOnePixel.y ); vDiffuse = tex2D(g_SamplerLDR, vRectTexCoord0 ); vDiffuse += tex2D(g_SamplerLDR, vRectTexCoord1 ); vDiffuse += tex2D(g_SamplerLDR, vRectTexCoord2 ); vDiffuse += tex2D(g_SamplerLDR, vRectTexCoord3 ); vDiffuse *= 0.25f; o.vColor = vDiffuse; return o; } // * 최적화를 위해선 버택스 쉐이더에서 미리 계산된 택스쳐 좌표를 받아서 바로 택스쳐값만 읽어야 합니다.

29 흐림 필터 16박스 필터 샘플링 texture/16 base.bmp //원본
결과 texture/16 base.bmp //원본 texture/16 Liner.bmp //16박스 필터 샘플링

30 흐림 필터 9콘 필터 샘플링 & 64박스 필터 샘플링 Idea! 2 4 2

31 가우스 필터 가우스 필터 1) 가우스 함수에 의해 텍셀 중심에서 멀어지면 멀어질수록 급격하게 영향력이 작아지는
    1) 가우스 함수에 의해 텍셀 중심에서 멀어지면 멀어질수록 급격하게 영향력이 작아지는 가중치로 합성하여 흐림효과 연출     2) 흐림 필터를 2회 적용         . 가로 방향(X 방향)         . 세로 방향(Y 방향) 자료출처~

32 가우스 필터 가우스 함수 1) 가우스 함수는 아래와 같은 식으로 구한다. 가우스 함수는 지수 함수적인 형태를 한 함수이다.
    1) 가우스 함수는 아래와 같은 식으로 구한다.          가우스 함수는 지수 함수적인 형태를 한 함수이다.                          c: 규격화 상수             t : 중심 픽셀로부터의 거리             σ : 분산             exp() : 지수 계산 함수

33 가우스 필터 2) 아래 그림과 같이 중심 픽셀로 부터 같은 거리에 있는 픽셀은 같은 가중치를 가진다. . 이 특성을 이용해 불필요한 연산을 줄일 수 있다.

34 가우스 필터 구현 1) 2 패스 셰이딩 . 1 패스 : 가로 방향 흐림 필터 적용 . 2 패스 : 세로 방향 흐림 필터 적용
 1) 2 패스 셰이딩         . 1 패스 : 가로 방향 흐림 필터 적용         . 2 패스 : 세로 방향 흐림 필터 적용     2) 가우스 함수를 사용한 가중치 계산         . 책에서 발췌         for ( int i=0;  i<WEIGHT_NUM; ++i )         {             float pos = 1.0f + ( 2.0f * (float)i );             m_tbl[i] = expf( -0.5f * (float)(pos*pos)/dispersion*dispersion );         // dispersion은 임의의 값 지정(책에서는 5.0f 지정)             total += m_tbl[i];         }         for ( int i=0; i<WEIGHT_NUM; ++i )             m_tbl[i] /= total;     3) 규격화 상수         . 규격화 상수는 모든 색이 동일한 조건일 때 적용하더라도 색이 변함이 없도록 결정하는 역할을 한다. 이 조건은 가중치의 합계가 1이 되도록 설정하면 만족한다.         . 따라서, 가중치의 합계를 계산해 두고 마지막에 각각의 가중치를 그 합계로 나누면 올바른 가중치를 얻을 수 있게 된다. 

35 가우스 필터 결과

36 크로스 필터 HDR이란? HDR(High Dynamic Range) : 디스플레이에 표시되지 않는 강도의 빛을 고려한 처리를 말한다. 디스플레이가 방사할 수 있는 빛의 강도에 한계가 있기 때문에 컴퓨터 그래픽스로 태양과 같이 강한 빛을 표현할 경우에는 눈부시게 보이는 것 같은 연출을 추가해야 한다. 디스플레이 상의 한계(256단계)를 좀 더 정밀도가 높은 데이터를 사용하여 미리 보관해 두고, 출력할 경우에 256단계로 복원해 출력하는 개념 HDR 포맷 : 텍스쳐를 렌더링 타겟으로 사용하는 방법이 널리 쓰인다 부동 소수점 포맷 : D3DFMT_A16B16G16R16, D3DFMT_A32B32G32R32   정수 포맷 : 부동 소수점 포맷보다 정밀도가 떨어진다 : D3DFMT_A2B10G10R10             부동소수점 버퍼이므로 1.0을 넘는 값에서도 1.0값에 제한되지 않고, 그대로의 강도가 색의 형태로 보존된다(HDR)  효과 : 별 형태의 광선 효과(광택물질의 반사) (크로스 필터) 블룸(Bloom, 빛 주변도 빛남) 노광제어(암반응,명반응) (노출보정)

37 크로스 필터 LDR이란? 일반적으로 우리가 아는 택스쳐 표현방식으로
R8G8B8A8 / 256 * 256* 256 * 256 만큼의 색상을 표현할수 있습니다. 결국 모니터상에는 LDR화면만이 표현가능하지만 HDR을 이용하여 연산한 결과를LDR로 전환시킨것과, LDR만을 이용하여 표현한 결과값은 상당한 차이를 보입니다.

38 크로스 필터 부동 소수점 포맷 D3DFMT_A16B16G16R16 / D3DFMT_A32B32G32R32 같은 경우는 많은 하드웨어에서 선형택스쳐링을 지원하지 않고 포인트 택스쳐링만 가능함

39 크로스 필터 크로스 필터 휘도가 높은 부분을 추출해서 여러 방향으로 잡아 늘인 화면을 덧셈 합성한다 -> 부하가 걸린다
-> 축소 버퍼 사용 축소 버퍼 : 원본 화면 보다 작은 버퍼(렌더링 타겟)로 여러가지 이펙트를 넣은 후 원본 화면과 합성한다. 축소 버퍼의 크기는 퍼포먼스나 렌더링 품질과 관련이 있다.

40 크로스 필터 작업 순서 원본의 축소 휘도 추출

41 크로스 필터 작업 순서 블러링 늘이기(별모양으로 만들기)

42 크로스 필터 작업 순서 =>> 원본과의 결합 Texture/hdr/final 택스쳐 합성

43 크로스 필터 작업순서 원본 -> 축소버퍼로 복사 -> 휘도추출 -> 블러링 ->
이미지 늘리기(별모양으로) -> 늘인 이미지 합성 -> 원본과의 합성

44 크로스 필터 원본구성 방법 ▷ HDR 예제이므로 택스쳐를 HDR 포맷을 이용. ▷ 빛의 강도를 1이상이 기입되도록 프로그래밍 원본 -> 축소버퍼 ▷ 축소버퍼 HDR 포맷 택스쳐 이용 ▷ HDR 택스쳐가 선형 샘플링을 지원안하는 관계로 일정 오프셋을 직접 설정해 선형적인 샘플링을 실시

45 크로스 필터 원본 -> 축소버퍼 //오프셋 구성 D3DXVECTOR2 offsets[16];
DWORD dwWidth, dwHeight; GetBackbufferSize( &dwWidth, &dwHeight ); dwWidth /= 4; dwHeight /= 4; Int index=0; for( int y=0; y < 4; y++ ) { for( int x=0; x < 4; x++ ) offsets[ index ].x = (x - 1.5f) / dwWidth; offsets[ index ].y = (y - 1.5f) / dwHeight; index++; }

46 크로스 필터 원본 -> 축소버퍼 // PS float4 PSDownScale4x4( VS_OUTPUT i ) {
float4 vDiffuse = float4(0.0f, 0.0f, 0.0f, 0.0f); float2 vOriUV = i.vTexCoord0; for( int i=0; i < 16; i++ ) vDiffuse += tex2D(g_SamplerHDR, vOriUV + g_avSampleOffsets[i] ); } vDiffuse /= 16; return vDiffuse;

47 크로스 필터 축소버퍼 -> 휘도추출 //PS Float4 PSBrightPass( VS_OUTPUT i ) {
float4 vDiffuse; vDiffuse = tex2D(g_SamplerHDR, i.vTexCoord0); // 어두운부분제외 vDiffuse.rgb -= 1.5f; // 하한값을0으로 vDiffuse = 3.0f*max(vDiffuse, 0.0f); return vDiffuse; }

48 크로스 필터 휘도 -> 블러링 //PS float4 PSGauseBlur( VS_OUTPUT i ) {
float4 vDiffuse = 0.0f; float2 vOriUV = i.vTexCoord0; for( int i=0; i < 13; i++ ) vDiffuse += g_avSampleWeights[i] * tex2D( g_SamplerHDR, vOriUV + g_avSampleOffsets[i] ); } return vDiffuse;

49 크로스 필터 블러링 -> 이미지 늘이기 늘어날시 색상의 설정 // 이펙트에서사용하는상수설정
static const int s_maxPasses = 3; static const int nSamples = 8; // 광선색 static const D3DXCOLOR s_colorWhite(0.63f, 0.63f, 0.63f, 0.0f) ; static const D3DXCOLOR s_ChromaticAberrationColor[8] = { D3DXCOLOR(0.5f, 0.5f, 0.5f, 0.0f), // 뵏 D3DXCOLOR(0.8f, 0.3f, 0.3f, 0.0f), // 먗 D3DXCOLOR(1.0f, 0.2f, 0.2f, 0.0f), // 먗 D3DXCOLOR(0.5f, 0.2f, 0.6f, 0.0f), // 럤 D3DXCOLOR(0.2f, 0.2f, 1.0f, 0.0f), // 먃 D3DXCOLOR(0.2f, 0.3f, 0.7f, 0.0f), // 먃 D3DXCOLOR(0.2f, 0.6f, 0.2f, 0.0f), // 쀎 D3DXCOLOR(0.3f, 0.5f, 0.3f, 0.0f), // 쀎 } ; static D3DXVECTOR4 s_aaColor[s_maxPasses][nSamples]; for (int p = 0 ; p < s_maxPasses ; p ++) // 중심에서의거리에따라광선색을만든다 float ratio = (float)(p + 1) / (float)s_maxPasses ; // 각각샘플링해서적당한색을만든다 for (int s = 0 ; s < nSamples ; s ++) D3DXCOLOR chromaticAberrColor ; D3DXColorLerp(&chromaticAberrColor, &( s_ChromaticAberrationColor[s] ), &s_colorWhite, ratio) ; // 전체적인색변화를조정 D3DXColorLerp( (D3DXCOLOR*)&( s_aaColor[p][s] ),&s_colorWhite, &chromaticAberrColor, 0.7f ) ; }

50 크로스 필터 블러링 -> 이미지 늘이기 float radOffset = (D3DX_PI/2) /5;// 시점에따라회전
// 원본화면의폭과높이조사 float srcW = (FLOAT) dwWidth ; float srcH = (FLOAT) dwHeight; int nStarLines = 3;// 광선의줄기개수 for (int d = 0 ; d < nStarLines ; d ++) { // 방향에따라루프 float rad = radOffset + 2*d*D3DX_PI/(FLOAT)nStarLines;// 각도 float sn = sinf(rad); float cs = cosf(rad); D3DXVECTOR2 vtStepUV = D3DXVECTOR2(0.3f * sn / srcW, 0.3f * cs / srcH); float attnPowScale = (atanf(D3DX_PI/4) + 0.1f) * (160.0f f) / (srcW + srcH); int iWorkTexture = 0; for (int p = 0 ; p < s_maxPasses; p++) { //텍스처좌표와합성할때의가중치를계산 D3DXVECTOR4 avSampleWeights[16]; D3DXVECTOR2 avSampleOffsets[16]; for (int i = 0 ; i < nSamples ; i++) // 각각의가중치 float lum = powf( 0.95f, attnPowScale * i ); avSampleWeights[i] = s_aaColor[s_maxPasses-1-p][i] * lum * (p+1.0f) * 0.5f ; // 텍스처좌표를늘린양 avSampleOffsets[i].x = vtStepUV.x * i ; avSampleOffsets[i].y = vtStepUV.y * i ; if ( 0.9f <= fabs(avSampleOffsets[i].x) || 0.9f <= fabs(avSampleOffsets[i].y) ) avSampleOffsets[i].x = 0.0f ; avSampleOffsets[i].y = 0.0f ; avSampleWeights[i] *= 0.0f ; }

51 크로스 필터 블러링 -> 이미지 늘이기 //택서쳐 선별
havSampleOffsets = m_pkFinal->GetParamByName( "g_avSampleOffsets" ); shader->SetValue( havSampleOffsets, (void*)(&(avSampleOffsets[0])), sizeof(D3DXVECTOR2) * 16 ); HANDLE havSampleWeights = shader- >GetParamByName( "g_avSampleWeights" ); shader- >SetValue( havSampleWeights, (void*)(&(avSampleWeights[0])), sizeof(D3DXVECTOR4) * 16 ); //랜더! // 다음패스를위한파라메터설정 vtStepUV *= nSamples; attnPowScale *= nSamples;

52 크로스 필터 PS float4 PSStarlong( VS_OUTPUT i ) { float4 vDiffuse = 0.0f;
float2 vOriUV = i.vTexCoord0; for( int i=0; i < 8; i++ ) vDiffuse += g_avSampleWeights[i] * tex2D( g_SamplerHDR, vOriUV +g_avSampleOffsets[i] ); } return vDiffuse;

53 크로스 필터 늘인 이미지 합성 Flaot4 PSMergeTextere3( VS_OUTPUT i ) {
float4 vDiffuse = 0.0f; float2 vOriUV = i.vTexCoord0; vDiffuse = ( tex2D(g_SamplerMerge0, vOriUV) + tex2D(g_SamplerMerge1, vOriUV) + tex2D(g_SamplerMerge2, vOriUV) ) / 3.0f; return vDiffuse; }

54 크로스 필터 최종화면 구성 float4 PSAddstar( VS_OUTPUT i ) {
float4 vDiffuse = 0.0f; float2 vOriUV = i.vTexCoord0; vDiffuse = ( tex2D(g_SamplerHDR, vOriUV) + tex2D(g_SamplerMerge0, vOriUV) ); return vDiffuse; }

55 열심히 공부합시다. Q & A


Download ppt "DirectX9 셰이더 프로그리밍 7 -1 흐림필터 7 -2 가우스 필터 7 -3 크로스 필터 3D 프로그래밍 스터디 유대훈"

Similar presentations


Ads by Google