• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

                   OpenGl下可以方便的操作字符,但是對字符串顯示的支持不夠.OpenGL本身不提供文字的顯示和處理能力,如要顯示文字的借助于第三方的擴展程序。初涉OpenGl, 想請教有什么好的方法可以解決這個問題?網上覓得bluebohe三年前的一篇文章, 在vs2005下實現他的代碼, 編譯通過了, 但是結果顯示不出來. 可否幫忙看看? COpenGLText源碼
            bluebohe的原文:
                  一直以來,OpenGL狀態下的文字顯示都是一個問題,本文使用嵌套顯示列表的方式進行OpenGL狀態下的字符串的顯示。
                 有以下幾點需要注意:

                 1:本程序顯示按照給定的高度和文字的位置顯示某一種字體的文字,其中一些字體的參數定義在OpenGLText內部給定,可以隨意將它抽出來。如果將代碼用于實際應用中,建議文字的文字間距自己設定,也可以隨意添加文字的傾斜角、旋轉角度、定位方式等等參數。

                 2:wglUseFontOutlines函數的第五個參數表示文字的精度(弦偏差),一般設置成零,但這樣缺省的做法會導致文字太粗糙,可以將它設置成一個比較小的數,以提高文字顯示的精確度,但這樣會增加內存的占用量。

                 3:如果文字的高度比較小,文字的線條可能會出現斷裂的現象,影響美觀,解決這類問題有以下幾種方式:(1)使用OpenGL反走樣技術;(2)把文字的輪廓用線條勾勒出來;(3)在文字的Draw成員函數中多次調用glCallList函數,每次調用向周圍平移一個像素,這樣的話會使文字的線條斷裂問題大為改觀,速度也是三種方式中最快的。

            應用方式如下:

                     COpenGLText text;
                     COpenGLText text2;

                     text2.m_dX=0;
                     text2.m_dY=200;

                     glLoadIdentity(); 
                     glClear(GL_COLOR_BUFFER_BIT); 
                     glColor4f(0.0f, 0.0f, 1.0f, 1.0f);

                     text.Draw("宋體");
                     text2.Draw("楷體_GB2312");

                     glFlush();

            類的聲明和實現如下:

              1#include <string>
              2#include <GL/glut.h>
              3
              4using namespace std;
              5
              6class COpenGLText  
              7{
              8public:
              9
             10    //構造文字
             11    COpenGLText();
             12    virtual ~COpenGLText();
             13
             14    //繪制制定字體的文字,字體只在第一次繪制時進行設置,之后可以傳入空值
             15    void Draw(char *strFontName);
             16
             17    //釋放文字所占空間
             18    void Free();
             19    //文字字符串
             20    string m_str;
             21    //字符串高度
             22    double m_dHeight;
             23    //字符串位置
             24    double m_dX;
             25    double m_dY;
             26
             27protected:
             28    BOOL GenList();
             29    BOOL GenCharsLists(char *strFontName);
             30    int m_iDisplayList;
             31}
            ;
             32
             33//////////////////////////////////////////////////////////////////////
             34
             35// COpenGLText Class
             36
             37//////////////////////////////////////////////////////////////////////
             38
             39//////////////////////////////////////////////////////////////////////

             40
             41// Construction/Destruction
             42
             43//////////////////////////////////////////////////////////////////////
             44
             45COpenGLText::COpenGLText()
             46{
             47    m_dX=0;
             48    m_dY=0;
             49    m_str="abc中國";
             50    m_dHeight=100;
             51    m_iDisplayList=0;
             52}

             53
             54COpenGLText::~COpenGLText()
             55{
             56    Free();
             57}

             58
             59BOOL COpenGLText::GenCharsLists(char *strFontName)
             60{
             61    HDC hdc;
             62    const char *str=m_str.c_str()
             63    hdc=CreateDC( "DISPLAY""""", NULL );
             64    int iNum=_mbslen((const unsigned char *)str);
             65
             66    m_iDisplayList=glGenLists(iNum+1);     
             67    HFONT hNewCFont;
             68    LOGFONT CLogFont; //存儲當前字體參數
             69
             70    //初始化字體參數
             71
             72    memset( &CLogFont, 0sizeof(LOGFONT) );     
             73    CLogFont.lfEscapement = CLogFont.lfOrientation = 0;
             74    CLogFont.lfWeight = FW_NORMAL;
             75    CLogFont.lfCharSet =  GB2312_CHARSET;
             76    CLogFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
             77    CLogFont.lfQuality=DEFAULT_QUALITY;
             78    CLogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
             79    strcpy( CLogFont.lfFaceName, LPCTSTR(strFontName) );
             80    CLogFont.lfHeight=-10;
             81    CLogFont.lfWidth=0;     
             82
             83    hNewCFont=CreateFontIndirect(&CLogFont);
             84    HFONT hOldFont=(HFONT)SelectObject(hdc,hNewCFont);
             85
             86    int i=0,j=0,iTotal=strlen(str);;
             87    UINT nChar=0;
             88
             89    while(i<iTotal)
             90    {
             91        j++;
             92
             93        if(IsDBCSLeadByte(str[i]))
             94        {
             95            nChar=((unsigned char)str[i])*0x100+(unsigned char)str[i+1];
             96            i+=2;
             97        }

             98        else
             99        {
            100            nChar=str[i];
            101            i++;
            102
            103        }

            104        GLYPHMETRICSFLOAT agmf[1];
            105        BOOL bOK=wglUseFontOutlines(hdc,nChar,1,m_iDisplayList+j,0.002f,0,WGL_FONT_POLYGONS,agmf);
            106
            107    }

            108
            109    SelectObject(hdc,hOldFont);
            110    DeleteObject(hNewCFont);
            111    DeleteDC(hdc);
            112
            113    return TRUE;
            114
            115}

            116
            117BOOL COpenGLText::GenList()
            118{
            119    int iNum=_mbslen((const unsigned char *)m_str.c_str());
            120    glNewList( m_iDisplayList, GL_COMPILE);
            121
            122    for(int i=1;i<=iNum;i++)
            123    {
            124
            125        glPushMatrix();
            126
            127        //此處修改文字間距
            128
            129        glTranslated(m_dX+m_dHeight*(i-1),m_dY,0);
            130
            131        glScaled(m_dHeight,m_dHeight,1);
            132
            133        glCallList(m_iDisplayList+i);
            134
            135        glPopMatrix();
            136
            137    }

            138    glEndList();
            139
            140    return TRUE;
            141}

            142
            143void COpenGLText::Free()
            144{
            145    if(glIsList(m_iDisplayList))
            146        glDeleteLists(m_iDisplayList,_mbslen((const unsigned char *)m_str.c_str())+1);
            147    m_iDisplayList=0;
            148}
             
            149
            150void COpenGLText::Draw(char *strFontName)
            151{
            152    if(!glIsList(m_iDisplayList))
            153    {
            154        GenCharsLists(strFontName);
            155        GenList();
            156    }

            157    glCallList(m_iDisplayList);
            158}

            159
            posted on 2007-04-12 15:26 哈哈 閱讀(3755) 評論(2)  編輯 收藏 引用

            評論:
            # re: 請教:OpenGl中的文字顯示 2007-05-25 22:20 | shpb
            可以顯示  回復  更多評論
              
            # re: 請教:OpenGl中的文字顯示 2007-05-26 21:17 | pengkuny
            可以嗎?怎么應用,在什么環境下應用
            望shpb賜教  回復  更多評論
              
            久久精品无码一区二区WWW| 亚洲精品无码久久久影院相关影片| 91精品国产91热久久久久福利| 久久av高潮av无码av喷吹| 日韩亚洲国产综合久久久| 精品伊人久久大线蕉色首页| 国产一区二区三区久久精品| 伊人久久大香线蕉综合网站| 久久精品夜夜夜夜夜久久| 久久久久国色AV免费看图片| 久久国产精品成人影院| 亚洲人成电影网站久久| 麻豆精品久久精品色综合| 伊人久久大香线蕉AV色婷婷色| 国产福利电影一区二区三区,免费久久久久久久精 | 狠狠色综合久久久久尤物| 99久久精品国产一区二区| 久久国产精品视频| 成人国内精品久久久久一区| 婷婷久久综合九色综合绿巨人| 欧美激情精品久久久久| 久久久久99精品成人片试看| 国产精品99久久久精品无码 | 四虎国产精品免费久久| 办公室久久精品| 久久99中文字幕久久| 亚洲AV无码久久精品成人| 久久综合伊人77777麻豆| 国产伊人久久| 久久e热在这里只有国产中文精品99| 99久久精品午夜一区二区| 亚洲午夜久久久久久噜噜噜| 国产精品久久久久久五月尺| 久久夜色精品国产| 日日狠狠久久偷偷色综合96蜜桃| 久久亚洲国产午夜精品理论片| 久久国产精品77777| 国内精品久久久久影院日本| 久久久久久久久久久久中文字幕 | 久久久免费观成人影院| 久久国产成人午夜aⅴ影院|