아래에서 퍼옴
http://kiho.egloos.com/2785161
화면에 보여줄 내용을 백버퍼 대신 사용자가 지정한 서피스(Surface)에 그리게 하는 기능이다.
IDirect3DDevice9 의 함수중에 쓸것은..
CreateRenderTarget
SetRenderTarget
GetRenderTarget
CreateRenderTarget으로 surface를 만든다.
GetRenderTarget으로 원본 백 버퍼를 가져와 보관하고...
SetRenderTarget으로 위에서 만든 서피스를 지정한다...
그 후
BeginScene, EndScene으로 원래 하던 렌더링을 한다..
그 내용이 지정한 서피스안에 들어가게 된다..
그 후 SetRenderTarget으로 원래 백 버퍼를 복구시키고..
이 과정에서 얻은 서피스의 내용을 텍스쳐로 옮겨서
그대로 화면에 렌더링한다.. (안 그러면.. 당연히 그 프레임에는 아무것도 안나오게된다.... 서피스에만 그렸으니까)
CreateRenderTarget 함수를 쓰지 않고
RenderTarget옵션을 줘서 CreateTexture를 호출하여 텍스쳐를 바로 만들어도 된다...
대신 D3DPOOL_DEFAULT 옵션만을 지원하므로.. 귀찮은 점이 있다.. (D3DPOOL_MANAGED 가 편하다..)
나는 요청이 들어올때 마다 캡쳐를 하여 새로운 텍스쳐에 복사하도록 코딩하였다..
밑은 내가 작성한 코드를 정리한것이다.
LPDIRECT3DSURFACE9 originalTarget; // 백 버퍼
LPDIRECT3DSURFACE9 capturingTarget; // 캡쳐된 내용이 들어갈 서피스
device->GetRenderTarget(0, &originalTarget); // 가져온다..(백업?)
// 백 버퍼와 같은 속성으로 렌더타겟을 만든다.
D3DSURFACE_DESC desc;
originalTarget->GetDesc(&desc);
device->CreateRenderTarget(desc.Width, desc.Height, desc.Format, 0, 0, TRUE, &capturingTarget, NULL);
// 렌더타겟 설정후 그림.
device->SetRenderTarget(0, this->capturingTarget);
device->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1, 0);
device->BeginScene();
// 그릴 내용이 여기에..
device->EndScene();
// 여기서 텍스쳐를 만들어 캡쳐된 서피스의 내용을 복사한다...
// 원래대로 되돌린다.
device->SetRenderTarget(0, originalTarget);
device->BeginScene();
// 위에서 만든 텍스쳐를 전체화면에 그림.. 혹은 맘대로..
device->EndScene();
device->Present(NULL, NULL, NULL, NULL);
capturingTarget->Release(); // 다 쓴 건 release....
아 실제로는.. capturingTarget은 한번 만들고 계속 쓰게 했다.. 마지막에 release하고..
'게임 개발 > 3D 게임 플밍' 카테고리의 다른 글
Z 버퍼의 Read / Write 개념 (6부, Z Read/Write) (0) | 2010.03.19 |
---|---|
Early Z (0) | 2010.03.19 |
픽셀 연산시 고려해야할 색 공간(The Importance of being Linear) (0) | 2010.03.18 |
UberShader 를 활용한 게임제작 (0) | 2010.03.18 |
Depth Buffer Based Ambient Occlusion (= SSAO) (0) | 2010.03.17 |