全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3499
推到 Plurk!
推到 Facebook!

OpenGL的文字顯示問題?

尚未結案
openwagon
一般會員


發表:2
回覆:3
積分:1
註冊:2004-06-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-02 20:02:26 IP:211.23.xxx.xxx 未訂閱
請問一個openGL的問題,我使用openGL畫一個3D圖形, 想在圖形上註解以些文字,可是openGL好像沒有這一類的函式庫, 是不是要自己用程式畫出字型?麻煩各位,謝謝!
yangkissktop
一般會員


發表:13
回覆:29
積分:8
註冊:2003-10-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-05 20:36:41 IP:221.169.xxx.xxx 未訂閱
這是我六年前寫的程式片段, 將它重點整理貼出, 希望對您有幫助 : (不懂得地方可查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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-09 23:14:36 IP:140.128.xxx.xxx 未訂閱
感謝這位大大,目前已經解決此一問題了!
系統時間:2024-06-29 17:03:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!