ID3D10Font로 문자열을 출력하려니 되긴 되는데 3D 도형이 안 그려지는 경우를 만나게 되었다.
폰트를 그리게 되면 이전까지의 장치 상태를 덮어쓰기 때문에 이전에 계산한(렌더한) 도형 등은 보여지지 못하게 된다고 한다.
따라서 DX10에서 폰트를 출력할 때는 Sprite의 Begin함수에 인자로 상태를 저장하라는 메시지를 전해줘야한다.
1 2 3 4 5 6 |
ID3D10Device * d3dDevice = nullptr; ID3DX10Font * pFont = nullptr; ID3DX10Sprite * pSprite = nullptr; #define CLIENT_WIDTH 1024 #define CLIENT_HEIGHT 768 |
설명할 때 필요한 최소한의 변수들.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
bool InitFont() { HRESULT hResult; D3DX10_FONT_DESCW fontDesc; RtlZeroMemory(&fontDesc, sizeof(fontDesc)); fontDesc.Height = 48; fontDesc.Width = 0; fontDesc.Weight = FW_NORMAL; fontDesc.MipLevels = 0; fontDesc.Italic = FALSE; fontDesc.CharSet = DEFAULT_CHARSET; fontDesc.OutputPrecision = OUT_DEFAULT_PRECIS; fontDesc.Quality = CLEARTYPE_NATURAL_QUALITY; fontDesc.PitchAndFamily = 0; wcscpy_s(fontDesc.FaceName, TEXT("맑은 고딕")); hResult = D3DX10CreateFontIndirectW(d3dDevice, &fontDesc, &pFont); if (FAILED(hResult)) { MessageBoxW(nullptr, L"Failed creating font", nullptr, 0); return false; } hResult = D3DX10CreateSprite(d3dDevice, sizeof(d3dDevice), &pSprite); if (FAILED(hResult)) { MessageBoxW(nullptr, L"Failed creating sprite", nullptr, 0); return false; } return true; } |
위와 같이 폰트 관련 설정을 초기화해줘야 함. DX9와의 차이점은 D3DX10CreateSprite를 이용해서 폰트 전용 Sprite를 가지고 있어야 한다는거…
그리고 아래와 같이 텍스트를 출력하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void DrawString() { /* 텍스트 출력 준비과정 */ RECT rect; SetRectEmpty(&rect); rect.left = 0; rect.right = CLIENT_WIDTH; rect.top = 0; rect.bottom = CLIENT_HEIGHT; pSprite->Begin(D3DX10_SPRITE_SAVE_STATE); // 최종 저장단계 및 텍스트 출력이 시작함을 알려줌 /* 텍스트 출력 */ if (!pFont->DrawTextW(nullptr, L"Si hoc legere scis nimium eruditionis habes.", -1, &rect, DT_CENTER | DT_TOP, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f))) { MessageBoxW(nullptr, L"Failed calling DrawTextW", nullptr, 0); } pSprite->End(); // 출력 끝남 } |
아래는 실행 결과 ㅎㅅㅎ
[참고 사이트]
참고로 ID3DXFONT 계열은 DirectX 11에서 없어졌슴당… 폰트를 직접 이미지 스프라이트로 만들어서 출력하는 방법밖에 없어보이네요 ㅠ