이 코드를 사용하면 OpenGL 응용 프로그램에서 고성능 텍스트를 렌더링 할 수 있습니다. 글꼴 렌더링 라이브러리는 사용하기 쉽고 성능을 염두에두고 설계되었습니다. 나는 ~ 2010 년에 그것을 작성하고 때때로 업데이트했습니다. 이 라이브러리에서 읽은 글꼴 파일은 BM 글꼴 생성기를 위해 개발 된 형식을 따릅니다 : http://angelcode.com/products/bmfont/. 글꼴 파일에는 텍스처 파일이 동반됩니다. 이 라이브러리는 표준 RGBA 텍스처뿐만 아니라 단일 채널 SDF 및 멀티 채널 SDF를 지원합니다.

계속 지켜봐주십시오.
글꼴 라이브러리는 다음 파일로 나뉩니다.
DrawString 함수 호출은 다음을 수행합니다. 문자열 → 구문 분석 문자열 → 쿼드 목록 생성 → vertex 버퍼 배열로 번역 -> 모든 텍스쳐 트라이니글을 그립니다. 구문 분석 중에, 드로우 할 끈은 현재 글꼴로 그리기 할 수없는 문자를 확인하면 숯이 물음표로 그려집니다. 문자열의 각 문자마다 쿼드가 생성되어 최종 쿼드리스트에 추가되며,이 쿼드에는 화면의 위치와 크기에 대한 정보 (2D, 직교!)와 비트 맵 글꼴 내의 한 문자에 대한 텍스처 좌표가 포함되어 있습니다. 쿼드의 위치는 문자열의 시작 위치와 이전 문자의 위치에 따라 다릅니다. 한 캐릭터의 간격과 다음 문자 사이의 구체적인 관계를 Kerning이라고합니다. 글꼴 구성 파일에는 해당 특정 글꼴에 대한 모든 커닝 정보가 포함 된 테이블이 포함되어 있습니다. 예를 들어, "A"가 "M"을 따라 가면 하나의 픽셀이어야하지만 "O"가 "M"을 따라 가면 하나의 픽셀 또는 0 픽셀을 마이너스합니다. 이 정보는 빠른 액세스를 위해 2 차원 배열로 내부적으로 저장됩니다. 이 그림을 충분히 빨리 만들기 위해 캐릭터 및 캐릭터 관계 (Kerning)에 대한 모든 정보와 텍스처가 프로그램 시작시로드됩니다. 각 렌더링 루프 반복에 정점 버퍼를 만들 필요가 없도록 텍스트를 저장할 수 있습니다.
라이브러리 작동 방식과 프로젝트에서이를 사용하는 방법을 확인하는 가장 쉬운 방법은이 리포지토리와 함께 제공되는 예제 구현을 확인하는 것입니다. 더 많은 정보가 필요한 경우이 장의 나머지 부분을 읽으십시오.
오버보기에 언급 된 10 개의 파일을 프로젝트 폴더에 복사해야합니다.
코드에서 렌더링 컨텍스트를 열기 전에 다음과 같은 글로벌 글꼴 라이브러리 객체를 만듭니다.
// load openGL fonts
m_fontLibrary = new CFontLibrary(<PathToFontFolder>);
if (!m_fontLibrary-> ParseAllFontsInFolder ())
return; // no fonts found!이것은 지정된 폴더에 입력 매개 변수로 저장된 모든 글꼴을로드합니다. 렌더링 컨텍스트가 만들어지면 텍스처가 다음과 같이로드되어야합니다.
// init font library from the current rendering context!
theApp.m_fontLibrary-> InitGLFonts ();예를 들어 해당 렌더링 컨텍스트의 한 번에이를 수행 할 수 있습니다. 이 라이브러리와 둘 이상의 컨텍스트 사이의 질감을 공유 할 수는 없습니다 (효율적인 방법이 없었기 때문에 일부 NVIDIA 카드 만 할 수 있고 일종의 유일한 방법이 있었기 때문에 구현하지 않았습니다). 따라서 각각의 새로운 렌더링 컨텍스트마다 이것을 호출해야합니다. 이 작업이 완료되면 글꼴 라이브러리를 사용할 준비가되므로 FontLibrary 객체에서 DrawString () 메소드를 호출 할 수 있습니다.
(참고 :이 장에서는 점검이 필요합니다. 대략적으로 수정되고 일부 기능 매개 변수가 누락되었지만 대부분 자기 설명이 필요합니다.) 드로우 호출의 헤더는 다음과 같습니다.
void DrawString ( const std::string& textToDraw, int x, int y, float color[ 4 ], const std::string& font, float scale = 1 . 0f );매개 변수는 아래 표에 설명되어 있습니다.
| 매개 변수 | 설명 |
|---|---|
| const std :: string & texttodraw | std :: 문자열로 그리는 문자열은 인식되지 않은 문자가 '?'로 그려집니다. 유효한 문자는 사용 된 글꼴에 따라 다르며 글꼴 비트 맵을 만들 때 정의 할 수 있습니다. |
| int x | 화면 좌표에서 문자열의 시작의 x- 위치. 0- 폭 |
| in y | 화면 좌표에서 문자열의 시작의 y-position. 0- 높이 |
| 플로트 컬러 [4] | 텍스처를 변조하는 데 사용될 색상 정보가 포함 된 플로트 어레이. 색상 정보는 다음 표준 순서에서 0.0에서 1.0 (포함)의 값입니다 : {r, g, b, alpha} 분명히 .. |
| Const STD :: String & Font | 이 매개 변수는 사용할 글꼴 유형을 정의합니다. 폴더에 있고 로딩 시간에있는 글꼴 유형 만 사용할 수 있습니다. 연장선이 없거나 더 많은 코드 가독성 및 안전을 위해 해당 글꼴의 파일 이름을 전달할 수 있습니다. FontLibrary.h 파일에서 정의를 사용하십시오. 참고 : 굵게 또는 이탤릭체를 인쇄하려면 설정 한 글꼴을 사용해야합니다. |
| 플로트 스케일 | RGBA 텍스처의 경우 기본값을 사용하는 것이 좋습니다 : 1.0f. 확장 또는 아래로 확장 할 수는 있지만 이것이 흐려질 것임이 분명해야합니다. 그러나 SDF 및 MSDF를 사용하면 아티팩트를보기 전에 더욱 크고 아래로 확장 할 수 있어야합니다. |
자동 라인 브레이크와 같은 추가 기능이있는 더 많은 기능이 있습니다. 글꼴 라이브러리 헤더 파일을 참조하십시오. 또한 10922 자 후에 그리기 할 문자열이 차단됩니다. 이상한 이유에 대해 더 많은 문자가 필요한 경우 추가 추첨 호출을 사용하고 문자열을 파트로 나누십시오.
이 장은 글꼴 라이브러리에 자신의 글꼴을 추가하는 것과 관련이 있습니다.
비 SDF 글꼴에 중점을 둡니다. SDF 글꼴의 단계는 상당히 유사하지만 BM-Font-Gen으로는 충분하지 않습니다. 여전히 해당 도구를 사용할 수 있지만 Imagemagick과 같은 도구로 게시물 처리 단계를 수행해야합니다. 아래 튜토리얼.
새로운 글꼴을 통합하는 데 3 단계 만 필요합니다. 1. BM-Font-Generator 2를 사용하여 글꼴 콘피드 및 글꼴 비트 맵 생성 2. 두 개의 결과 파일을 글꼴 폴더에 복사하십시오.
다음 섹션에서는 BM-Font Generator의 사용에 대해 자세히 설명하지만 먼저 몇 가지 메모가 있습니다. 생산하는 각 글꼴 파일에는 고정 크기의 글꼴 만 포함되어 있으며, 대담한 또는 이탤릭체 등의 덩어리 등의 원활한 수, 글꼴의 부드러움 등이 파일에 의해 이미 정의되어 있습니다.이 문제는 다음 섹션에서 더 명확 해집니다.
실제 글꼴 비트 맵뿐만 아니라 글꼴 콘피드를 생성하기 위해 AngelCode의 "Bitmap Font Generator"를 사용합니다. 웹 사이트에서 얻을 수 있습니다 : http://angelcode.com/products/bmfont/ 설치 후 프로그램을 열면 다음 그림과 같습니다.

첫 번째 단계로, 옵션 → 글꼴 설정을 클릭하거나 다음 그림에서 볼 수 있듯이 새 창을 열어 [f]를 치는 것을 클릭하여 글꼴 설정을 열십시오.

이 설정을 마친 후 글꼴 설정 창을 닫고 다음 단계로 진행하십시오.
프로그램의 기본 창으로 돌아가서 포함하려는 문자 세트를 선택할 수 있습니다. 전체 세트를 선택하거나 세트의 특정 문자 만 선택할 수 있습니다. 예를 들어 다음 그림을 참조하십시오.

기본적으로 사용 할 가능성이있는 문자 만 선택하면 처리 시간과 대부분의 메모리가 하나뿐만 아니라 훨씬 더 많은 (커닝, 비트 맵 크기, 코드의 배열 크기 등)를 절약합니다. 모든 문자를 선택한 후에는 글꼴이 포함되어야합니다. 다음 섹션으로 진행하십시오.
이제 글꼴을 비트 맵으로 내보내고 구성 파일을 작성해야합니다. 내보내기 옵션을 엽니 다 [t] 또는 클릭 옵션 → 내보내기 옵션을 엽니 다. 새로운 창이 다음 그림과 같이 나타나야합니다.

이 설정이 완료되면 창을 닫고 다음 단계로 진행하십시오.
텍스처가 너무 크거나 작지 않도록 메인 창에 [V]를 누르거나 옵션 → 시각화를 클릭하십시오. 창 제목에 "미리보기 1/1"이외의 것을 말하면 모든 캐릭터에 대해 질감이 너무 작으며 프로그램이 하나 이상의 비트 맵을 생성합니다. 이 경우 내보내기 옵션을 열고 텍스처 크기를 늘리십시오. 참고 : 더 이상 제곱 또는 2의 힘 일 필요는 없습니다. 이것은 OpenGL 버전 1에만 있었다. 그러나 일부 텍스처 관련 기능이 여전히 최적화 될 수 있기 때문에 여전히 그렇게하는 것이 좋습니다. Fontlibrary는 의도적으로 하나 이상의 "페이지"또는 질감을 처리하지 않습니다. 이것은 한 번의 드로우 스트링 호출 중에 텍스처를 바인딩/풀어주는 것을 의미합니다. 따라서 정확히 한 페이지로 만드십시오. 반면에 캐릭터가 비트 맵의 일부만 채우는 것을 보면 가능한 경우 텍스처 크기를 줄이지 만 다른 방법만큼 중요하지 않습니다. 텍스처 공간 사용에 만족하면 다음 단계로 진행하십시오.
이제 모든 설정이 이루어지면 글꼴을 내보낼 시간입니다. 옵션 → 비트 맵 글로 저장을 클릭하십시오. 여기에 지정한 파일 이름은 글꼴 라이브러리의 글꼴 이름에 영향을 미치므로 현명하게 선택하십시오. 편의성과 가독성 이유로 다음과 같은 명명 규칙을 제안합니다.
< 이탈리아? > <bold> <_ 윤곽이 있습니까? 크기?>
몇 가지 예는 다음과 같습니다.
프로세스를 완료하려면 저장을 누르십시오. 지금해야 할 일은 해당 글꼴의 두 파일을 소프트웨어의 글꼴 폴더에 복사하는 것입니다. 다른 도구를 사용하여 TGA를 PNG로 변환 할 수 있습니다. FNT 파일의 파일 확장자를 올바르게 변경하십시오.
이것은 3 단계 프로세스입니다.
먼저 위에서 설명한대로 BMFONT 생성기를 사용하십시오. 그러나 이전에 사용한 것과 다른 다음 설정을 사용하십시오.
마지막으로, Imagemagick (https://imagemagick.org/index.php) 또는 유사한 도구를 사용하여 텍스처 파일을 SDF로 변환해야합니다. imageMagick이 설치되면 명령 줄에서 다음을 실행하면 (예제는 Windows Power Shell 용이지만 UNIX와 매우 유사합니다) :
magick convert --% Arial400_0.tga -filter Jinc ( +clone -negate -morphology Distance Euclidean -level 50%,-50% ) -morphology Distance Euclidean -compose Plus -composite -level 45%,55% -resize 25% Arial400_0.png
다음으로 FNT 파일을 편집해야합니다. Chars 정의 전에 FNT 헤더 내 손에 다음을 추가하십시오.
fieldType=sdf
이 글꼴 이이 글꼴을 사용할 때 글꼴 Lib에 단일 채널 SDF 셰이더를 사용하도록 지시합니다.
멀티 채널 SDF의 경우 BM 글꼴 생성기를 사용할 수 없습니다. 설치되면 명령 줄에서 다음을 실행하십시오.
msdf-bmfont -o multisdf.png cour.ttf
CommandLine을 통해 글꼴 크기 및 기타 매개 변수를 제공 할 수 있습니다.
이것은 선택 사항입니다 : fontlibrary에 추가하는 각 새 글꼴에 대해 정의하십시오.
// font type defines, string must match the filename without extension in your fonts folder!
# define GLFONT_COURIER42_MSDF " Courier42_msdf "
# define GLFONT_ARIAL20 " Arial20 "
# define GLFONT_DINNEXTLTPROMED_SDF " DINNextLTProMED_SDF ".. 여기에 자신의 정의를 추가하십시오!