최상단 광고

2012년 4월 9일 월요일

[ Direct3D ] 화면좌표 기준으로 2D Sprite 그리기


이번에 다룰 내용은 꿈과 희망의 화면좌표 기준으로 2D Sprite 그리기 이다.
3D API ( OpenGL/ DirectX( Direct3D ) ) 를 이용해 2D 게임을 만들고 싶은 인간이라면
한번 들여다 봐도 손해보진 않을것이다.
이론적인 부분은 앞서 [ 3D Programming ] 코너에서
소개해 뒀으니 참고할 인간은 참고 하길 바란다. 사실 별 내용도 없지만서도.
하여간 바로 소스 코드로 들어간다.
//----------------------------------------------------------------------------
// 화면 좌표기준으로 2D Sprite 를 그린다
//----------------------------------------------------------------------------
// 아래의 모듈을 별도의 함수로 만드는 것이 편리할것이다.
// 뭐 가령 DrawSprite( Texture객체 포인터, 위치 좌표 ... ) 식으로 말이다
//----------------------------------------------------------------------------
float Sprite2DPosX = 0.0f; // 화면에서의 Sprite X좌표
float Sprite2DPosY = 0.0f; // 화면에서의 Sprite Y좌표
float Sprite2DWidth = 200.0f; // Sprite 의 폭( 임시 )
float Sprite2DHeight = 200.0f; // Sprite 의 높이( 임시 )
//--------------------------------------------------------
// 현재 View Port 의 가로, 세로 길이를 얻어온다
//--------------------------------------------------------
float ViewPortWidth = 0.0f;
float ViewPortHeight = 0.0f;
D3DVIEWPORT9 vp;
g_pd3dDevice->GetViewport( &vp ); //현재 View Port 정보를 얻어온다

ViewPortWidth = vp.Width;
ViewPortHeight = vp.Height;

//--------------------------------------------------------
// 화면 좌표를 투영 좌표계로 변환
//--------------------------------------------------------
float PosStartX = ( ( 2.0 * Sprite2DPosX ) / ViewPortWidth ) - 1.0f;
float PosStartY = ( ( -2.0 * Sprite2DPosY ) / ViewPortHeight ) + 1.0f;
float PosEndX = ( ( 2.0 * ( Sprite2DPosX + Sprite2DWidth ) ) / ViewPortWidth ) - 1.0f;
float PosEndY = ( ( -2.0 * ( Sprite2DPosY + Sprite2DHeight ) ) / ViewPortHeight ) + 1.0f;
//-----------------------------
// 기하 변환 행렬들을 설정
//-----------------------------
D3DXMATRIXA16 matWorld; // 월드 변환
D3DXMATRIXA16 matView; // 뷰 변환
D3DXMATRIXA16 matOrtho; // 투영 변환( 직교 )

D3DXMatrixIdentity( &matWorld );
D3DXMatrixIdentity( &matOrtho );
D3DXMatrixIdentity( &matView );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

//--------------------------------------------------------------
// 직교 투영 변환 행렬
//--------------------------------------------------------------
// 카메라 좌표계의 시야 절두체를
// ( -1.0f, -1.0f, -1.0f ) ~ ( 1.0f, 1.0f, 0.0f )
// 범위를 갖는 길이 2.0f인 정육 면체로 만든다.
//--------------------------------------------------------------
D3DXMatrixOrthoOffCenterLH( &matOrtho, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 0.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matOrtho );

//----------------------------------
// 정점 정의( 투영 좌표계 기준 )
//----------------------------------
MYVERTEX Vertices[] =
{
{ PosStartX, PosStartY, 0.0f, 0, 0 },
{ PosEndX, PosStartY, 0.0f, 1, 0 },
{ PosStartX, PosEndY, 0.0f, 0, 1 },
{ PosEndX, PosEndY, 0.0f, 1, 1 },
};
//----------------------------------------------------------------
// * Sprite를 그리기전에 Z Buffer를 꺼둔다.
//----------------------------------------------------------------
// 아니면 Sprite 의 Z 좌표를 다른 3D 객체 보다 앞쪽에 그리는
// 것도 나쁘지 않을것이다.
//-----------------------------------------------------------------
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, false );
g_pd3dDevice->SetTexture( 0, g_pTexBillboard[2] ); // Sprite로 그릴 Texture 를 설정한다
//----------------------------------------
// Rendering Sprite!!!
//----------------------------------------
g_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, Vertices, sizeof(MYVERTEX));

댓글 없음: