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

Slides:



Advertisements
Similar presentations
10-7 부동소수점 (Floating-Point) 계산  컴퓨터에서 숫자를 표기하는 방법  가수 (Fraction) : 부호화된 고정소수점 숫자 지수 (Exponent) : 소수점의 위치를 표시 ( 예 )10 진수 를 표기하면 Fraction Exponent.
Advertisements

6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
중원대학교 의료공학과 신 진솔 (WED). 영상의 밝기 & 명암 조절 영상의 감마보정 영상의 잡음 감소.
컴퓨터와 인터넷.
재료수치해석 HW # 박재혁.
그래픽 하드웨어.
색좌표 변환기의 설계 예 색좌표(Color Space) 색의 수학적인 표현 방법 RGB YIQ, YUV, YCbCr CMYK
Insert Footer or Copyright Information Here
Excel 일차 강사 : 박영민.
컴퓨터 프로그래밍 기초 [Final] 기말고사
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
디지털영상처리 및 실습 대구보건대학 방사선과.
제6장 텍스처링 학기 컴퓨터게임(DirectX).
질의 사항 Yield Criteria (1) 소재가 평면응력상태에 놓였을 때(σ3=0), 최대전단응력조건과 전단변형에너지 조건은σ1 – σ2 평면에서 각각 어떤 식으로 표시되는가? (2) σ1 =σ2인 등이축인장에서 σ = Kεn로 주어지는 재료의 네킹시 변형율을 구하라.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
Multimedia Programming 10: Point Processing 5
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Error Detection and Correction
멀티미디어 시스템 (아날로그 이미지,신호를 디지털로 변환 방법) 이름 : 김대진 학번 :
제4장 컬 러(COLOR) 컬러 표현 Direct3D는 RGB 세 성분을 이용해 컬러 표현
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
6장. printf와 scanf 함수에 대한 고찰
Multimedia Programming 06: Point Processing 2
상관함수 correlation function
프로그래밍 랩 – 7주 리스트.
공학컴퓨터프로그래밍 Python 염익준 교수.
C#.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
프로그래밍 개요
어서와 C언어는 처음이지 제14장.
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
24장. 파일 입출력.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Samsung Software Membership 3D MIM 신진수
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
ITQ 정보기술자격 국가공인 Excel 2007 Ⅱ 함수- 11회차 강사 : 박영민.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
Clipping 이진학.
8장. spss statistics 20의 데이터 변환
Fitting / Matrix / Excel
9강. 클래스 실전 학사 관리 프로그램 만들기 프로그래밍이란 결국 데이터를 효율적으로 관리하기 위한 공구
GM7 PLC 모니터링 프로그램 한국 폴리텍 항공대학 항공정보통신과 송 승 일.
WPF 3D 그래픽 발표자 : 조 현 민.
Excel 일차 강사 : 박영민.
Window, Viewport Window, Viewport.
에어 PHP 입문.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Chapter 1 단위, 물리량, 벡터.
Chapter 1 단위, 물리량, 벡터.
7주차: Functions and Arrays
11장 배열 1. 배열이란? 1.1 배열의 개요 1.2 배열의 선언과 사용.
웹과 모바일 홈페이지의 이해와 제작 폰트_레이아웃
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
Chapter 7 – Curves Part - I
상관계수.
Numerical Analysis Programming using NRs
컴퓨터공학과 손민정 Computer Graphics Lab 이승용 교수님
통계학 R을 이용한 분석 제 2 장 자료의 정리.
프로그래밍 개론 Ⅰ-실습 2장 데이터와 식①.
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
과제물 3호 3번 문제 설명자료.
영역 기반 처리.
Ch6 :: 텍스처링 Radiance team.
Report #2 (기한: 3/16) 데이터 구조 과목의 수강생이 50명이라고 가정한다. 이 학생(학번은 2016????으로 표현됨)들의 중간 시험(0~100), 기말 시험(0~100) 성적을 성적 파일에 작성하라(프로그램을 통해서 또는 수작업으로). 성적 파일을 읽어들여서.
7 생성자 함수.
6 객체.
BoardGame 보드게임 따라가기.
Presentation transcript:

DirectX9 셰이더 프로그리밍 7 -1 흐림필터 7 -2 가우스 필터 7 -3 크로스 필터 3D 프로그래밍 스터디 유대훈 7 -1 흐림필터 7 -2 가우스 필터 7 -3 크로스 필터 3D 프로그래밍 스터디 유대훈 kindman83@gmail.com http://cafe.naver.com/3dstudycafe

사전지식 구현에 앞서 알고 있어야 하는 내용 택스처 필터링 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

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

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

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

사전지식 택스쳐 샘플 스테이트 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;

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

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

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

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

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

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

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

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

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

사전지식 택스쳐 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]

사전지식 택스쳐 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;

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

** D3D이용 2D출력시 마법의 숫자 -0.5 에 대하여 ** copyrightⓒ Gamza 사전지식 ** D3D이용 2D출력시 마법의 숫자 -0.5 에 대하여 ** copyrightⓒ Gamza http://www.gamza.net/bbs/view.php?id=Article&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=15

사전지식 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 );

사전지식 ////////////////////////////////////////////////////////////////////////// /// 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; }

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

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

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

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

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

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

흐림 필터 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; } // * 최적화를 위해선 버택스 쉐이더에서 미리 계산된 택스쳐 좌표를 받아서 바로 택스쳐값만 읽어야 합니다.

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

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

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

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

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

가우스 필터 구현 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이 되도록 설정하면 만족한다.         . 따라서, 가중치의 합계를 계산해 두고 마지막에 각각의 가중치를 그 합계로 나누면 올바른 가중치를 얻을 수 있게 된다. 

가우스 필터 결과

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

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

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

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

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

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

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

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

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

크로스 필터 원본 -> 축소버퍼 //오프셋 구성 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++; }

크로스 필터 원본 -> 축소버퍼 // 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;

크로스 필터 축소버퍼 -> 휘도추출 //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; }

크로스 필터 휘도 -> 블러링 //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;

크로스 필터 블러링 -> 이미지 늘이기 늘어날시 색상의 설정 // 이펙트에서사용하는상수설정 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 ) ; }

크로스 필터 블러링 -> 이미지 늘이기 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 + 120.0f) / (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 ; }

크로스 필터 블러링 -> 이미지 늘이기 //택서쳐 선별 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;

크로스 필터 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;

크로스 필터 늘인 이미지 합성 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; }

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

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