• <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 哈哈 閱讀(3767) 評論(2)  編輯 收藏 引用

            評論:
            # re: 請教:OpenGl中的文字顯示 2007-05-25 22:20 | shpb
            可以顯示  回復  更多評論
              
            # re: 請教:OpenGl中的文字顯示 2007-05-26 21:17 | pengkuny
            可以嗎?怎么應用,在什么環境下應用
            望shpb賜教  回復  更多評論
              
            精品久久人人做人人爽综合| 日产精品久久久久久久性色| 日韩欧美亚洲国产精品字幕久久久 | 亚洲乱码日产精品a级毛片久久 | 久久夜色精品国产噜噜亚洲a | 国产毛片久久久久久国产毛片| 老司机午夜网站国内精品久久久久久久久 | 97久久精品人人澡人人爽| 伊人久久大香线蕉无码麻豆| 狠狠色丁香久久综合婷婷| 午夜福利91久久福利| 久久er国产精品免费观看2| 东方aⅴ免费观看久久av| 久久久久国产一级毛片高清板 | 久久婷婷五月综合成人D啪| 69久久精品无码一区二区| 久久中文字幕人妻丝袜| 久久男人中文字幕资源站| 久久精品国产精品青草| 久久亚洲AV成人无码国产 | 欧美午夜A∨大片久久| 99久久免费国产特黄| 久久久噜噜噜久久中文福利| 久久婷婷五月综合国产尤物app| 久久久精品无码专区不卡| 色综合久久天天综合| 国产精品久久久久影视不卡| 国产麻豆精品久久一二三| 久久久久久国产精品免费无码| 伊人久久大香线蕉亚洲| 国产色综合久久无码有码| 99精品久久精品一区二区| 亚洲色婷婷综合久久| 国产成人精品综合久久久久| 亚洲va久久久噜噜噜久久狠狠 | 国内精品久久国产大陆| 久久国产精品久久| 国产精品美女久久久免费| 久久精品国产只有精品66| 国内精品伊人久久久久影院对白| 国产精品美女久久久免费|