Project1

标题: 使用HGE显示中文,为什么文字会有锯齿? [打印本页]

作者: ClaudeBell    时间: 2013-3-28 22:44
标题: 使用HGE显示中文,为什么文字会有锯齿?
使用的矢量字体,但是显示的文字却有锯齿。
貌似用freetype从字体库里提出来的时候就已经有锯齿了,因为在向纹理拷贝的时候没有任何操作。
黑色的锯齿,看起来像是描边。
求各位大神指导....谢谢





不过如果用像素字体就没有这种情况
作者: 晴兰    时间: 2013-3-28 23:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: ClaudeBell    时间: 2013-3-29 00:10
晴兰 发表于 2013-3-28 23:56
听说FreeType本身就有反走样功能……

freetype的抗锯齿已经开了,不是这个问题。
现在发现是这样,我是为了实现图块的功能,将一张png切成多块,然后拼成一张图,在这上面显示文字就有问题。
如果只是用单张png做纹理显示,不做切割什么的,就是直接显示,那么就没问题。

已经完全摸不着头脑了...


作者: Shy07    时间: 2013-4-2 20:18
本帖最后由 Shy07 于 2013-4-2 20:48 编辑

因为绘制文字的时候没有alpha混合
这些黑色锯齿实际是开启truetype后平滑的部分(alpha值小于255),而像素字体正因为没有平滑的部分才看上去正常
你可以试试直接把freetype绘制的文字贴图render到屏幕上,对比一下就知道为什么了


看来已经知道为什么了,那就简单了,直接把freetype绘制的文字贴图render到目标贴图上就好了:)

发现我的阅读水平越来越差了:(
如果是切割后再render出现这种情况的话,那就是切割的时候没有保存透明通道的问题了
可以试试不切割,直接SetClipping后render到目标贴图上
作者: ClaudeBell    时间: 2013-4-2 22:27
本帖最后由 ClaudeBell 于 2013-4-2 23:26 编辑
Shy07 发表于 2013-4-2 20:18
因为绘制文字的时候没有alpha混合
这些黑色锯齿实际是开启truetype后平滑的部分(alpha值小于255),而 ...


非常感谢,我试下

-------------------------------------
对于您说的SetClipping我不是特别理解,用Gfx_SetClipping貌似是切割屏幕,而不是切割图片?
我的想法是通过切割png,将切出的png信息(坐标啥的)保存为quad,之后再用hgeSprite->Render绘制。
不知道这个思路正确否

多谢
作者: Shy07    时间: 2013-4-3 02:19
我意思是在帧缓存模式下把文字贴图render上去
SetClipping就是render文字贴图的时候分割出文字贴图在目标贴图上显示的区域

下面的是opengl的两个函数,dx应该也是可以实现的

C 代码复制
  1. BOOL BeginTarget(image_p _img,uint8_t clear){
  2.     static int cacheid = 0;
  3.  
  4.         if(!_img)
  5.                 return FALSE;
  6.         BIND_AND_TEST_CACHE(_img);
  7.     target_w = _img->w;
  8.     target_h = _img->h;
  9.     //reset to target_clip
  10.     target_clip = 1;
  11.     ResetClip();
  12.     glBlendEquationSeparate(GL_FUNC_ADD, GL_MAX);
  13.  
  14.     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  15.     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cacheid, 0);
  16.  
  17.     glMatrixMode(GL_PROJECTION);
  18.         glLoadIdentity();
  19.         glOrtho(0,_img->w,0,_img->h, -1, 1);
  20.     glMatrixMode(GL_MODELVIEW);
  21.  
  22.         glPushAttrib(GL_VIEWPORT_BIT);
  23.  
  24.         glViewport(0,0,_img->w, _img->h);
  25.  
  26.     if(clear){
  27.         glClearColor( COLOR_T_R(screen_c), COLOR_T_G(screen_c), COLOR_T_B(screen_c), COLOR_T_A(screen_c) );
  28.         glClear( GL_COLOR_BUFFER_BIT);
  29.     }
  30.         return TRUE;
  31. }
  32.  
  33. void EndTarget(){
  34.         glViewport(0,0, nge_screen.width, nge_screen.height);
  35.         glPopAttrib();
  36.         glBindFramebuffer(GL_FRAMEBUFFER, 0);
  37.         glMatrixMode(GL_PROJECTION);
  38.         glLoadIdentity();
  39.         glOrtho(0,nge_screen.ori_width,nge_screen.ori_height,0, -1, 1);
  40.         glMatrixMode(GL_MODELVIEW);
  41.     glBlendEquation(GL_FUNC_ADD);
  42.     //reset to screen clip
  43.     target_clip = 0;
  44.     ResetClip();
  45. }


PS:楼上这是引用里的删除线控制符影响到正文了,算是dz的bug么






欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1