반응형


http://blog.naver.com/nowcom77/20171445466


3D에서 글자를 출력하는 부분과 FPS를 출력하는 내용입니다. 

 

 

 

 

12문자 출력

   

Direct3D에서는 문자를 출력하기 위해서 LPD3DXFONT 객체를 사용한다.

   

12.1 LPD3DXFONT 객체 생성과 초기화

   

LPD3DXFONT 객체를 생성하고 초기화하는 함수로 D3DXCreateFont()가 있다.

 

HRESULT D3DXCreateFont(

__in LPDIRECT3DDEVICE9 pDevice,

__in INT Height,

__in UINT Width,

__in UINT Weight,

__in UINT MipLevels,

__in BOOL Italic,

__in DWORD CharSet,

__in DWORD OutputPrecision,

__in DWORD Quality,

__in DWORD PitchAndFamily,

__in LPCTSTR pFacename,

__out LPD3DXFONT *ppFont

);

[표 12-1] Font 생성 함수

   

Height와 Width는 글자의 가로세로 길이이며 Weight는 글자의 굵기를 결정하는 매개변수이다. Weight에 설정하는 값은WinGDI.h 헤더에 있으며 그 기본 값은 FW_NORMAL이다.

 

#define FW_THIN 100

#define FW_EXTRALIGHT 200

#define FW_LIGHT 300

#define FW_NORMAL 400

#define FW_MEDIUM 500

#define FW_SEMIBOLD 600

#define FW_BOLD 700

#define FW_EXTRABOLD 800

#define FW_HEAVY 900

   

#define FW_ULTRALIGHT FW_EXTRALIGHT

#define FW_REGULAR FW_NORMAL

#define FW_DEMIBOLD FW_SEMIBOLD

#define FW_ULTRABOLD FW_EXTRABOLD

#define FW_BLACK FW_HEAVY

[표 12-2] WinGDI.h 헤더

   

MipLevels에는 기본 값인 1을 설정하며 Italic에는 이텔릭체를 사용할 것인지의 여부를 설정하며 여기에는 일반적으로 FALSE를 설정한다.

그 외에는 기본값을 설정하면 되며 CharSet에는 DEFAULT_CHARSET을 설정하며 OutputPrecision에는OUT_DEFAULT_PRECIS으로 설정한다.

그리고 Quality에는 DEFAULT_QUALITY를 PitchAndFamily에는 DEFAULT_PITCH | FF_DONTCARE를 설정한다.

pFacename에는 글자체를 설정하는데 "Arial" 또는 “System“등을 설정한다.

여기까지 설명한 폰트의 설정값을 셋팅하여 D3DXCreateFont() 함수를 호출하면 다음과 같다.

   

LPD3DXFONT Font;

................. 생략 ................

D3DXCreateFont( m_pd3dDevice, 20, 0, FW_NORMAL, 1, FALSE, DEFAULT_CHARSET,

OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,

"Arial", &Font );

[표 12-3]

   

12.2 출력

   

글자를 출력해 주는 LPD3DXFONT 객체의 멤버 함수에는 DrawText()가 있으며 그 원형은 다음과 같다.

   

INT DrawText(

[in] LPD3DXSPRITE pSprite,

[in] LPCTSTR pString,

[in] INT Count,

[in] LPRECT pRect,

[in] DWORD Format,

[in] D3DCOLOR Color

);

[표 12-4] 출력 함수

 

pSprite에는 NULL을 설정하고 pString에는 출력하려는 문자열을 설정한다. Count에는 1을 설정하며 널문자까지를 출력하게 된다.

pRect에는 출력하려는 위치를 설정하는데 left와 top 값을 설정하면 되며 나머지는 0으로 설정한다. Format에는 문자의 정렬에 관련된 값을 설정하는데 DT_NOCLIP을 설정한다.

Color에는 출력할 색상값을 설정하며 색상값은 D3DXCOLOR()를 이용하여 설정한다.

색상값의 범위는 0.0 ~ 1.0f 까지면 그 원형은 다음과 같다.

   

D3DXCOLOR( FLOAT r, FLOAT g, FLOAT b, FLOAT a );

출력함수를 설정하면 다음과 같다.

   

RECT rt;

SetRect( &rt, 100, 430, 0, 0 );

   

Font->DrawText( NULL, "Test", -1, &rt, DT_NOCLIP, D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );

   

12.3 FPS 출력

   

FPS(Frame Per Second)는 1초에 화면 전환이 몇 번 일어났는가를 측정한 값을 말한다.

그래서 FPS로 게임 엔진의 렌더링 성능을 평가하는 경향이 있으며 게임 엔진의 개발 초기에 는 항상 FPS를 출력하면서 프로그래밍을 한다.

컴퓨터에서는 초 단위가 아닌 밀리세컨드 단위로 시간 값을 가져오므로 1초는 1000 밀리세컨드가 되며 경과된 시간이 1초인지를 알 수 있는 방법은 현재 시각과 이전 시각의 차를 이용하거나 매 프레임마다 경과된 시간을 누적하여 판단하는 방법등이 있다.

아래의 소스는 매 프레임마다 경과된 시간을 누적하여 판단하는 소스이다.

   

void CGameEdu01::OnInit()

{

int i;

   

RECT rect;

D3DVIEWPORT9 vp;

GetClientRect( m_hWnd, &rect );

   

vp.X = 0;

vp.Y = 0;

vp.Width = rect.right - rect.left;

vp.Height = rect.bottom - rect.top;

vp.MinZ = 0.0f;

vp.MaxZ = 1.0f;

   

m_Eye.x = 0.0f;

m_Eye.y = 10.0f;

m_Eye.z =-32.0f;

   

m_At.x = 0.0f;

m_At.y = 0.0f;

m_At.z = 0.0f;

   

m_Up.x = 0.0f;

m_Up.y = 1.0f;

m_Up.z = 0.0f;

   

D3DXMatrixLookAtLH( &m_matView, &m_Eye, &m_At, &m_Up );

m_pd3dDevice->SetTransform( D3DTS_VIEW, &m_matView );

D3DXMatrixPerspectiveFovLH( &m_matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f );

m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &m_matProj );

m_pd3dDevice->SetViewport( &vp );

   

D3DXCreateFont( m_pd3dDevice, 20, 0, FW_NORMAL, 1, FALSE, DEFAULT_CHARSET,

OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,

"System", &m_pFont );

}

   

void CGameEdu01::OnRender()

{

char string[100];

RECT rt = { 10, 10, 0, 0 };

   

sprintf( string, "FPS: %d", m_nFPS );

m_pFont->DrawText( NULL, string, -1, &rt, DT_NOCLIP, D3DXCOLOR( 1.0f, 1.0f,

0.0f, 1.0f ) );

m_nFPSCount++;

}

   

void CGameEdu01::OnUpdate()

{

DWORD dwCurTime = GetTickCount();

static DWORD dwOldTime = GetTickCount();

static DWORD dwAccumulateTime = 0; // 누적 경과 시간

   

m_dwElapsedTime = dwCurTime – dwOldTime; // 프레임 경과 시간

dwOldTime = dwCurTime;

   

dwAccumulateTime += m_dwElapsedTime; // 누적

if( dwAccumulateTime >= 1000 ) // 1초 경과 체크

{

dwAccumulateTime = 0;

m_nFPS = m_nFPSCount;

m_nFPSCount = 0;

}

}

   

void CGameEdu01::OnRelease()

{

      m_pFont->Release();

}

   

  

[출처] 12강. 글자 출력|작성자 nowcom77

반응형

+ Recent posts