• 大小: 8KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: 其他
  • 标签: 中文  

资源简介

使用FreeType接受Unicode字符集渲染到纹理。。。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include FT_FREETYPE_H
#include 
#include 
#ifdef _WIN32
#pragma comment(lib  “freetype2312MT_D.lib“)
#endif
#define MAX_NO_TEXTURES 1

#define CUBE_TEXTURE 0

GLuint texture_id[MAX_NO_TEXTURES];

struct xCharTexture
{
GLuint  m_texID;
wchar_t m_chaID;
int     m_Width;
int     m_Height;

    int     m_adv_x;
    int     m_adv_y;
    int     m_delta_x;
    int     m_delta_y;
public:
xCharTexture()
{
m_texID  = 0;
m_chaID  = 0;
m_Width  = 0;
m_Height = 0;
}
}g_TexID[65536];
class xFreeTypeLib
{
    FT_Library m_FT2Lib;
FT_Face    m_FT_Face;

int   m_w;
int   m_h;
public:
xFreeTypeLib()
{
if (FT_Init_FreeType( &m_FT2Lib) ) 
exit(0);
}

void load(const char* font_file  int _w  int _h)
{
//加载一个字体取默认的Face一般为Regualer
if (FT_New_Face( m_FT2Lib font_file 0 &m_FT_Face )) 
{
getchar();
exit(0);
}
FT_Select_Charmap(m_FT_Face FT_ENCODING_UNICODE);
m_w = _w ; m_h = _h;
m_FT_Face->num_fixed_sizes;
//大小要乘64.这是规定。照做就可以了。
//FT_Set_Char_Size( m_FT_Face  0  m_w << 6 96 96);
FT_Set_Pixel_Sizes(m_FT_Facem_w m_h);
}

GLuint loadChar(wchar_t ch)
{
if(g_TexID[ch].m_texID)
return g_TexID[ch].m_texID;

if(FT_Load_Char(m_FT_Face chFT_LOAD_RENDER|FT_LOAD_FORCE_AUTOHINT|
(true ? FT_LOAD_TARGET_NORMAL : FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO) )   )
{
return 0;
}

        xCharTexture& charTex = g_TexID[ch];

//得到字模
FT_Glyph glyph;
if(FT_Get_Glyph( m_FT_Face->glyph &glyph ))
return 0;

//转化成位图
FT_Render_Glyph( m_FT_Face->glyph   FT_RENDER_MODE_LCD );//FT_RENDER_MODE_NORMAL  ); 
FT_Glyph_To_Bitmap( &glyph ft_render_mode_normal 0 1 );
FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph;

//取道位图数据
FT_Bitmap& bitmap=bitmap_glyph->bitmap;

//把位图数据拷贝自己定义的数据区里.这样旧可以画到需要的东西上面了。
int width  =  bitmap.width;
int height =  bitmap.rows;

m_FT_Face->size->metrics.y_ppem;
m_FT_Face->glyph->metrics.horiAdvance;


charTex.m_Width = width;
charTex.m_Height = height;
charTex.m_adv_x = m_FT_Face->glyph->advance.x / 64.0f;
charTex.m_adv_y = m_FT_Face->size->metrics.y_ppem; //m_FT_Face->glyph->metrics.horiBearingY / 64.0f;
charTex.m_delta_x = (float)bitmap_glyph->left;
charTex.m_delta_y = (float)bitmap_glyph->top - height;
glGenTextures(1&charTex.m_texID);
        glBindTexture(GL_TEXTURE_2DcharTex.m_texID);
char* pBuf = new char[width * height * 4];
for(int j=0; j  < height ; j++)
{
for(int i=0; i < width; i++)
{
unsigned char _vl =  (i>=bitmap.width || j>=bitmap.rows) ? 0 : bitmap.buffer[i + bitmap.width*j];
pBuf[(4*i + (height - j - 1) * width * 4)  ] = 0xff;
pBuf[(4*i + (height - j - 1) * width * 4)+1] = 0xff;
pBuf[(4*i + (height - j - 1) * width *

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2010-10-29 10:13  glut_rar_15123\
     文件         889  2010-10-28 16:24  glut_rar_15123\FreeTypeTest.sln
     文件        9728  2010-10-29 09:51  glut_rar_15123\FreeTypeTest.suo
     文件        3833  2010-10-28 16:24  glut_rar_15123\FreeTypeTest.vcproj
     文件        1425  2010-10-29 09:51  glut_rar_15123\FreeTypeTest.vcproj.20100524-1519.Administrator.user
     文件        8388  2010-10-28 16:34  glut_rar_15123\freetype_test.cpp

评论

共有 条评论