ID3DXSprite 란?


1 ID3DXSprite 란? #

d3d 내에서 2D를 표현하기 위한 인터페이스


2 ID3DXSprite 의 사용법 #
























Begin 스프라이트를 드로잉(Drawing) 할 수 있도록(듯이) 장치를 준비한다.
Draw 스크린 공간에 단순한 스프라이트를 드로잉(Drawing) 한다.
DrawTransform 지정한 행렬에 의해 변환 한 스프라이트를 드로잉(Drawing)하기 위한 구조를 제공한다.
End ID3DXSprite::Begin 가 불려 간 시점의 장치 스테이트를 복원한다.
GetDevice 스프라이트 개체에 관련지을 수 있는 Direct3D 장치를 얻어온다.
OnLostDevice 비디오 메모리 리소스에의 참조를 모두 릴리즈 해, 모든 스테이트 블록을 삭제한다.
OnResetDevice 장치가 리셋 된 후에 호출할 필요가 있다.|

위의 표는 다이렉트X 헬프에 있는 내용이다. 사용법을 간단히 말하면 IDirect3DDevice9::BeginSceneIDirect3DDevice9::EndScene 사이에 ID3DXSprite::BeginID3DXSprite::End 를 호출하고 그 사이에 그리면 된다.

IDirect3DDevice9::BeginScene
ID3DXSprite::Begin

<< 여기다가 그리는걸 호출 >>>

ID3DXSprite::End
IDirect3DDevice9::EndScene


코드가 대충 이런 형태가 된다. 그릴때는 Draw 메소드를 호출해서 사용하는데

HRESULT Draw(LPDIRECT3DTEXTURE9 pSrcTexture,
CONST RECT *pSrcRect,
CONST D3DXVECTOR2 *pScaling,
CONST D3DXVECTOR2 *pRotationCenter,
FLOAT Rotation,
CONST D3DVECTOR2 *pTranslation,
D3DCOLOR Color
);

드로우 함수의 인자들 설명을 하자면

  • 첫번째 인자는 스프라이트에 사용할 텍스쳐이다. 스프라이트는 2D 게임프로그래밍을 해본사람이라면 느낌일 팍 올테니…
  • 두번째 RECT 구조체의 인자는 덱스쳐중에 어느 부분을 사용할것이가를 의미한다.
  • 세번째 D3DXVECTOR2 는 스케일링 인자라고하는데 x, y가 각각 가로 세로로 얼마나 늘려서 아니면 줄여서 사용할 것인지를 나타낸다. 뭐 기본값은 1.0f , 1.0f 다. 두배로 늘릴려면 2.0f, 2.0f 로 쓸수 있다. 음 RECT로 한픽셀 범위만 잡은뒤 가로 세로로 늘려서 원하는 길이의 선분을 얻을수도 있다. 뭐 대충 그런식…
  • 네번째 D3DXVECTOR2 는 회전중심이라고 하는데 아직 사용해보지는 않아서 모르겠지만 다섯번째 인자로 회전을 할때 어디를 중심으로 할것인가를 나타낸다. 기본값은 0.0f, 0.0f 이다.
  • 다섯번째 FLOAT 는 회전값인데.. 1.0f 를 넣어주니 90도가 회전했다. 음 정확한건 모르겠다.
  • 여섯번째 D3DCOLOR값에 의해 컬러 채널과 알파 채널이 곱셈된다 라고 써있다.. 그냥 0xFFFFFFFF 를 넣어주면 원래 이미지 그래도 찍힌다. 흐음 마스킹값을 넣어주는 건가?
인자를 설명하면 대충이렇다.(아아 정말 대충이다.) 그런데 이 스프라이트객체를 사용할때는 꼭 2의 X승 크기의 이미지를 사용해야 한다. 안그러면 RECT 구조체로 범위를 지정할때 엉망징창이 된다. 어떤 사람은 메모리도 센다고 하더라…

그리고 당연한 소리같지만 스프라이트 역시 순서에 따러 덥힌다. 즉 스프라이트를 찍고 오브젝트를 렌더링 하면 오브젝트에 가려 스프라이트가 안보일수고 있다는 것이다. 스프라이트도 D3D에서는 프리미티브로 처리할줄 알았는데… 조금 다른가보다.


3 스크린샷 #


http://lagoons.net/docdata/minimap_sprite.jpg

위의 이미지에서 우측상단에 그려진 격자모양의 미니맵이 스프라이트를 이용해서 구현되었다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다