之前一直使用Windows自帶字體輸出文本,但只限2D的『位圖字體』.在Windows下有獨有輪廓字體函式.讓文本具有一定的厚度.讓所有的Windows字體轉換成3D字體.演示程式可輸入英文字符,下載程式:
1.存儲輪廓字體位置和方向,生成256個GLYPHMETRICSFLOAT變量
GLYPHMETRICSFLOAT gmf[256];
2.創建大小為256個字符的顯示列表,對所有256個ASCII碼支持.
UINT base;// 顯示列表的BASE ID
base = glGenLists(256);
3.創建字體句柄
HFONT font;
font=CreateFont(1,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,NTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,”Arial”);
4.為字體選擇設備環境
SelectObject(hDC,font);
5.創建3D輪廓字體,每個ASCII對應一個輪廓字體
wglUseFontOutlines(hDC,0,256,base,0.0f,FONT3D_DEPTH,WGL_FONT_POLYGONS,gmf);
6.複製當前矩陣並壓棧
glPushMatrix();
7.將文本定位於場景空間的中央.計算文本的長度
length = (int)strlen(text);
for(int i=0;i<length; ++i)
{
char c = text[i];
width = width + gmf[c].gmfCellIncX;
if(gmf[c].gmfCellIncX > height )
height = gmf[c].gmfCellIncX;
}
8.設定文本座標
glTranslatef(posX – (width0.1f)/2.0f,posY – (height0.1f)/2.0f ,posZ + (FONT3D_DEPTH*0.1f)/2.0f);
9.顯示列表屬性壓棧
glPushAttrib(GL_LIST_BIT);
10.載入顯示列表ID
glListBase(base);
11.渲染文本
glCallLists((int)strlen(text),GL_UNSIGNED_BYTE,text);
12.顯示列表屬性出棧
glPopAttrib();