ij¸¯ÅÍ ¸Ó¸®À§¿¡ µû¶ó ´Ù´Ï´Â À̸§À» Ç¥½ÃÇÏ´Â ¹æ¹ý¿¡´Â 2°¡Áö°¡ ÀÖ´Ù. ºôº¸µå ÆÇÀ» ¸Ó¸® À§¿¡ ºÙÀÌ´Â ¹æ¹ýÀÌ ÀÖ°í, ¶Ç Çϳª´Â ¸Ó¸® À§¿¡ 2D ¹æ½ÄÀÇ UI¸¦ ºÙÀÌ´Â ¹æ¹ýÀÌ ÀÖ´Ù.
ºôº¸µå ÆÇÀº 3D·Î ó¸®Çϱ⠶§¹®¿¡ ÆùÆ®°¡ ¸Ö¸®ÀÖÀ¸¸é ÀÛ°Ô º¸ÀÌ°í °¡±îÀÌ °¡¸é Å©°Ô º¸ÀδÙ. 2D·Î ó¸®ÇÏ´Â ¹æ½ÄÀº °Å¸®¿Í °ü°è¾øÀÌ ÆùÆ®°¡ ÀÏÁ¤ÇÑ Å©±â·Î º¸ÀÌÁö¸¸ º®µÚ¿¡ °¬À» ¶§µµ ij¸¯ÅÍ À̸§ÀÌ º¸¿© º¸±â¿¡ ÁÁÁö ¾Ê´Ù.
ÀÌ Àå¿¡¼ ó¸®ÇÏ´Â °ÍÀº ÆùÆ®¿¡ ±íÀÌ°ªÀ» ³Ö¾î¼ ij¸¯ÅÍ°¡ º®µÚ¿¡ °¡¸é ij¸¯ÅÍ À̸§ÀÌ ¼ûµµµµ·Ï ó¸®ÇÑ´Ù.
"Hello World!"¶ó´Â ¹®ÀÚ¿À» 2D·Î ±×¸®°í ÀÖÁö¸¸ ±íÀÌ°ªÀ» °¡Áö°í Àֱ⠶§¹®¿¡ ÁÖº¯ ¹è°æ¿¡ ÀÇÇØ °¡·ÁÁø´Ù. ÀÌ°ÍÀ» ó¸®Çϱâ À§ÇÑ ±âº» 󸮴 ´ÙÀ½ ¼ø¼·Î ÁøÇàÇÑ´Ù.
< D3DXSprite, D3DXFONT¸¦ ÅëÇÑ ÆùÆ® Ãâ·Â ¹æ½Ä >
D3DXFONT¿Í D3DXSprite¸¦ Á¶ÇÕÇÏ¿© ÆùÆ®¸¦ Ãâ·Â ÇÑ´Ù. D3DXFONT·Î DrawText½Ã ½ºÇÁ¶óÀÌÆ® ÇÚµéÀ» ÁöÁ¤ÇØÁØ´Ù. ½ºÇÁ¶óÀÌÆ®¸¦ ÅëÇÏ¿© ÆùÆ®¸¦ ±×¸®¸é D3DXSprite::SetTransform() ¸í·ÉÀ» ÅëÇØ ÁÂÇ¥¸¦ À̵¿ ÇÒ ¼ö ÀÖ´Ù. D3DXMatrixTranslation( &world, 100, 100, 0 )¿¡¼ º¸¸é ½ºÅ©¸° ÁÂÇ¥ x=100, y=100À¸·Î À̵¿ ½ÃÅ´À» ¾Ë¼ö ÀÖ´Ù.
ÄÚµå´Â ´ÙÀ½ÀÇ ¼ø¼·Î ¸¸µé¸é µÈ´Ù. 1. ½ºÇÁ¶óÀÌÆ® »ý¼º 2. ½ºÇÁ¶óÀÌÆ® ·»´õ¸µ 3. ½ºÇÁ¶óÀÌÆ® ¼Ò¸ê
//1. ½ºÇÁ¶óÀÌÆ® »ý¼º
LPD3DXFONT g_pNameFont = NULL; //ÆùÆ®¿ë
ID3DXSprite* g_pSprite = NULL; //½ºÇÁ¶óÀÌÆ®
void CreateSprite( IDirect3DDevice9* pd3dDevice )
{
D3DXCreateFont(pd3dDevice, 20, 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,TEXT("±Ã¼"), &g_pNameFont);
D3DXCreateSprite( pd3dDevice, &g_pSprite );
}
//2. ½ºÇÁ¶óÀÌÆ® ·»´õ¸µ
void RenderSprite( IDirect3DDevice9* pd3dDevice, D3DXMATRIX* pMat )
{
if( g_pSprite == NULL )
CreateSprite( pd3dDevice );
D3DXMATRIX world;
D3DXMatrixTranslation( &world, 100, 100, 0 );
g_pSprite->SetTransform( &world );
g_pSprite->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE );//2D
RECT rectTemp = { 0, 0, 200, 30};
g_pNameFont->DrawText(g_pSprite, L"Hello World!", -1, &rectTemp, 0, D3DCOLOR_COLORVALUE(1, 0, 0, 1) );//0xFFFF0000);
g_pSprite->End();
}
//3. ½ºÇÁ¶óÀÌÆ® ¼Ò¸ê
SAFE_RELEASE(g_pNameFont);
SAFE_RELEASE(g_pSprite);
|
< D3DXSprite::SetTransform()À» ÀÌ¿ëÇÑ ±íÀÌ°ª Ç¥½Ã >
2D¿¡ Åõ¿µµÈ ÁÂÇ¥¸¦ D3DXMatrixTranslation()¿¡ ³Ö´Â´Ù. Áï,
D3DXMatrixTranslation( &world, scrPos.x, scrPos.y, scrPos.z )¿¡¼ scrPos.x, scrPos.y´Â ½ºÅ©¸° ÁÂÇ¥¸¦ scrPos.z¿¡´Â 0¿¡¼ 1»çÀÌÀÇ ±íÀÌ °ªÀ» ³Ö°í D3DXSprite::SetTransform() ÇÏ¸é ½ºÅ©¸° ÁÂÇ¥¿Í ±íÀÌ°ªÀÌ Àû¿ëµÇ¼ ¿øÇÏ´Â °á°ú¸¦ ¾òÀ»¼ö ÀÖ´Ù.
GetScreenPos()¿Í WorldToScreen()´Â °°Àº °á°ú°ªÀ» ¹ÝȯÇÏ´Â ÇÔ¼öÀÌ´Ù.
void RenderSprite( IDirect3DDevice9* pd3dDevice, D3DXMATRIX* pMat )
{
if( g_pSprite == NULL )
CreateSprite( pd3dDevice );
D3DXMATRIX world;
D3DXVECTOR3 scrPos;
D3DXMATRIX* pLightMat = g_LCamera.GetWorldMatrix();
D3DXVECTOR3 pos = D3DXVECTOR3( pLightMat->_41, pLightMat->_42, pLightMat->_43 );
#if 0
//3D Ç¥½Ã
scrPos = GetScreenPos( pd3dDevice, pos );
#else
//3D Ç¥½Ã
WorldToScreen( pd3dDevice, scrPos, pos );
#endif
D3DXMatrixTranslation( &world, scrPos.x, scrPos.y, scrPos.z );
g_pSprite->SetTransform( &world );
g_pSprite->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE );
RECT rectTemp = { 0, 0, 200, 30};
g_pNameFont->DrawText(g_pSprite, L"Hello World!", -1, &rectTemp, 0, D3DCOLOR_COLORVALUE(1, 0, 0, 1) );
g_pSprite->End();
}
|
< ¿ùµå ÁÂÇ¥¸¦ ½ºÅ©¸° ÁÂÇ¥·Î º¯È¯ 1>
¿ùµå ÁÂÇ¥¸¦ ½ºÅ©¸° ÁÂÇ¥·Î º¯È¯Çϴ ù ¹ø° ¹æ¹ýÀÌ´Ù. ¿ùµå ÁÂÇ¥¸¦ ºä Çà·Ä X ÇÁ·ÎÁ§¼Ç Çà·Ä¿¡ ÀÇÇؼ º¯È¯ÇÏ¸é °¡·Î, ¼¼·Î, ±íÀÌ´Â 0~1»çÀÌÀÇ °ªÀ» °¡Áö°Ô µÈ´Ù. pooint.x¿Í point.y´Â ½ºÅ©¸° ÁÂÇ¥·Î º¯È¯½ÃÅ°°í, z°ªÀº ±×´ë·Î ¹ÝȯÇÑ´Ù.
D3DXVECTOR3 GetScreenPos( IDirect3DDevice9* pd3dDevice, D3DXVECTOR3& pos )
{
D3DXMATRIX matView = *g_VCamera.GetViewMatrix();
D3DXMATRIX matProj = *g_VCamera.GetProjMatrix();
D3DXMATRIX mat = matView * matProj;
D3DXVECTOR3 point;
D3DXVec3TransformCoord( &point, &pos, &mat );
const D3DSURFACE_DESC* pBackBufferSurfaceDesc = DXUTGetD3D9BackBufferSurfaceDesc();
float width = (float)pBackBufferSurfaceDesc->Width;
float height = (float)pBackBufferSurfaceDesc->Height;
//x, y¸¦ ½ºÅ©¸° ÁÂÇ¥·Î º¯È¯
point.x = ( point.x + 1 ) * width / 2;
point.y = ( -point.y + 1 ) * height / 2;
return point;
}
|
< ¿ùµå ÁÂÇ¥¸¦ ±íÀÌ ¹öÆÛ °ªÀ¸·Î º¯È¯ >
D3DXVec3Project()¸¦ ÀÌ¿ëÇؼ ¿ùµå ÁÂÇ¥¸¦ 2D ÁÂÇ¥·Î Åõ¿µÇÏ°í ÀÖ´Ù.
D3DXVECTOR3* WorldToScreen( IDirect3DDevice9* pDevice, D3DXVECTOR3 &vScreenCoord, D3DXVECTOR3 vWorldLocation )
{
D3DVIEWPORT9 viewPort;
D3DXMATRIX matProj, matView, identity;
pDevice->GetViewport( &viewPort );
D3DXMatrixIdentity( &identity );
//ºä, ÇÁ·ÎÁ§Æ®, ºäÆ÷Æ® ¼³Á¤
matView = *g_VCamera.GetViewMatrix();
matProj = *g_VCamera.GetProjMatrix();
const D3DSURFACE_DESC* pBackBufferSurfaceDesc = DXUTGetD3D9BackBufferSurfaceDesc();
viewPort.Width = (float)pBackBufferSurfaceDesc->Width;
viewPort.Height = (float)pBackBufferSurfaceDesc->Height;
#if 0
D3DXVec3Project( &vScreenCoord, &vWorldLocation, &viewPort, &matProj, &matView, &identity );
#else
//D3DXVec3Project() °°Àº °ªÀÌ ³ª¿Â´Ù. ¼Ò¼öÁ¡ ¾Æ·¡ 3ÀÚ¸® Â÷ÀÌÀÇ ¿ÀÂ÷°¡ ³´Ù.
Vec3Project( &vScreenCoord, &vWorldLocation, &viewPort, &matProj, &matView, &identity );
#endif
if(vScreenCoord.z >= 0 && vScreenCoord.z <= 1)
return &vScreenCoord;
return NULL;
}
|
< D3DXVec3Project ±¸ÇöÇغ¸±â >
D3DXVec3Project() API¿¡ ´ëÇؼ ÀÚ¼¼ÇÏ°Ô ¾Ë¾Æº¸ÀÚ.
// Project vector from object space into screen space
D3DXVECTOR3* WINAPI D3DXVec3Project( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DVIEWPORT9 *pViewport,
CONST D3DXMATRIX *pProjection, CONST D3DXMATRIX *pView, CONST D3DXMATRIX *pWorld);
|
¿ÀºêÁ§Æ® ÁÂÇ¥¸¦ 2D·Î Åõ¿µÇÏ´Â D3D APIÀÌ´Ù. Ä«¸Þ¶ó ºäÆ÷Æ®¿Í ÇÁ·ÎÁ§¼Ç Çà·Ä, ºä Çà·Ä, ¿ùµå Çà·ÄÀ» ³Ñ°ÜÁÖ¸é pv ÁÂÇ¥¸¦ 2D¿¡ Åõ¿µÇؼ pOut·Î º¯È¯ÇÑ´Ù. ¸®ÅÏ°ª pOut.z °ªÀÌ 0 ~ 1 »çÀÌ¿¡ ÀÖÀ¸¸é ȸé¾È¿¡ ÀÖ´Â °æ¿ìÀÌ´Ù.
Vec3Project´Â D3DXVec3Project()¸¦ Á÷Á¢ ±¸ÇöÇÑ°ÍÀÌ´Ù.
/*
D3DXVec3Project(Out, V, Viewport, Proj, View, World)
a = (Vx, Vy, Vz, 1)
b = a×World×View×Proj
c = b⁄bw
Outx = ViewportX + ViewportWidth*(1+cx)/2
Outy = ViewportY + ViewportHeight*(1-cy)/2
Outz = ViewportMinZ + cz*(ViewportMaxZ-ViewportMinZ)
*/
D3DXVECTOR3* Vec3Project( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DVIEWPORT9 *pViewport,
CONST D3DXMATRIX *pProjection, CONST D3DXMATRIX *pView, CONST D3DXMATRIX *pWorld)
{
D3DXVECTOR4 a = D3DXVECTOR4( pV->x, pV->y, pV->z, 1 );
D3DXMATRIX mat = (*pWorld) * (*pView) * (*pProjection);
D3DXVECTOR4 b; D3DXVec4Transform( &b, &a, &mat );
D3DXVECTOR3 c = b / b.w;
pOut->x = pViewport->X + pViewport->Width * (1+c.x)/2.0f;
pOut->y = pViewport->Y + pViewport->Height * (1-c.y)/2.0f;
pOut->z = pViewport->MinZ + c.z * (pViewport->MaxZ - pViewport->MinZ);
return pOut;
}
|
´Ù¿î·Îµå: font_test.zip
|