[DX]StretchRect (LPDIRECT3DSURFACE 복사)

반응형

큐브맵을 만들때 내가 필요한 기능은 큐브맵핑이 아니라 단순히 큐브맵을 저장하는 것.
BackBuffer를 들고 왔다.
이녀석은 LPDIRECT3DSURFACE였다.
그리고 큐브텍스쳐를 하나 만들고 그곳에 들고온 BackBuffer를 복사했다.
꽤나 편한 녀석인듯하다.


IDirect3DDevice9::StretchRect 메서드


전송원직사각형의 내용을 목적지 직사각형에 복사 한다. 복사에 의해, 전송원직사각형을 확대 및 필터링 할 수 있다. 이 함수는, 비디오 스트림의 어스펙트비(가로세로 비율)의 변경에 자주(잘) 사용된다.

구문

HRESULT StretchRect(      

    IDirect3DSurface9 *pSourceSurface,     CONST RECT *pSourceRect,     IDirect3DSurface9 *pDestSurface,     CONST RECT *pDestRect,     D3DTEXTUREFILTERTYPE Filter );

파라미터

pSourceSurface
[in] 전송원표면의 포인터. 「IDirect3DSurface9 」를 참조할것.
pSourceRect
[in] 전송원직사각형의 포인터. 이 파라미터에 NULL 를 지정 하면, 전송원표면 전체가 사용된다.
pDestSurface
[in] 목적지 표면의 포인터. 「IDirect3DSurface9 」를 참조할것.
pDestRect
[in] 목적지 직사각형의 포인터. 이 파라미터에 NULL 를 지정 하면, 목적지 표면 전체가 사용된다.
Filter
[in] 필터 타입. 지정 가능한 값은, D3DTEXF_NONE, D3DTEXF_POINT, 또는 D3DTEXF_LINEAR 이다. 더 자세한 정보는, 「D3DTEXTUREFILTERTYPE 」를 참조할것.

반환값

성공했을 경우는,D3D_OK 를 돌려준다.

실패했을 경우의 반환값은 다음대로.

D3DERR_INVALIDCALL 메서드의 호출이 무효이다. 예를 들어, 메서드의 파라미터에 무효인 값이 설정되어 있는 경우 등이다.


주의

일반적인 제한

IDirect3DDevice9::StretchRect 로 유효한 표면의 편성에는, 다양한 제한이 있다. 제한의 요인에는, 드라이버가 Microsoft® DirectX® 9.0 드라이버인가 또는 그 이전의 것인지, 또 조작에 의해 확대/축소의 어느 쪽이 발생할까 등이 포함된다. 애플리케이션측에서는 드라이버가 DirectX 9.0 일지 어떨지는 인식하지 않기 때문에, DirectX 9.0 레벨 이상의 드라이버에 대해서는, Microsoft Direct3D® 는 자동적으로 새로운 D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES 능력을 D3DDEVCAPS2 구조 체내에서 설정한다.

DirectX 8. x 드라이버 (확대 없음)

목적지 포맷
텍스처 RT 텍스처 RT 단순한 오프 스크린
전송원포맷 텍스처 아니오 아니오 아니오 아니오
RT 텍스처 아니오 아니오
RT 아니오 아니오
단순한 오프 스크린

DirectX 8. x 드라이버 (확대 있어)

목적지 포맷
텍스처 RT 텍스처 RT 단순한 오프 스크린
전송원포맷 텍스처 아니오 아니오 아니오 아니오
RT 텍스처 아니오 아니오 아니오 아니오
RT 아니오 아니오
단순한 오프 스크린 아니오 아니오

DirectX 9.0 드라이버 (확대 없음)

목적지 포맷
텍스처 RT 텍스처 RT 단순한 오프 스크린
전송원포맷 텍스처 아니오 아니오
RT 텍스처 아니오 아니오
RT 아니오 아니오
단순한 오프 스크린 아니오

DirectX 9.0 드라이버 (확대 있어)

목적지 포맷
텍스처 RT 텍스처 RT 단순한 오프 스크린
전송원포맷 텍스처 아니오 아니오
RT 텍스처 아니오 아니오
RT 아니오 아니오
단순한 오프 스크린 아니오 아니오

IDirect3DDevice9::StretchRect 에서는, 전송원표면와 목적지 표면의 양쪽 모두가 D3DPOOL_DEFAULT 표면이 아니면 안된다.

필터링을 지정했을 경우,IDirect3DDevice9::StretchRect 는, 드라이버가 D3DCAPS9 로 적절한 StretchRectFilterCaps 를 설정하지 않는 한 실패한다. D3DTEXF_NONE 를 지정했을 경우, 드라이버는 필터링 알고리즘을 선택한다.

확대 조작은, YUV 로부터 고정밀도 RGBA 의 색공간(color space)의 변환만을 지원 하고 있다. 같은 표면 위에의 직사각형간에서의 확대는 지원 되지 않는다. 변환의 소프트웨어 에뮬레이션은 지원 되지 않기 때문에,IDirect3D9::CheckDeviceFormatConversion 를 사용해 하드웨어의 색변환 지원을 테스트할 필요가 있다.

텍스처의 제한

IDirect3DDevice9::StretchRect 는, DirectX 9.0 드라이버 (D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES 를 설정하는 드라이버)에서의 텍스처 표면 (또는 큐브 텍스처 표면)에서만 동작한다.

깊이 및 스텐실의 제한

깊이 및 스텐실 표면 는,IDirect3DDevice9::StretchRect 를 사용해 복사 할 수 있지만, 다음의 제한이 있다.
  • 전송원 및 목적지의 양쪽 모두의 표면을,IDirect3DDevice9::CreateDepthStencilSurface 로 생성 할 필요가 있다. 이것은, 어느쪽이나 텍스처는 아니고 평면 스텐실 표면이 아니면 안되기 때문이다.
  • 어느 쪽의 표면도 같은 포맷이 아니면 안된다 (포맷 변환 없음).
  • 확대도 축소도 할 수 없다.
  • 서브 직사각형의 복사는 허가되지 않는다. 표면 전체를 복사 할 필요가 있다. 즉, pSourceRect 와 pDestRect 가 NULL 또는 표면 전체를 커버하는 직사각형의 포인트가 아니면 안된다.
  • IDirect3DDevice9::BeginScene /IDirect3DDevice9::EndScene 페어의 내부에서는 StretchRect 를 호출할 수 없다.
  • 전송원 또는 목적지 표면이, D3DUSAGE_DEPTHSTENCIL 로 생성 한 텍스처의 밉레벨 (큐브 텍스처)이어서는 안 된다.
  • 어느 쪽의 표면도,"파기 가능" 으로서 생성 해서는 안 된다.
  • 드라이버는, D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES 를 설정할 필요가 있다. 「D3DDEVCAPS2」를 참조할것.

다음의 몇개의 경우,IDirect3DDevice9::StretchRect 는 실패한다.

  • pSourceSurface 와 pDestSurface 가 같은 경우.
  • 확대 또는 축소의 어느 쪽인지를 해 어느 쪽인가의 표면이 DXTn 압축 포맷인 경우.
  • 전송원표면이 멀티 샘플링 되고 있는 경우 (MultiSampleType != D3DMULTISAMPLE_NONE 로 생성 했을 경우).
  • 목적지 표면이 단순한 오프 스크린이면서, 전송원표면이 그렇지 않은 경우. 목적지 표면이 단순한 오프 스크린이며, 확대를 하고 있는 경우.

'유용한 것들_func' 카테고리의 다른 글

Cubemap D3DFMT_DXT1으로 저장하기.  (0) 2009.08.20
FreeType 을 이용한 TrueType Font 파일 읽기  (0) 2009.08.18
USES_CONVERSION  (0) 2009.08.09
vld 사용법  (0) 2009.07.26
[window] CFileDialog - 파일포맷 지정  (0) 2009.07.16
TAGS.

Comments