ID3DXSprite

ID3DXSprite는 2D 이미지를 렌더링하는 객체이다.
ID3DXSprite는 그리기 위한 스케치북으로 여기에 뭔가를 보여줄려면 IDirect3DTexture9의 텍스쳐를 올려야 한다.

왼쪽의 이미지는 ID3DXSprite를 이용해서 그린 이미지고 오른쪽 이미지는 3D 공간에 렌더링한 이미지다.

과정을 생성, 소멸, 그리기순 알아본다.

< ID3DXSprite 생성 >

ID3DXSprite 생성객체를 리턴받기 위해 두 번째 인자에 ID3DXSprite의 포인터의 터인터를 넘겨준다.

HRESULT D3DXCreateSprite( LPDIRECT3DDEVICE9 pDevice, LPD3DXSPRITE* ppSprite);

< ID3DXSprite 소멸 >

ID3DXSprite 객체를 해제한다.

ID3DXSprite::Release( )

< ID3DXSprite  그리기 >
ID3DXSprite::Draw( )를 호출하면 그리기를 한다.
스프라이트를 다이렉트X의 BeginScene( )과 EndScene( ) 사이에 그리면 쉽게 이미지를 그릴수 있다.
기본적인 그리기는 크게 어려운점이 없다.

ID3DXSPRITE*        pSprite

IDIRECT3DDEVICE9*    pDevice;

IDIRECT3DTEXTURE9*    pTexture = NULL;

POINT pos;

pos.x = 100;

pos.y = 100;

 

pDevice->BeginScene()

 

pSprite->Begin(0);

pSprite->Draw( pTexture, NULL, &pos, NULL, 0xffffffff );

pSprite->End();

 

pDevice->EndScene();

pDevice->Present(NULL, NULL, NULL, NULL);

행렬을 이용해서 회전, 이동, 스케일링 하면 변환을 어떻게 해야 되는지 혼란스럽다.
행열을 이용한 변환을 할려면 ID3DXSPRITE::SetTransform( )을 사용한다.

POINT pos;

pos.x = 0;

pos.y = 0;

 

D3DXMATRIX spriteMat;

D3DXMatrixRotationZ( &spriteMat, D3DXToRadian(-15.0f) );

spriteMat._41 = 100.0f;  

spriteMat._42 = 100.0f;   

spriteMat._11 = 0.25f;

spriteMat._22 = 0.25f;

pSprite->SetTransform( &spriteMat );

 

pSprite->Draw( pTexture, NULL, &pos, NULL, 0xffffffff );

스프라이트를 반시계 방향으로 15도 만큼 회전하기 위해서 D3DXToRadian(-15.0f) 만큼 Z축을 회전 시킨다.
x축으로 100만큼 y축으로 100만큼 이동한다. 이 때 이동 값은 스크린 좌표이다.
x축으로 0.25배, y축으로 0.25배 크기를 축소한다.
Draw( )시 주던 위치값은 0, 0을 넣는다.

< Texture2D 클래스 > :

텍스쳐를 로딩하는 클래스이다.

//Texture2D 클래스 메소드

void  LoadTexture( IDirect3DDevice9*  pDevice, char* szFileName, UINT width = D3DX_DEFAULT_NONPOW2,                      UINT height = D3DX_DEFAULT_NONPOW2 );  

                 

void  Release();

UINT GetWidth();      

UINT GetHight() ;           

IDirect3DTexture9* GetTexture();      

const  D3DXIMAGE_INFO& GetTextureInfo();  

 

D3DXCreateTextureFromFileEx(  ) 로 텍스쳐를 로딩시 세 번째, 네 번째 인자 Width, Height 인자에 

DX_DEFAULT_NONPOW2 값을 주면 텍스쳐 크기를 N의 2승 없이 원본그대로 읽는다.

< Sprite 클래스 >

ID3DXSprite를 사용하기 위한 클래스 Sprite 클래스이다. Texture2D를 이용하는 이용해 이미지를 뿌린다.

//Sprite 클래스 메소드

void Begin( DWORD flags );              

void  End();                           

void  Draw( Texture2D* pTexture, const  POINT& pos, D3DCOLOR color );

void  Draw( Texture2D* pTexture, const  POINT& pos, const  RECT& surRect, D3DCOLOR color );       

void  Draw( Texture2D* pTexture, const  POINT& pos, const  D3DXMATRIX& transMatrix, const  RECT& surRect, D3DCOLOR color );

void  Draw( Texture2D* pTexture, const  POINT& pos, const  POINT& size, const  RECT& surRect, D3DCOLOR color );

void  Draw( Texture2D* pTexture, const  RECT& desRect, const  RECT& surRect, D3DCOLOR color );

void  Draw( Texture2D* pTexture, const  RECT& desRect, D3DCOLOR color );

ID3DXSprite* GetSprite();

 

< 참고 : ID3DXSprite::Draw 설명 >

HRESULT ID3DXSprite::Draw(     

    LPDIRECT3DTEXTURE9 pSrcTexture,

    CONST RECT *pSrcRect,

    CONST D3DXVECTOR2 *pScaling,

    CONST D3DXVECTOR2 *pRotationCenter,

    FLOAT Rotation,

    CONST D3DVECTOR2 *pTranslation,

    D3DCOLOR Color

)

pSrcTexture
[in] 스프라이트에 사용하는 소스 이미지를 나타내는 IDirect3DTexture9 인터페이스의 포인터.

pSrcRect
[in] 소스 텍스처의 어느 부분을 스프라이트에 사용하는지를 나타내는 RECT 구조체의 포인터. 이 파라미터를 NULL 로 하면 소스 이미지 전체가 스프라이트에 사용된다. 다만, 소스 이미지의 부분적인 직사각형을 지정할 수도 있다. 변환의 전에, 스프라이트의 사이즈가 pSrcRect 에 의해 좌상구석을 시점 (0,0)으로서 정의된다.

pScaling
[in] 스케일링 벡터를 저장 하는 D3DXVECTOR2 구조체의 포인터. 이 파라미터가 NULL 의 경우는, 값 (1.0, 1.0)을 사용한다. pScaling 는 벡터이므로, 승수 1.0 을 사용하면 소스 이미지의 사이즈가 보관 유지된다.

pRotationCenter
[in] 회전의 중심을 식별하는 스크린 픽셀내의 포인트를 저장 하는,D3DXVECTOR2 구조체의 포인터. 이 인수가 NULL 의 경우는, 텍스처의 좌상구석의 포인트 (0,0)가 사용된다.

Rotation
[in] 반시계회전의 회전을 지정하는 값 (라디안 단위).

pTranslation
[in] 스크린 픽셀에서의 평행이동값을 저장 하는 D3DXVECTOR2 구조체의 포인터. 이 인수가 NULL 의 경우는, 포인트 (0,0)를 사용한다.

Color
[in] D3DCOLOR 형. 이 값에 의해 컬러 채널과 알파 채널이 곱셈된다. 0xFFFFFFFF 라고 하는 값을 사용하면 원의 소스 컬러 및 알파 데이터가 유지된다.

반환값
성공했을 경우는,D3D_OK 를 돌려준다.
실패했을 경우는,D3DERR_INVALIDCALL 를 돌려준다.

변환의 순서는, 다음과 같이 지정된다.

(Msc)-1 * (Msr)-1 * Ms * Msr * Msc * (Mrc)-1 * Mr * Mrc * Mt

Msc 는 중심의 스케일링 행렬이다.
Msr 는 스케일링 회전 행렬이다.
Ms 는 스케일링 행렬이다.
Mrc 는 회전 행렬의 중심이다.
Mr 는 회전 행렬이다.
Mt 는 평행이동 행렬이다.

프로젝트: sprite.zip