网站大量收购独家精品文档,联系QQ:2885784924

关于Direc3D11里汉字显示的一些思考.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于Direc3D11里汉字显示的一些思考

关于Direct3D11里汉字显示的一些思考? 这篇文章里,浅墨希望与大家一起探讨一下Direct3D11中关于字体显示的一些问题。 ? ?一、关于Direct2D与DirectWrite ? 先讲讲Direct2D和DirectWrite吧,下面关于字体讨论的时候有涉及到的地方。首先,Direct2D,它是DirectX11附带着发布的全新的二维图形API。顾名思义,看到Direct2D立马想到了它的大哥Direct3D。的确,Direct2D就是仿照着Direct3D来设计的,一款支持硬件加速的即时模式的二维图形API,因为支持硬件加速,Direct2D跑起来比GDI,GDI+效率都高。Direct2D用于取代DirectDraw,可用于2D游戏开发,但是目前世界范围内对Direct2D研究热情似乎不高。关于DirectWrite,它也是DirectX11中的新组件,主要是配合Direct2D使用,用于Direct2D应用程序中的字体和文字渲染。 ? ? ? 二、Direct3D11里文字显示的一些讨论 ? 然后我们就开始正题,Direct3D11中关于文字显示方案的一些讨论,特别是汉字的显示问题。 Direct3D11中微软非常奇葩地移除了ID3DXFont这个在Direct3D 9中非常好用的字体接口,这样导致了目前的Direct3D11中竟然没有一个官方的字体解决方案- -,这真心不科学。要在Direct3D11中显示文字,除去那已经在DirectX11中离我们远去的D3DXFont接口,我们还可以想到的字体解决方案主要就以下三种(且不管方法正不正确,我们先把他们列举出来): ? 第一种方案,用子图形贴图的方式。 第二种方案,与GDI/GDI+进行交互,使用GDI/GDI+中虽然相对Direct3D来说低效,却五脏俱全的2D字体体系。 第三种方案,使用DirectX11中专门设计用来加强Windows中2D文字显示质量的全新API——DirectWrite。 ? 下面我们按上面的三种解决方案分别来进行一个小小的分析。 ? 第一种方案,用子图形贴图的方式解决Direct3D11里文字显示的问题。没错,这个是目前使用最广泛的Direct3D11文字解决方案。这种方案理解起来很简单,就是我们实际上在屏幕上贴出的是图片,而这些图片的内容就是一个个字母,这些图片组合在一起,就成了一段段的文字。正所谓巧妇难为无米之炊,说到图片,就必须有图片素材文件。使用这种方案需要准备如下所示的纹理素材: ? ? 关于使用方法的细节,我们可以参考下面这张图片: ? ? ? 很容易理解,如果要显示“D”字母,就把素材文件中“D“字母所在的矩形区域贴到文字需要显示的地方,这样就完成了D字母的显示。? 然后,问题就来了,我们可以看到,英文也就那26个字母,算上大写小写,阿拉伯数字,符号等等,需要的也就是数量不超过100个的字体元。然而中文怎么办?中华浩浩荡荡上下五千年,厚重的文化底蕴孕育了浩如烟海、动辄数千的汉字,且不说还有繁体字,古体字……? 所以,第一种方案总结一下——Direct3D11中想用子图形贴图方式作为显示汉字的方案有待考究。 且我们不要被这忙忙多的汉字吓到。来看一下,这种字体图集的做法,可以使用GDI/GDI+的字体绘制API函数,配合FreeType(TTF字体),将某种特定字体的每个字母元(单个汉字)渲染到一张纹理图集上。然后制作出来的纹理图集可以作为cache使用,进行字体的显示。汉字虽然多,但是按理来说,是可以实现的。 [cpp]?view plaincopyprint? void?SpriteBatch::DrawString(ID3D11DeviceContext*?dc,?? ????FontSheet?fs,?? ????const?std::wstring?text,?? ????const?POINT?pos,?? ????XMCOLOR?color)?? {?? ????BeginBatch(fs.GetFontSheetSRV());?? ????UINT?length?=?text.length();?? ????int?posX?=?pos.x;?? ????int?posY?=?pos.y;?? ????//?For?each?character?in?the?string...?? ????for(UINT?i?=?0;?i??length;?++i)?? ????{?? ????????WCHAR?character?=?text[i];?? ????????//?Is?the?character?a?space?char??? ????????if(character?==??)?? ?????

文档评论(0)

aining + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档