游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3722|回复: 6

OPENGL中的汉字显示问题

[复制链接]

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
发表于 2004-6-5 11:04:00 | 显示全部楼层 |阅读模式
如何在OPENGL中显示汉字?不使用GDI。。。

29

主题

178

帖子

187

积分

注册会员

Rank: 2

积分
187
QQ
发表于 2004-6-5 12:36:00 | 显示全部楼层

Re:OPENGL中的汉字显示问题

我也不会。以前用显示列表显示Arial字体的英文字母和数字,中文的没试过,是不是要设置支持中文的字体啊,像宋体字体?不过用显示列表恐怕站用很大空间,因为中文字数太多了……不知道如何解决了。
关注ing

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
 楼主| 发表于 2004-6-5 15:20:00 | 显示全部楼层

Re:OPENGL中的汉字显示问题

是的。显示列表做死你。要么列表动态生成和删除?效率很低啊。听说可以使用TRUE TYPE字体解决?不知道怎么弄。。。。。。

29

主题

178

帖子

187

积分

注册会员

Rank: 2

积分
187
QQ
发表于 2004-6-9 21:23:00 | 显示全部楼层

Re:OPENGL中的汉字显示问题

我知道了,用google搜索“OpenGL显示汉字”

0

主题

6

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2004-6-10 14:49:00 | 显示全部楼层

Re:OPENGL中的汉字显示问题

可以用 FreeType库来读取TrueType字体,然后自己渲染出来。

3

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2004-6-11 12:51:00 | 显示全部楼层

Re:OPENGL中的汉字显示问题

class CFont
{
public:       
        CFont();
        ~CFont();
        void Die();

        //中文字符支持
        void CreateChineseFont(HWND hWnd,HDC hdc,char * fontname,unsigned int fontSize, bool bold);
                void CreateTrueTypeTexture( char* filename );
        void CreateTrueType(char *fontname                        = "Verdana",
                unsigned int fontSize        = 16,               
                bool bold                                = false,               
                bool italic                                = false,               
                bool underline                        = false,       
                bool strikeout                        = false,       
                bool antialiased                = true );       
    //输出函数
        void Print( int x, int y, float size, const char* text,... );
        void Print( float x, float y, float size, const char* text,... );
    void PrintW(const char* text);
       
        void SetHorizontalAligment( FontAligment aligment );       
        void SetVerticalAligment( FontAligment aligment );       
        void SetPosition( FontPosition position );
        int GetLength( char* line );        // length
        CTexture texture;                       
        int fontheight;                       
private:
        GLuint fontList;                               
        FontPosition position;                       
        FontAligment horizonatlAligment;       
        FontAligment verticalAligment;       
        int charWidth[256];           //保存每个字符宽度的数组               
        bool loaded;
        //为支持中文字符
//#ifdef _CHINESE
        HDC m_hDC;
        HFONT m_hFont;
        bool m_bUnicode;
        GLYPHMETRICSFLOAT gmf[256];
        map<DWORD,WORD> m_fontMap;
        valarray<WORD>  chTable;
//#endif
};



void CFont::CreateChineseFont(HWND hWnd,HDC hdc,char *fontname, unsigned int fontSize, bool bold)
{
    Zero_log.Add(" - Try to Support UNICODE  fonts from %s\n", fontname);
        if (!IsDBCSLeadByte(fontname[0])){//UNICODE
                m_bUnicode=false;
                Zero_log.Warning("Is't Unicode font name!!");
                return;
        }
        chTable.resize(256);
        m_fontMap.clear();
        m_bUnicode=true;
        int        x, y;                                                                                       
        unsigned int fontPadding = 2;               
        fontSize += 2;                                                                       
       
    //m_hDC=hdc;
        m_hDC=GetDC(hWnd);
    if((fontList=glGenLists( 256 ))==0)
        {
                Zero_log.Error("Cannot Gen dl\n");
                return;
        }
   
    LOGFONT lf;       
        memset( &lf, 0, sizeof(LOGFONT) );       
        lf.lfEscapement = lf.lfOrientation = 0;
        lf.lfWeight = bold?FW_BOLD:FW_NORMAL;
        lf.lfCharSet =  GB2312_CHARSET;
        lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
        lf.lfQuality=DEFAULT_QUALITY;  //ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY
        lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
        strcpy( lf.lfFaceName, LPCTSTR(fontname) );
        lf.lfHeight=-10;
        lf.lfWidth=0;
    m_hFont=CreateFontIndirect(&lf);
       
        if ( m_hFont == NULL )
        {                                       
                Zero_log.Error("Cannot create font object\n");       
                ReleaseDC( hWnd, m_hDC );                                               
                return;
        }
    SelectObject( m_hDC, m_hFont );
        wglUseFontBitmaps(m_hDC, 0, 256, fontList);
}

void CFont:rintW(const char *text)
{
    GLsizei size =MultiByteToWideChar(CP_ACP,0,LPCSTR(text),-1,NULL,0);
        int i=0,j=0;
        while(i<strlen(text))
        {
                DWORD dwChar=text;
                if (IsDBCSLeadByte(text)){
                        dwChar= (dwChar<<8) + text[i+1]+256;  //256 offset of chinese char
                        i+=2;
                }
                else{
                        dwChar=text;
                        i++;
                }

                //
                if(m_fontMap.find(dwChar)==m_fontMap.end())//未找到
                {       
                        wglUseFontOutlines(m_hDC, dwChar, 1, fontList+m_fontMap.size(),                
                                0.2f, 0.0f,        WGL_FONT_POLYGONS,         &gmf[m_fontMap.size()]);
                        m_fontMap[dwChar]=m_fontMap.size();
                        if(m_fontMap.size()>256)
                        {
                                return;
                        }
                }
                chTable[j++]= m_fontMap[dwChar];
        }
        glListBase(fontList);
        glCallLists(size, GL_UNSIGNED_SHORT , (const GLvoid*)&chTable[0]);
        glPopMatrix();
}

3

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2004-6-11 12:53:00 | 显示全部楼层

Re:OPENGL中的汉字显示问题

效率极其低下!!!
质量更不用说!!!

tureType 还在思考中....
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-1 19:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表