렌더타겟을 만들어보자.
컴포넌트 RenderTargets을 구현하자.
렌더타겟을 관리할 매니저 Target_Manager와 Target 클래스를 선언하자.
Class Target
멤버변수로 텍스처 m_pTexture와
렌더타겟 LPDIRECT3DSURFACE9 m_pSurface = nullptr 을선언한다
두 개는 거의 동일한객체라고 생각해도된다(레퍼런스 카운트도 공유함)
Create함수의 인자로 장치와 Width,Height,D3DFORMAT Format,D3DXCOLOR vClearColor 을 받는다.
이를 네컨에도 전달하자.
NativeConstruct
D3DXCreateTexture() 텍스처를 생성해주자.
miplevel과 usage는 0으로 주자.
이제 이 텍스처의 GetSurfaceLevel을 호출해주자 인자로 받는 레벨은 miplevel을 만들었을경우에 어느 레벨을 사용할지를 인자로 받는것이다. ( 한장만 만들었기때문에 0을 준다)
Free에선 surface와 texture을 해제해주자 GetSurfaceLevel을 해줬기 때문에 2번해줘야함 어차피 같으니깐 surface한번 texture 한번 해주자.
타겟은 관리하기위한 매니저 클래스를 구현하자
CTarget_Manager
RenderTarget을 map형태로 보관하자
map에 렌더타겟을 생성해서 넣어주는 Add_RenderTarget함수를 만들어주자.
렌더타겟을 찾는 Find_RenderTarget함수도 만들어주자.
타겟 리스트를 보관하는 map m_MRTs를 선언하자
이렇게 묶어두면 나중에 장치에 바인딩할때 용이하다.
MRT를 이용하기위핸 Add,Begien,end,Find 함수를 만들어주자.
find함수는 list*를 리턴한다.
Add_MRT는 Find_MRT로 리스트가 있는지 찾고
리스트가 없다면 리스트를 만들어서 렌더타겟을 푸쉬한다.
다음 m_MRTs에 추가한다.
Begin_MRT()
pMRTTag이름을 가진 그룹에 있는 렌더타겟들을 장치에 바인드한다.
pMRTTag를 가진 멀티렌더 타겟리스트을 찾아준다.
다음 리스트안에 타겟들의 Bind 함수를 호출해서 바인딩해주자.
Bind_RenderTarget()
장치의 SetRenderTarget함수를 호출하자 (인덱스,Surface)
세팅하기전 OldSurface를 보관해주자.(백버퍼가 세팅되어있을수도있기때문)
Begin_MRT()
인덱스를 하나씩 증가하면서 넣어준다 이는 Add_MRT에 넣어준 순서대로 들어감을 의미한다.
디퓨즈를 먼저 그다음 노말을 추가해줘야한다.
다음 장치의 Clear를 호출해주자!
(장치에 연결되어있는 모든 타겟을 클리어한다.)
이때 Clear할 색이 중요하다 아무색이나 하는것이 아닌 인자로 받은 Color로 각각의 타겟을 각각의 Color로 지워줘야한다.
타겟을 세팅하고 지우고 빼고를 반복하자.
Clear함수를 만들어주자.
렌더타겟을 교체해주기위한 Release_RenderTarget을 해주자
(올드 Surface를 원상복구해준다)
이제 렌더타겟을 그리기위한 준비가됬다 렌더러에서 렌더타겟을 사용해보자.
렌더러의 네컨프로토에서 타겟매니저의 Add렌더타겟해주자.
먼저 디퓨즈타겟 을 추가해주자 포맷은 A8R8G8B8, 지우는 색은 빨간색으로 주자.
다음은 노말과 셰이더타겟을 추가해주자
노말을 실수를 담을수있는 픽셀포맷을 사용한다(A16B16G16R16)
셰이드도 실수로 표현되는 픽셀포맷을 사용해주자.
다음 멀티렌더 타켓을 추가해주자.
어떤 타겟을 동시에 세팅하는게 좋을까?
왜 디퓨즈랑노말이랑 묶을까 -> 객체들을 그릴때 세팅되어있어야하는 값이다.
지형과 플레이어를 그리기전에 MRT가 세팅되어야한다.
렌더논알파안에서 타겟매니저의 Begin_MRT를 호출해주자.