精华内容
下载资源
问答
  • 使用freetype于opengl显示汉字 改编的东西 :)
  • OpenGL显示文字--显示汉字

    千次阅读 2017-05-10 09:45:03
    OpenGL显示文字--显示汉字   原则上,显示中文和显示英文并无不同,同样是把要显示的字符做成显示列表,然后进行调用。 但是有一个问题,英文字母很少,最多只有几百个,为每个字母创建一个显示列表,没有...

    OpenGL显示文字--显示汉字

       

    原则上,显示中文和显示英文并无不同,同样是把要显示的字符做成显示列表,然后进行调用。
    但是有一个问题,英文字母很少,最多只有几百个,为每个字母创建一个显示列表,没有问题。但是汉字有非常多个,如果每个汉字都产生一个显示列表,这是不切实际的。
    我们不能在初始化时就为每个字符建立一个显示列表,那就只有在每次绘制字符时创建它了。当我们需要绘制一个字符时,创建对应的显示列表,等绘制完毕后,再将它销毁。
    这里还经常涉及到中文乱码的问题,我对这个问题也不甚了解,但是网上流传的版本中,使用了MultiByteToWideChar这个函数的,基本上都没有出现乱码,所以我也准备用这个函数:)

    这里我略知一二:也就是说中文占两个字符,英文占一个字符,当然把两个字符的东西放到一个字符的空间里面会产生截断咯,自然不能正常显示。

    不过解决办法也不是只有一种,还有一个方法我在后面的文章中会说到。
    通常我们在C语言里面使用的字符串,如果中英文混合的话,例如“this is 中文字符.”,则英文字符只占用一个字节,而中文字符则占用两个字节。用MultiByteToWideChar函数,可以转化为所有的字符都占两个字节(同时解决了前面所说的乱码问题:))。

    (注:这里会有另一个问题:对于英文字符来说也用两个字节会造成不必要的空间浪费,我们理想的状态应该是英文只用一个字节,汉字用两个(这是不是可以实现呢?))
    转化的代码如下:

    // 计算字符的个数
    // 如果是双字节字符的(比如中文字符),两个字节才算一个字符
    // 否则一个字节算一个字符
    len = 0;
    for(i=0; str[i]!='\0'; ++i)
    {
            if( IsDBCSLeadByte(str[i]) )
                     ++i;
             ++len;
    }

    // 将混合字符转化为宽字符
    wstring = ( wchar_t*) malloc((len+1) *  sizeof( wchar_t));
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1,  wstring, len);
    wstring[len] = L'\0';

    // 用完后记得释放内存
    free( wstring);


    加上前面所讲到的wglUseFontBitmaps函数,即可显示中文字符了。
    void drawCNString( const  char* str) {
            int len, i;
            wchar_twstring;
             HDC hDC = wglGetCurrentDC();
             GLuint  list = glGenLists(1);

             // 计算字符的个数
             // 如果是双字节字符的(比如中文字符),两个字节才算一个字符
             // 否则一个字节算一个字符
             len = 0;
            for(i=0; str[i]!='\0'; ++i)
             {
                    if( IsDBCSLeadByte(str[i]) )
                             ++i;
                     ++len;
             }

             // 将混合字符转化为宽字符
            wstring = ( wchar_t*) malloc((len+1) *  sizeof( wchar_t));
             MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1,  wstring, len);
            wstring[len] = L'\0';

             // 逐个输出字符
            for(i=0; i<len; ++i)
             {
                     wglUseFontBitmapsW(hDC,  wstring[i], 1,  list);
                     glCallList( list);
             }

             // 回收所有临时资源
            free( wstring);
             glDeleteLists( list, 1);
    }


    注意我用了wglUseFontBitmapsW函数,而不是wglUseFontBitmaps。wglUseFontBitmapsW是wglUseFontBitmaps函数的宽字符版本,它认为字符都占两个字节。因为这里使用了MultiByteToWideChar,每个字符其实是占两个字节的,所以应该用wglUseFontBitmapsW。
    void display( void) {
             glClear(GL_COLOR_BUFFER_BIT);

             selectFont(48, ANSI_CHARSET,  "Comic Sans MS");
             glColor3f(1.0f, 0.0f, 0.0f);
             glRasterPos2f(-0.7f, 0.4f);
             drawString( "Hello, World!");

             selectFont(48, GB2312_CHARSET,  "楷体_GB2312");
             glColor3f(1.0f, 1.0f, 0.0f);
             glRasterPos2f(-0.7f, -0.1f);
             drawCNString( "当代的中国汉字");

             selectFont(48, DEFAULT_CHARSET,  "华文仿宋");
             glColor3f(0.0f, 1.0f, 0.0f);
             glRasterPos2f(-0.7f, -0.6f);
             drawCNString( "傳統的中國漢字");

             glutSwapBuffers();
    }

    效果如图:
    http://blog.programfan.com/upfile/200805/20080505132632.gif
    原文链接:http://blog.sina.com.cn/s/blog_4ff085000100dew0.html
    展开全文
  • OpenGL显示字体的例子很少,尤其是中文字体,本例子介绍了一种显示中文字体的方法。
  • OpenGL显示中文

    2008-07-25 17:17:14
    win32+opengl 显示中文
  • opengl显示汉字

    热门讨论 2009-03-30 18:33:33
    可以在opengl下很好地显示汉字,包括3D文字等
  • NULL 博文链接:https://kungsoft.iteye.com/blog/318875
  • OpenGL,显示汉字

    2018-10-30 07:32:31
    OpenGL并没有直接提供显示文字的功能,并且,OpenGL也没有自带专门的字库。因此,要显示文字,就必须依赖操作系统所提供的功能了
  • OpenGL显示文字

    千次阅读 2019-06-23 19:33:06
    阅读这篇文章前,可以先看一下这个文字显示系列的...OpenGL提供的是图形API,本身并不提供文字处理方面的接口,如果想要显示文字就需要先将文字转化成图片,然后渲染图片。 Char Map Char Map是最简单的方式,首先...

    阅读这篇文章前,可以先看一下这个文字显示系列的其他文章,了解一些字符编码,字体相关的知识:https://blog.csdn.net/wlk1229/article/category/9008450

     

    显示文字

    OpenGL提供的是图形API,本身并不提供文字处理方面的接口,如果想要显示文字就需要先将文字转化成图片,然后渲染图片。

    Char Map

    Char Map是最简单的方式,首先需要准备号一张图片,图片中包含了要显示的文字。显示文字时只需要从图片中截取相应的纹理就可以了。这种方式比较适合文字大小固定,显示字符比较少的情况,例如显示数字,只需要“0123456789”十个字符图片就行,有时还会需要“.,”。而且所有数字的宽度一般都是一样的,这对于截取纹理来说非常容易。如下就是一张数字图片:

     

    有时我们不光需要数字,也会需要其他字符,可以使用Bitmap font软件导出相应的文字图片,软件界面如下图:

     

    软件可以导出文字使用的字体,文字的大小,加粗,斜体等等。也可设置导出图片的格式,文字之间的间隔等等,如下两张图片。

       

    在设置导出图片时,有一个导出文字的描述文件“Font descriptor”的选项,这是因为为了提高导出的图片的利用率,文字会紧密排列在图片中,为了知道每个文字在图片中的位置就需要,一个单独的文件来描述。如下,是导出的图片,和相应的描述文件:

    描述文件是一个“*.fnt”后缀名的文件,可以直接用记事本打开,从这个文件中可以知道文字的行高“lineHeigt”,字符的Unicode编码“id”,字符宽度“xadvance”,以及字符纹理在导出图片中的位置和长宽等等。有了这些信息,加上导出的图片就可以显示文字了。

     

    FreeType解析字体

    虽然Char Map的方式可以很好的显示文字,但有一定局限,1.显示的文字有限,对于英文来说字符比较少,可以用一张图片把所有字符打包,但是对于中文,要把所有字符全部打包就不是那么容易了,一般情况下只打包用到的字符;2.字体是固定的,文字的大小也是固定的,如果想更换字体则需要重新打包生成图片。Char Map本身只适合一些固定文字的显示,如果文字内容会变化,或者需要改变字体则不适合。

     

    显示文字完全可以通过解析字体文件,然后获取字体的图片,完成文字显示。只要我们有字体文件,字体文件中包含了我们要显示的文字(一般中文字体会包含所有要显示的字符),可以通过FreeType解析字体文件,获取相应的字符图片。通过FreeType解析字体,可以随意更换要显示文字的字体,也可以改变文字的大小等等。

     

    通过FreeType这个库可以很容易的从字体文件中获取到字符的位图。FreeType是一个C语言的库,支持各个平台,其提供了CMake编译,可以通过CMake软件转换成VS的工程,这里我已经编译好了VS2015中FreeType静态库的DebugRelease版本。

     

    FreeType使用也比较简单,这里给一个字符的大致步骤,详细的可以参考官方文档。

    1. 调用FT_Init_FreeType初始化FreeType库
    2. 调用FT_New_Face使用字体文件创建字体
    3. 调用FT_Select_Charmap设置映射字符编码,默认字符编码是Unicode,通常不用设置,因为大部分字体只支持Unicode和一种Apple平台的老编码。
    4. 调用FT_Set_Char_Size设置字符大小,设置字体大小时要设置字号和DPI,字号和平时用Word中字号类似,DPI是指显示设备像素密度,一般电脑显示器DPI在100左右,而手机在300左右,两者共同决定导出位图的大小。
    5. 调用FT_Set_Transform设置字体的缩放旋转和排版位置。如果想自己控制排版位置,一般可以省略这个步骤。
    6. 调用FT_Load_Char获取文字的位图信息,默认获取的是8位色深的位图,即每个字节代表一个像素。
    7. 使用位图绘制就可以显示文字了。

     

    字体缓存

    通常显示文字的时候都会有好多字符,如果每次显示文字的时候去获取一次位图,然后创建纹理,这样的效率太低。显示文字的时候会有很多重复的字符,同一个字符纹理只需要获取一次就行;另外如果每个字符创建一个纹理,这会导致创建好多纹理,所以需要一张大的纹理把需要显示的文字打包起来。因为所有显示的文字都在一个纹理中,显示文字的时候可以通过一次调用glDrawArrays渲染一个字符串,大大提高渲染效率。

    缓存字体时需要注意以下几个问题

    1. 因为像素坐标是整数,OpenGL中纹理坐标是浮点数,为了防止像素挨得太近,导致显示字符的时候出现其他字符的像素,字符之间需要留一定的空隙。
    2. OpenGL在设置纹理数据时默认是4字节对齐,而FreeType获取的是8bit位图,每个像素只有1个字节,所以需要将纹理数据对其设为一个字节,需要调用glPixelStorei(GL_UNPACK_ALIGNMENT, 1)函数。
    3. 更新字体纹理缓存中的字符是可以通过函数glTexSubImage2D只更新一个字符的数据。
    4. OpenGL中纹理坐标是以坐下角为原点,Y轴是从下到上,而FreeType获取的位图图原点是左上角,Y轴是从上到下,与OpenGL相反,所以纹理缓存中的纹理实际如下:

     

    文字边框

    FreeType获取的位图是一张刚好包只含文字的位图,不包含左右上下的空白信息。如果绘制文字时直接把每一张位图连接在一起,文字则会一个粘一个,不利于阅读,正常显示的文字上下左右都会有一定的间距。

    如上图外面的大矩形框是显示中字时需要的位置,内部红色框是FreeType获取的位图。为了正确显示文字,需要六个位置信息,图中的Height、Width、OffsetX、OffsetY已经位图的长宽。

    这六个信息可以通过以下方式获得:

    1. Height,当调用完FT_Set_Char_Size后,所有字符的高度都是一样的,在FT_Set_Char_Size设置文字大小后,可以通过fontFace->size->metrics.height/64获得,除以64说因为FreeType获取的字体高度单位的原因。
    2. Width,当调用完FT_Load_Char后,可以通过fontFace->glyph->advance.x/64,也需要除以64。
    3. OffsetX,当调用完FT_Load_Char后,为fontFace->glyph->metrics.horiBearingX/64。
    4. OffsetY,当调用完FT_Load_Char后,为(fontFace->size->metrics.height + fontFace->size->metrics.descender - fontFace->glyph->metrics.horiBearingY)/64。
    5. Bitmap宽,当调用完FT_Load_Char后,为fontFace->glyph->bitmap.width。
    6. Bitmap高,当调用完FT_Load_Char后,为fontFace->glyph->bitmap.rows。

    以上数据主要根据FreeType文档中的这张图片获得:

    其他请参考,FreeType文档

     

    除了以上信息,对于每个字符,渲染文字时还需要保存字符纹理在字体缓存纹理中的位置,所以总共需要8个位置信息,我使用了以下结构体存储:
     

    struct CharGlyphRect
    {
    	int width, height; //字符的宽高
    	int offsetX, offsetY; // 字符纹理在字符矩形中的偏移量, 坐标系为X从左到右,Y从上到下
    	int texWidth, texHeight; // 字符纹理的宽高
    	int texX, texY; //字符在缓存大纹理中的位置, 坐标系为X从左到右,Y从上到下
    	CharGlyphRect() :texWidth(0), texHeight(0), width(0), height(0), offsetX(0), offsetY(0), texX(0), texY(0) {}
    };

    为了保存所有已缓存的字符,需要使用一个map,map<wchar_t, CharGlyphRect> CharCache。

     

    渲染文字

    渲染文字时我们需要渲染一个矩形,如下图时渲染的文字与其对应的矩形:

    渲染的矩形并不是紧挨着的,以为我们的文字纹理只是刚好包含的字符的纹理,没有包括空隙,这个空隙需要我们自己控制。为了一次渲染多个文字,而文字渲染的矩形又不是紧挨着,所以不能使用GL_TRIANGLE_STRIP,只能使用GL_TRIANGLES。一个矩形需要两个三角形,所以需要六个点,六个点的坐标设置如下:
     

    	const auto& glyphRect = CharCache[str[i]];
    
    	int x = currentX + glyphRect.offsetX;
    	int y = currentY - glyphRect.offsetY;
    
    	int texX = glyphRect.texX;
    	int texY = glyphRect.texY;
    		 
    	//以下坐标是渲染时的NDC坐标
    	//左上角
    	verts[i * 6].pos[0] = PerPixelWidth * x;
    	verts[i * 6].pos[1] = PerPixelHeight * y;
    	verts[i * 6].texPos[0] = texX / static_cast<float>(CharCacheWidth);
    	verts[i * 6].texPos[1] = texY/ static_cast<float>(CharCacheHeight);
    
    	//左下角
    	verts[i * 6 + 1].pos[0] = PerPixelWidth * x;
    	verts[i * 6 + 1].pos[1] = PerPixelHeight * (y - glyphRect.texHeight);
    	verts[i * 6 + 1].texPos[0] = texX / static_cast<float>(CharCacheWidth);
    	verts[i * 6 + 1].texPos[1] = (texY + glyphRect.texHeight) / static_cast<float>(CharCacheHeight);
    
    	//右上角
    	verts[i * 6 + 2].pos[0] = PerPixelWidth * (x + glyphRect.texWidth);
    	verts[i * 6 + 2].pos[1] = PerPixelHeight * y;
    	verts[i * 6 + 2].texPos[0] = (texX + glyphRect.texWidth) / static_cast<float>(CharCacheWidth);
    	verts[i * 6 + 2].texPos[1] = texY / static_cast<float>(CharCacheHeight);
    
    	//右上角
    	verts[i * 6 + 3].pos[0] = PerPixelWidth * (x + glyphRect.texWidth);
    	verts[i * 6 + 3].pos[1] = PerPixelHeight * y;
    	verts[i * 6 + 3].texPos[0] = (texX + glyphRect.texWidth) / static_cast<float>(CharCacheWidth);
    	verts[i * 6 + 3].texPos[1] = texY  / static_cast<float>(CharCacheHeight);
    
    	//左下角
    	verts[i * 6 + 4].pos[0] = PerPixelWidth * x;
    	verts[i * 6 + 4].pos[1] = PerPixelHeight * (y - glyphRect.texHeight);
    	verts[i * 6 + 4].texPos[0] = texX / static_cast<float>(CharCacheWidth);
    	verts[i * 6 + 4].texPos[1] = (texY + glyphRect.texHeight) / static_cast<float>(CharCacheHeight);
    
    	//右下角
    	verts[i * 6 + 5].pos[0] = PerPixelWidth * (x + glyphRect.texWidth);
    	verts[i * 6 + 5].pos[1] = PerPixelHeight * (y - glyphRect.texHeight);
    	verts[i * 6 + 5].texPos[0] = (texX + glyphRect.texWidth) / static_cast<float>(CharCacheWidth);
    	verts[i * 6 + 5].texPos[1] = (texY + glyphRect.texHeight) / static_cast<float>(CharCacheHeight);
    
    	currentX += glyphRect.width;
    

    平滑字体

    文字显示中有大量的曲线,如果要显示清晰的文字必须要让曲线看上去非常平滑,不能出现锯齿。

    FreeType默认获取的位图是一个8bit的位图,每个像素只有一个字节,这是一种256度灰阶图。正是这个8位的位图可以让显示的字符具有反走样的能力,可以显示平滑清晰的文字。在OpenGL中最常用的一种抗锯齿反走样方式就是利用透明来进行反走样,具体原理参考。因为FreeType提供的是灰阶图,所以可以设置一个文字颜色,然后把这个灰阶设为像素的透明度,这样显示的文字可以非常平滑,没有锯齿。

    片元着色器如下:

    #version 430

    layout(location= 2) uniform sampler2D tex; //缓存字体纹理

    layout(location= 3) uniform vec3 color; //文字颜色

     

    out vec4 outColor;

    in vec2 texCoord;

    void main()

    {

        float a = texture(tex, texCoord).r;

        outColor = vec4(color, a);

    }

     

    在绘制的时候,因为要使用透明,所以需要开启融合,代码如下:

    glActiveTexture(GL_TEXTURE0);

    glBindTexture(GL_TEXTURE_2DCharCacheTex);

    glUniform1i(2, 0);

    glUniform3fv(3, 1, _color); //设置文字颜色

     

    glEnable(GL_BLEND);

    glBlendFunc(GL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHA);//设置融合函数

     

    glBindVertexArray(_vao);

    glDrawArrays(GL_TRIANGLES, 0, _vertCount);

    glDisable(GL_BLEND);

     

    以下是一个完整的例子,VS2017代码下载地址

     

    展开全文
  • QtOpenGL文字显示

    2014-08-23 13:40:24
    Qt版的OpenGLDemo,其中包含透视投影,纹理贴图,文字显示,反锯齿。
  • (七)OpenGL显示字母与汉字

    千次阅读 2019-09-03 23:20:46
    中文字符(原链接找不到了,只能先这么发了,如果有谁找到的话麻烦评论一下我改掉) #include #include #include #include void selectFont(int size, int charset, const char* face){ HFONT hFont = ...

    https://blog.csdn.net/qq_35040828/article/details/51758258
    具体解释直接看这个链接吧

    #include<windows.h>
    #include <GL/glut.h>
    #include <math.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    void drawstring(const char* str){
        static int isfirstcall = 1;
        static GLuint lists;
        if(isfirstcall){
            isfirstcall = 0;
            lists = glGenLists(128);
            wglUseFontBitmaps(wglGetCurrentDC(),0,128,lists);
        }
        for( ; *str !='\0';++str){
            glCallList(lists + *str);
        }
    }
    
    void display(){
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(0,1,0);
        glRasterPos2f(0.5,0.5);
        drawstring("hello, world");
        glutSwapBuffers();
    }
    
    int main(int argc,char * argv[]){
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
        glutInitWindowSize(512,512);
        glutCreateWindow("word");
        glutDisplayFunc(display);
    
        glutMainLoop();
        return 0;
    
    }
    

    运行结果
    在这里插入图片描述

    写中文字符(原链接找不到了,只能先这么发了,如果有谁找到的话麻烦评论一下我改掉)

    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <GL/glut.h>
    
    void selectFont(int size, int charset, const char* face){
        HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
                        charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                        DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);
        HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont);
        DeleteObject(hOldFont);
    }
    void drawCNString(const char* str){
        int len, i;
        wchar_t* wstring;
        HDC hDC = wglGetCurrentDC();
        GLuint lista = glGenLists(1);
    
        // 计算字符的个数
        // 如果是双字节字符的(比如中文字符),两个字节才算一个字符
        // 否则一个字节算一个字符
        len = 0;
        for (i = 0; str[i] != '\0'; ++i)
        {
            if (IsDBCSLeadByte(str[i]))
                ++i;
                ++len;
            }
        // 将混合字符转化为宽字符
        wstring = (wchar_t*)malloc((len + 1) * sizeof(wchar_t));
        MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);
        wstring[len] = L'\0';
        // 逐个输出字符
        for (i = 0; i<len; ++i)
        {
            wglUseFontBitmapsW(hDC, wstring[i], 1, lista);
            glCallList(lista);
        }
        // 回收所有临时资源
        free(wstring);
        glDeleteLists(lista, 1);
    }
    
    void display(){
        glColor3f(0.1,1,0.1);
        glRectf(-0.3,0.1,0.3,-0.15);
        glRectf(-0.3,-0.3,0.3,-0.55);
    
        glColor3f(1,1,1);
        selectFont(40,DEFAULT_CHARSET,"华文仿宋");
        glRasterPos2f(-0.3,-0.03);
        drawCNString("开始游戏");
        glRasterPos2f(-0.1,-0.45);
        drawCNString("exit");
    
    
        glutSwapBuffers();
    }
    
    int main(int argc, char *argv[]){
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
        glutInitWindowSize(500,700);
        glutCreateWindow("plane");
        glutDisplayFunc(display);
    
        glutMainLoop();
        return 0;
    }
    
    

    运行结果:
    在这里插入图片描述

    展开全文
  • OpenGL基于Unicode和ASCII做出3D汉字和英文字符的效果,只有一个代码文件,用VisualStudio2013即可成功编译运行!
  • void CGLFont::c3dtext(CString strText,HFONT hFont)// 3D文字显示,支持汉字。 { UCHAR * pChar=(UCHAR*)strText.GetBuffer(strText.GetLength());//定义字符串长度 int nListNum; //显示列表 D
    void CGLFont::c3dtext(CString strText,HFONT hFont)// 3D文字显示,支持汉字。
    
    {
    UCHAR * pChar=(UCHAR*)strText.GetBuffer(strText.GetLength());//定义字符串长度
    int   nListNum;                                 //显示列表
    DWORD dwChar;                                   //字符指针
    GLYPHMETRICSFLOAT pgmf[1];                      //轮廓字体字符集的信息
    glPushMatrix();                                 //压入堆栈
    for(int i = 0; i < strText.GetLength(); i++)
    { if(IsDBCSLeadByte((BYTE)pChar[i]))            //是否双字节(汉字)
    { dwChar=(DWORD)((pChar[i]<<8)|pChar[i+1]); //取当前字符,双字节转换
     i++;
    }
     else dwChar = pChar[i];                      //取当前字符
     nListNum = glGenLists(1);                     //创建列表
     wglUseFontOutlines( hdc, //拥有字体的HDC
     dwChar, //转化为显示列表的第一个字符
     1, //转化为显示列表的字符数
     nListNum, //显示列表的开始
     0.0f, 
    0.25f, //Z轴负方向的厚度
     WGL_FONT_POLYGONS, //绘制字体方式
     pgmf //指向存放信息的数组,为count个
    );
     glCallList(nListNum);                         //绘制显示列表
     glDeleteLists(nListNum, 1);                   //删除列表
    }
    glPopMatrix();                                  //弹出堆栈
    strText.ReleaseBuffer();                        //清除字符串
    //::SelectObject(hdc,hOldFont);                   //恢复字体
    }
    展开全文
  • OpenGL显示中文

    千次阅读 2009-07-30 16:44:00
    在我的OpenGl框架中,有个Font字体类,能够很方便的显示中文来。下面就列出来这个类吧,以后陆续列出框架下的其他有用的类。呵呵。Font.h #ifndef __GLFONT_H__#define __GLFONT_H__#include // Header File ...
  • OpenGL使用中文,可设置字体(源代码) 使用Nehe的代码框架,封装了一个字体类。
  • Android 文字绘制到Bitmap上 OpenGL ES中似乎不能输出文本.将文本写到Bitmap上,再作为贴图,则可实现文字输出.文字绘制到Bitmap上的方法为:String mstrTitle = "文字渲染到Bitmap!";Bitmap bmp = Bitmap.createBitmap...
  • opengl学习之显示文字

    2020-04-04 12:34:42
    OpenGL并没有直接提供显示文字的功能,并且,OpenGL也没有自带专门的字库。因此,要显示文字,就必须依赖操作系统所提供的功能了。 各种流行的图形操作系统,例如Windows系统和Linux系统,都提供了一些功能,以便...
  • OpenGL显示字体

    2021-01-13 03:31:06
    OpenGL并没有直接提供显示文字的功能,并且,OpenGL也没有自带专门的字库。因此,要显示文字,就必须依赖操作系统所提供的功能了。各种流行的图形操作系统,例如Windows系统和Linux系统,都提供了一些功能,以便能够...
  • Linux下Modern OpenGL显示汉字

    千次阅读 2017-08-24 14:48:14
    Linux下Modern OpenGL显示汉字前一篇中解码出来的图像已经能够正常颜色格式转换和显示了,现在遇到了新的问题:显示文字 本以为这是一个很简单的东西,因为之前使用SDL时直接应用sdl_ttf库很简单的就实现了文字渲染...
  • opengl中文显示

    2011-05-20 18:49:47
    pengl 中文显示 c++面向对象 opengl编程精粹
  • OpenGL 调用FreeType2.0显示文字

    热门讨论 2013-01-08 13:38:54
    本程序是使用FreeType2.0库, 在OpenGL中显示文字, 若字库文件支持unicode, 则可显示汉字等东亚字符, 本程序是本人为嵌入式系统所写的一个原型程序,若加上着色器,便可很容易移植到OPenGL ES2.0
  • 使用OpenGL+FreeType技术渲染了点阵格式的中文宋体(字体大小小于16),效果极好,可与Windows自身渲染的效果一比
  • opengl显示RGB数据,自己测试代码,虽杂乱但是比较简单,可以从中扣自己要的代码。
  • OpenGL显示汉字

    千次阅读 2009-03-29 22:41:00
    //// 汉字类////GLFont.h文件#include #include "gl/gl.h"#pragma warning(disable:4244)//OpenGL汉字显示类class GLfont { HFONT hFont; COLORREF cl;public: GLfont(); virtual ~GLfont(); void ...
  • OpenGL汉字显示

    2013-12-24 16:57:54
    OpenGL TrueType 汉字 显示
  • OpenGL中的汉字显示

    2017-12-26 18:54:00
    void COpenGLDemoView::glDrawString(unsigned char *str) { GLYPHMETRICSFLOAT pgmf[1]; HDC hDC=wglGetCurrentDC(); HFONT hFont; LOGFONT lf ; memset(&lf,0,size...
  • 在C#中,通过FreeType方式为OpenGL显示文字。 使用了SharpFont和SharpGL类库

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,419
精华内容 4,567
关键字:

opengl显示汉字