OpenGL的文字顯示問題? |
尚未結案
|
openwagon
一般會員 發表:2 回覆:3 積分:1 註冊:2004-06-23 發送簡訊給我 |
|
yangkissktop
一般會員 發表:13 回覆:29 積分:8 註冊:2003-10-25 發送簡訊給我 |
這是我六年前寫的程式片段, 將它重點整理貼出, 希望對您有幫助 :
(不懂得地方可查msdn相關說明,廠商催的緊,好多天沒睡好,頭昏腦脹,細節全忘了,可能無法回答後續細節,服務品質不好尚祈海涵< >< >< >< >)
(方法1) 二維對映字型 2D Bitmap Font 位元對映字型有以下限制: 1. 純平面影像、無厚度 2. 無法3D平移、旋轉 3. 只能在2D視埠平移或斜印 HFONT myFn; ///// 建立字型 ///// displayList = glGenLists( NUMBER ); myFn = CreateFont( // 傳回值:非0為成功,0為失敗 -16, // 字高度: >0為cell高,=0預設值,<0為character高 0, // 字寬度: 平均字寬(邏輯單位),=0寬高比自動選配 0, // 字角度: 以0.1度計算 0, // 行角度: 以0.1度計算 FW_BOLD, // 粗黑度: 0~1000或FW_(DONTCARE,THIN,LIGHT,NORMAL,SEMIBOLD,BLACK) false, // 斜體 : 或true false, // 底線 : 或true false, // 刪除 : 或true ANSI_CHARSET, // 字元集 : 或(DEFAULT,SYMBOL,CHINESEBIG5,OEM)_CHARSET OUT_TT_PRECIS, // 輸出精度: 或OUT_(DEFAULT,DEVICE,RASTER,CHARACTER)_PRECIS CLIP_DEFAULT_PRECIS, // 裁剪精度: 或CLIP_(ENCAPSULATE,TT_ALWAYS,CHARACTER)_PRECIS ANTIALIASED_QUALITY, // 輸出精度: 或(NONANTIALIASED,DEFAULT,DRAFT,PROOF)_QUALITY FF_DONTCARE | DEFAULT_PITCH, // 家族,節距: 或FF_(DECORATIVE,MODERN,ROMAN,SCRIPT|VARIABLE,FIXED)_PITCH "Courier New"); // 字型名稱 SelectObject(myDc, myFn); wglUseFontBitmaps(myDc, FIRST, NUMBER, displayList); .... .... .... void TForm1::FormPaint(TObject *Sender) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glPushAttrib( GL_LIST_BIT ); //防止glListBase感染其他顯示串列 glListBase(displayList - FIRST); glColor3f(1, 0, 0); glRasterPos2f(-1, 0); glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); glColor3f(0, 1, 0); glRasterPos2f(-1, -0.5); glCallLists(strlen(text2), GL_UNSIGNED_BYTE, text2); glPopAttrib(); glFlush(); SwapBuffers( myDc ); } void __fastcall TForm1::FormDestroy(TObject *Sender) { wglMakeCurrent(NULL, NULL); wglDeleteContext( myRc ); glDeleteLists(displayList, NUMBER); } (方法2) 三維輪廓字型 3D Outline Font HFONT myFn; .... .... GLYPHMETRICSFLOAT gmf[NUMBER]; .... .... displayList = glGenLists( NUMBER ); myFn = CreateFont( // 傳回值:非0為成功,0為失敗 -16, // 字高度 : >0為cell高,=0預設值,<0為character高 0, // 字寬度 : 平均字寬(邏輯單位),=0寬高比自動選配 0, // 字角度 : 以0.1度計算 0, // 行角度 : 以0.1度計算 FW_BOLD, // 粗黑度 : 0~1000或FW_(DONTCARE,THIN,LIGHT,NORMAL,SEMIBOLD,BLACK) false, // 斜體 : 或true false, // 底線 : 或true false, // 刪除 : 或true ANSI_CHARSET, // 字元集 : 或(DEFAULT,SYMBOL,CHINESEBIG5,OEM)_CHARSET OUT_TT_PRECIS, // 輸出精度: 或OUT_(DEFAULT,DEVICE,RASTER,CHARACTER)_PRECIS CLIP_DEFAULT_PRECIS, // 裁剪精度: 或CLIP_(ENCAPSULATE,TT_ALWAYS,CHARACTER)_PRECIS ANTIALIASED_QUALITY, // 輸出精度: 或(NONANTIALIASED,DEFAULT,DRAFT,PROOF)_QUALITY FF_DONTCARE | DEFAULT_PITCH, // 家族,節距: 或FF_(DECORATIVE,MODERN,ROMAN,SCRIPT|VARIABLE,FIXED)_PITCH "Comic Sans MS"); // 字型名稱 SelectObject(myDc, myFn); wglUseFontOutlines(myDc, FIRST, NUMBER, displayList, 0.0, THICK, WGL_FONT_POLYGONS, gmf); .... .... glPushAttrib( GL_LIST_BIT ); glListBase(displayList - FIRST); glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); glPopAttrib(); (方法3)輪廓字型貼圖 Texture Mapping Outline Font HFONT myFn; .... .... GLuint displayList; GLuint id[1]; .... .... displayList = glGenLists( NUMBER ); myFn = CreateFont( // 傳回值 -16,0, // 字高度,字寬度 0,0, // 字角度,行角度 FW_BOLD, // 粗黑度 false,false,false, // 斜體,底線,刪除 ANSI_CHARSET, // 字元集 OUT_TT_PRECIS, // 輸出精度 CLIP_DEFAULT_PRECIS, // 裁剪精度 ANTIALIASED_QUALITY, // 輸出精度 FF_DONTCARE | DEFAULT_PITCH,// 家族,節距 "Comic Sans MS"); // 字型名稱 SelectObject(myDc, myFn); //貼圖考量之曲面誤差 wglUseFontOutlines(myDc, FIRST, NUMBER, displayList, 0.1, THICK, WGL_FONT_POLYGONS, gmf); ///// 載入貼圖 ///// AUX_RGBImageRec *tex; tex = auxDIBImageLoad( "coord.bmp" ); glGenTextures(1, id); glBindTexture(GL_TEXTURE_2D, id[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR_MIPMAP_NEAREST); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, tex->sizeX, tex->sizeY, GL_RGB, GL_UNSIGNED_BYTE, tex->data); glEnable( GL_TEXTURE_2D ); ///// 建立貼圖座標s,t ///// glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glEnable( GL_TEXTURE_GEN_S ); glEnable( GL_TEXTURE_GEN_T ); void TForm1::FormPaint(TObject *Sender) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0, 0, -3); glRotatef(xRot, 1,0,0); glRotatef(yRot, 0,1,0); glTranslatef(-1, 0, 0); glPushAttrib( GL_LIST_BIT ); glListBase(displayList - FIRST); glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); glPopAttrib(); glFlush(); SwapBuffers( myDc ); }yangkissktop
------
yangkissktop |
openwagon
一般會員 發表:2 回覆:3 積分:1 註冊:2004-06-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |