09.02

신승빈·2022년 9월 2일
0

KGCA 수업

목록 보기
34/128
참고 : DirectGraphic, DirectInput, DirectSound

현재 위 3개 이외에는 Window SDK로 통합됨

Timer

#include <timeapi.h>
#pragma comment (lib, "winmm.lib")
DWORD timeGetTime();

milisecond 단위로 반환
49.71일 정도

High Resolution Timer

BOOL QueryPerformanceFrequency(
  [out] LARGE_INTEGER *lpFrequency
);
BOOL QueryPerformanceCounter(
  [out] LARGE_INTEGER *lpPerformanceCount
);
LARGET_INTEGER GetTime()
{
	QueryPreformaceFrequency(&frequency);
    QueryPerformanceCounter(&start);
    //do something
    QueryPerformanceCounter(&end);
    return (end - start) / frequency;
}

LARGE_INTEGER : long long 타입
micro second까지 측정 가능
최대 4800년

물론 점검, 패치 등의 명목으로 껏다 키는 경우도 있음
이를 통해 Memory Leak도 어느정도 커버 가능

Input

DirectInput, Win API등 다양한 방법 존재

/* VK_0 ~ VK_9, VK_A ~ VK_Z는 정의되어있지 않음. 문자로 직접 읽어와야함, 소문자 불가능 */
GetAsyncKeyState()	// 키 입력 정보
GetCursorPos()		// 마우스 위치, 화면좌표계 기준
ScreenToClient()	// 화면좌표계를 Client 좌표계로 변환

함수를 통해 가볍게 사용 가능

Write(Text Output)

DXTK::spriteFont()

DXTK를 통해 쉽게 출력 가능

Direct2D::DirectWrite

다양한 Font 지원
단, 출력마다 GPU에서 VertexBuffer, Rect 크기 등을 연산해야하므로 비용이 비쌈
대신 미리 작성된 font image를 통해 출력하는 방식 사용
DirectWrite의 경우 디버깅, 채팅 구현용으로 추천

Font

collection(흔히 말하는 글꼴)->family(이텔릭, 볼드 등)->face로 분류

구현

#include <d2d1.h>
#include <d2d1helper.h>
#include <dwrite.h>
#pragma comment (lib, "d2d1.lib")
#pragma comment (lib, "dwrite.lib")
{
	D2D1_RENDER_TARGET_PROPERTIES props;
	ZeroMemory(&props, sizeof(props));
	props.type = D2D1_RENDER_TARGET_TYPE_DEFAULT;
	props.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED);
    // windows의 폰트는 보통 96 dpi
	props.dpiX = 96;
	props.dpiY = 96;
	props.usage = D2D1_RENDER_TARGET_USAGE_NONE;
	props.minLevel = D2D1_FEATURE_LEVEL_DEFAULT;

	// 3d의 RenderTarget을 통해 2d의 RenderTarget을 생성할 경우, device생성 때 D3D11_CREATE_DEVICE_BGRA_SUPPORT플래그 설정 필수
    // 이 함수를 통해 3d의 RenderTarget을 통해 2d의 RenderTarget 생성, 연동
	HRESULT hr= m_d2dFactory->CreateDxgiSurfaceRenderTarget(
		DXGISurface1* dxgiSurface,
		&props,
		&m_d2dRT);

	hr = m_d2dRT->CreateSolidColorBrush({0,0,0,1}, &m_pTextColor);

	hr = D2D1CreateFactory( D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_d2dFactory);
	hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
							 __uuidof(IDWriteFactory), 
							 (IUnknown**)&m_pDWriteFactory);
    // IDWriteTextFormat은 출력문자 이외의 폰트, 크기 등 변경 불가
	hr = m_pDWriteFactory->CreateTextFormat(
		L"Gabriola", //L"고딕",
		NULL,
		DWRITE_FONT_WEIGHT_NORMAL,
		DWRITE_FONT_STYLE_NORMAL,
		DWRITE_FONT_STRETCH_NORMAL,
		30,	// 폰트 사이즈는 pixel단위
		L"en-us",//, // L"ko-kr",//
		&m_pTextFormat);

	// IDWriteTextLayout은 출력문자 이외의 속성 변경 가능
    // IDWriteTextLayout <-> IDWriteTextFormat
	m_szDefaultText = L"KGCA Game Academy";
	hr = m_pDWriteFactory->CreateTextLayout(
		m_szDefaultText.c_str(),
		m_szDefaultText.size(),
		m_pTextFormat,
		g_rtClient.right,
		g_rtClient.bottom,
		&m_pTextLayout);	

	// 출력은 항상 BeginDraw()와 EndDraw()사이에서 수행(D3D9 방식)
	m_d2dRT->BeginDraw();

	// Rect의 크기는 Client Window에서의 값
	D2D1_RECT_F rt = { x, y,g_rtClient.right,g_rtClient.bottom };
	m_pTextColor->SetColor(color);
	m_pTextColor->SetOpacity(1.0f);
	//m_pTextColor->SetTransform()
	m_d2dRT->DrawText(text.c_str(), text.size(),
		m_pTextFormat, rt, m_pTextColor);

	m_pTextLayout->SetFontSize(50, {0, (UINT)m_szDefaultText.size()});
	m_pTextLayout->SetFontStyle(DWRITE_FONT_STYLE_ITALIC, { 0, (UINT)m_szDefaultText.size() });
	m_d2dRT->DrawTextLayout({ 400, 300 }, m_pTextLayout, m_pTextColor);
	m_d2dRT->EndDraw();
}
profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글