




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关于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文字显示质量的全新APIDirectWrite。下面我们按上面的三种解决方案分别来进行一个小小的分析。第一种方案,用子图形贴图的方式解决Direct3D11里文字显示的问题。没错,这个是目前使用最广泛的Direct3D11文字解决方案。这种方案理解起来很简单,就是我们实际上在屏幕上贴出的是图片,而这些图片的内容就是一个个字母,这些图片组合在一起,就成了一段段的文字。正所谓巧妇难为无米之炊,说到图片,就必须有图片素材文件。使用这种方案需要准备如下所示的纹理素材:关于使用方法的细节,我们可以参考下面这张图片:很容易理解,如果要显示“D”字母,就把素材文件中“D“字母所在的矩形区域贴到文字需要显示的地方,这样就完成了D字母的显示。然后,问题就来了,我们可以看到,英文也就那26个字母,算上大写小写,阿拉伯数字,符号等等,需要的也就是数量不超过100个的字体元。然而中文怎么办?中华浩浩荡荡上下五千年,厚重的文化底蕴孕育了浩如烟海、动辄数千的汉字,且不说还有繁体字,古体字所以,第一种方案总结一下Direct3D11中想用子图形贴图方式作为显示汉字的方案有待考究。且我们不要被这忙忙多的汉字吓到。来看一下,这种字体图集的做法,可以使用GDI/GDI+的字体绘制API函数,配合FreeType(TTF字体),将某种特定字体的每个字母元(单个汉字)渲染到一张纹理图集上。然后制作出来的纹理图集可以作为cache使用,进行字体的显示。汉字虽然多,但是按理来说,是可以实现的。实现代码如下:cppview plaincopyprint?1. voidSpriteBatch:DrawString(ID3D11DeviceContext*dc,2. FontSheet&fs,3. conststd:wstring&text,4. constPOINT&pos,5. XMCOLORcolor)6. 7. BeginBatch(fs.GetFontSheetSRV();8. UINTlength=text.length();9. intposX=pos.x;10. intposY=pos.y;11. /Foreachcharacterinthestring.12. for(UINTi=0;ilength;+i)13. 14. WCHARcharacter=texti;15. /Isthecharacteraspacechar?16. if(character=)17. 18. posX+=fs.GetSpaceWidth();19. 20. /Isthecharacteranewlinechar?21. elseif(character=n)22. 23. posX=pos.x;24. posY+=fs.GetCharHeight();25. 26. else27. 28. /Gettheboundingrectofthecharacteronthefontsheet.29. constCD3D11_RECT&charRect=fs.GetCharRect(character);30. intwidth=charRect.right-charRect.left;31. intheight=charRect.bottom-charRect.top;32. /Drawthecharactersprite.33. Draw(CD3D11_RECT(posX,posY,34. posX+width,35. posY+height),36. charRect,37. color);38. /Movetothenextcharacterposition.39. posX+=width+1;40. 41. 42. EndBatch(dc);43. 第二种方案,我们可以让Direct3D11与GDI/GDI+进行交互,使用GDI/GDI+中虽然相对Direct3D来说低效,却五脏俱全的2D字体体系。是的,与GDI/GDI+进行交互是目前Direct3D11里汉字显示主流方案,但是执行效率差强人意,个人觉得完全没有Direct3D 9中的ID3DXFont字体接口用起来舒服。第三种方案,在Direct3D11中使用DirectX11中专门设计用来加强Windows中2D文字显示质量的全新APIDirectWrite。这种方法行不行得通呢?答案是不行的,这种方案不可取。目前Direct3D11无法直接与Direct2D/DirectWrite进行交互。很有意思的是,Direct3D 10同样也不能直接与Direct2D/DirectWrite交互,而Direct3D 10.1却可以通过GXDI进行共享表面来实现,浅墨记得好像Direct2D/DirectWrite就是在Direct3D 10.1的架构上进行开发的,所以他们的关系才会如此微妙。总结起来就是,目前Direct3D11中可以使用的汉字显示解决方案,第一种与第二种方案都可以。作者:孙
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 清水工程整治方案(3篇)
- 没付工资解除合同协议4篇
- 5.3《圆的面积》(教学设计)-2024-2025学年六年级上册数学人教版
- 潜江膜结构工程方案(3篇)
- 砌体工程缺陷修补方案(3篇)
- 品质工程实施活动方案(3篇)
- 2025年教师招聘之《幼儿教师招聘》模拟题附答案详解(考试直接用)
- 车轮轴承检修课件
- 幕墙工程安全生产方案(3篇)
- 2025年成人教育平台运营绩效评估体系构建与实施报告
- 传统建筑的风格与特色
- 加油站人员培训和安全意识教育
- 中央基建投资绩效目标表
- 电商企业海外中转仓库管理方法与经验
- 高压电气设备试验的基本知识
- 整理我的小书桌(课件)小学劳动二年级通用版
- 激光束传输与变换-第九讲课件
- 时空大数据讲义课件
- 2023年上海国企中远海运(上海)有限公司招聘笔试题库含答案解析
- 管工安全技术操作规程
- 武汉某厂房设备基础施工方案
评论
0/150
提交评论