Program Language/OpenGL

[OpenGL] 비트맵 폰트 갱신

야곰야곰+책벌레 2021. 12. 8. 11:11
728x90
반응형

OpenGL을 사용하여 텍스트를 랜더링 할 때 Bitmap 방식을 사용하면 설정을 갱신해야 한다. wglMakeCurrent()로 갱신을 시도해보려 했지만 갱신이 되질 않았다. 한 번의 Refresh가 이뤄진 다음에야 제대로 그려졌다. 그러는 와중에 텍스트가 종류 별로 표시가 되는지 확인하려고 여러 개를 표시하니 첫 번째 텍스트만 표시되지 않았다.

작은 MOTION PTP 밑에 조금 더 큰 MOTION PTP라는 글자가 와야 하지만 생기지 않았다. 화면이 Redrawing 하면 생겨나게 된다. 그래서 wglUseFontBitmaps()를 두 번 호출하니 제대로 동작하였다. 성능에 얼마나 영향을 미칠지는 모르겠지만 갱신하는 법을 알 수 없으니 이 방법을 사용해야겠다. 전체를 새롭게 그리는 것보다 나을 듯하다.

typedef struct GLFONT_T
{
	GLuint fontList;
	HFONT  hFont;
} GLFont;

GLFont GLCreateFont(const wchar_t* font_name, LONG font_height)
{
	LOGFONT logfont;

	logfont.lfHeight = font_height;
	logfont.lfWidth = 0;
	logfont.lfEscapement = 0;
	logfont.lfOrientation = 0;
	logfont.lfWeight = FW_BOLD;
	logfont.lfItalic = FALSE;
	logfont.lfUnderline = FALSE;
	logfont.lfStrikeOut = FALSE;
	logfont.lfCharSet = HANGUL_CHARSET;
	logfont.lfOutPrecision = OUT_TT_PRECIS;
	logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	logfont.lfQuality = ANTIALIASED_QUALITY;
	logfont.lfPitchAndFamily = FF_DONTCARE | DEFAULT_PITCH;
	wcscpy_s(logfont.lfFaceName, _countof(logfont.lfFaceName), font_name);

	HDC   hdc = wglGetCurrentDC();
	HGLRC hrc = wglGetCurrentContext();

	GLFont glfont;
	glfont.fontList = glGenLists(256);

	HFONT hFont = CreateFontIndirect(&logfont);
	glfont.hFont = (HFONT)SelectObject(hdc, hFont);
	wglUseFontBitmaps(hdc, 32, 96, glfont.fontList);
	wglUseFontBitmaps(hdc, 32, 96, glfont.fontList); // 두번 호출하면 갱신됨
	SelectObject(hdc, glfont.hFont);
	DeleteObject(hFont);
	return glfont;
}

void GLDeleteFont(const GLFont& glfont)
{
	glDeleteLists(glfont.fontList, 256);
}

사용 코드

	glRasterPos2f(position.x, position.y - 160);
	GLFont glfont = GLCreateFont(L"tahoma", 100);
	GLPrint(L"MOTION PTP");
	GLDeleteFont(glfont);
728x90
반응형

'Program Language > OpenGL' 카테고리의 다른 글

[OpenGL] 텍스트의 검은 배경 없애기  (0) 2022.08.31
[OpenGL] GLAD 설치하기  (0) 2022.08.29