设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2549|回复: 5
打印 上一主题 下一主题

[有事请教] 使用HGE显示中文,为什么文字会有锯齿?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
174 小时
注册时间
2008-9-17
帖子
387
跳转到指定楼层
1
发表于 2013-3-28 22:44:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
使用的矢量字体,但是显示的文字却有锯齿。
貌似用freetype从字体库里提出来的时候就已经有锯齿了,因为在向纹理拷贝的时候没有任何操作。
黑色的锯齿,看起来像是描边。
求各位大神指导....谢谢





不过如果用像素字体就没有这种情况


欢迎来到我的空间【我的空间】
头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

2
发表于 2013-3-28 23:56:58 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
174 小时
注册时间
2008-9-17
帖子
387
3
 楼主| 发表于 2013-3-29 00:10:49 | 只看该作者
晴兰 发表于 2013-3-28 23:56
听说FreeType本身就有反走样功能……

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

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



欢迎来到我的空间【我的空间】
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
1641 小时
注册时间
2011-9-26
帖子
313
4
发表于 2013-4-2 20:18:19 | 只看该作者
本帖最后由 Shy07 于 2013-4-2 20:48 编辑

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


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

发现我的阅读水平越来越差了:(
如果是切割后再render出现这种情况的话,那就是切割的时候没有保存透明通道的问题了
可以试试不切割,直接SetClipping后render到目标贴图上

点评

保存透明通道是什么意思?我在每次render精灵字体之前都会重新设下blend,可是还是不行  发表于 2013-4-2 23:23
愿善用者善用之
https://github.com/Shy07/SINRGE2
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
174 小时
注册时间
2008-9-17
帖子
387
5
 楼主| 发表于 2013-4-2 22:27:22 | 只看该作者
本帖最后由 ClaudeBell 于 2013-4-2 23:26 编辑
Shy07 发表于 2013-4-2 20:18
因为绘制文字的时候没有alpha混合
这些黑色锯齿实际是开启truetype后平滑的部分(alpha值小于255),而 ...


非常感谢,我试下

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

多谢


欢迎来到我的空间【我的空间】
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
1641 小时
注册时间
2011-9-26
帖子
313
6
发表于 2013-4-3 02:19:23 | 只看该作者
我意思是在帧缓存模式下把文字贴图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么

愿善用者善用之
https://github.com/Shy07/SINRGE2
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-2 07:46

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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