字体(字符)的渲染方法

最近开始在啃Game Programming Gem 8.里面有一些不错的文章,及时咀嚼及时反思 记录于此。

一直以为字体渲染是件简单的事 ,因为电脑上这么多字体显示么,但是今天看了这文章才知道3D技术里的字体渲染是两回事。平时win里面看到的文字这些基本都是通过GDI在cpu上运算绘制(或者也加入了显卡绘制)的,不过在3D游戏里面看到的字体包括GUI等则不是这个流程的,它们都跟其他图形的渲染一样,都是一些多边形,经过渲染管线在显卡上绘制的,跟多边形的渲染时一样的,甚至有时是一个比较耗的过程。

       通常字体的渲染有两种方式:

     1 是把turetype字头的每个字符图像(英文称glyph)编码为三角形集合,然后就想渲染三角形一样在屏幕上渲染,这通常会带来大量的渲染数据。

     2 把所有的字符画在一张贴图上,然后在渲染的时候,每个字符就是一个正方形(俩三角形),然后编码每个找到合适的贴图坐标给这个正方形贴图,使得贴的图就是那个大字符图上这个字符的图像,这种方法需要为每个字符预先编码他们的贴图坐标。显然这种方法更好一些,三角数目会少很多。

     一般的字符渲染包括GUI的渲染一样都是采用第二种方法吗,但是他有一些效率不高的地方,比如字符可能会要经常变化,那么向管线要频繁提交定点数据。因此针对这个就有一些优化的余地:

    1.将对显存back buffer的lock方式设为discard方式,这种方式是D3D支持的一种方式,一种解决CPU的提交和GPU的渲染对backbuffer的访问冲突的策略,正常情况当cpu提交给gpu的backbuffer要对其修改时,如果发现这块缓存恰巧正在gpu用于渲染给前缓存,那么提交会被打回,也就是这帧渲染不成功,会卡帧,这个discard标记在频繁的vertex
buffer提交时使用,
它的意思是如果发现这块缓存恰巧正在gpu用于渲染给前缓存,那么标记这个缓存为valid,这时GPU会立即将这片缓存重建,并且会马上允许cpu的提交,并渲染。这会最大化的允许CPU对字体这种字符GUI这种可能频繁变化VB的物体的提交。

  2.正常包括字符数据的vb(vertex buffer)要包括位置、贴图坐标、颜色信息。但是其实不用每次都提交这么多信息,可以把一个估计的最大的字符串的VB用一个流通道a(D3D的stream channel)提交,每次变化字符时只要提交一个唯位移或者合并缩放信息到另一个通道b就行了。也就是频繁提交的只是B通道的较少的数据。

  3还可以利用D3D的instance技术,即把字符做成instance 那么每次更改字符信息,只提交字符的位置就行了,当然23都要使用shader实现。

  4.有时为了实现字符或GUI的上下层效果,需要有一个层数的信息,这个可以利用位置向量的z支来表示。

  5.为了节省渲染资源提高效率,字符和GUI这种不涉及到3D变换的表层物件,通常直接提交的是clip空间的坐标,屏幕坐标XY对应的剪裁坐标计算公式为cx=-1+x*(2/screen_width)  cy=1-y*(2/screen_height).在D3D的固定管线中就等于直接提交D3DFVF_XYZRHW格式的vb,他不执行定点变换。

时间: 2024-09-21 12:13:58

字体(字符)的渲染方法的相关文章

Win8.1英文字体发虚不渲染问题

  修复Win8.1的BUG,解决Win8.1英文字体发虚不渲染问题 Win8.1更新了宋体字体,中文字体显示漂亮了,但英文字体发虚不渲染,尤其是小号的英文和数字字体,看下图. 目前解决方法只能替换回Win8的字体,方法如下: 1.下载Win8的宋体 2.打开字体文件点击安装 3.倒入注册表文件 4.重启Win8.1

Win8.1英文字体(小号英文和数字字体)发虚不渲染问题解决

修复Win8.1 的BUG,解决Win8.1英文字体发虚不渲染问题 Win8.1更新了宋体字体,中文字体显示漂亮了,但英文字体发虚不渲染,尤其是小号的英文和数字字体,看下图. 目前解决方法只能替换回Win8的字体,方法如下: 1.下载Win8的宋体:百度网盘下载 2.打开字体文件点击安装 3.倒入注册表文件:百度网盘下载 4.重启Win8.1         注:更多请关注电脑教程栏目,三联电脑办公群:189034526欢迎你的加入

Android中正确使用字体图标(iconfont)的方法_Android

字体图标 字体图标是指将图标做成字体文件(.ttf),从而代替传统的png等图标资源. 使用字体图标的优点和缺点分别为: 优点:       1. 可以高度自定义图标的样式(包括大小和颜色),对于个人开发者尤其适用       2. 可以减少项目和安装包的大小(特别你的项目中有很多图片icon时,效果将是M级)       3. 几乎可以忽略屏幕大小和分辨率,做到更好的适配       4. 使用简单       -- 缺点:        1. 只能是一些简单的icon,不能代替如背景图.9图

Android中正确使用字体图标(iconfont)的方法

字体图标 字体图标是指将图标做成字体文件(.ttf),从而代替传统的png等图标资源. 使用字体图标的优点和缺点分别为: 优点: 1. 可以高度自定义图标的样式(包括大小和颜色),对于个人开发者尤其适用 2. 可以减少项目和安装包的大小(特别你的项目中有很多图片icon时,效果将是M级) 3. 几乎可以忽略屏幕大小和分辨率,做到更好的适配 4. 使用简单 -- 缺点:        1. 只能是一些简单的icon,不能代替如背景图.9图等资源 2. 一些需要文字说明的icon,图片资源将会是更好

金山WPS字体添加纹理的方法

  在今天的金山WPS文字处理教程中,我们将给大家分享的是给字体添加纹理的方法.这也是WPS特有的功能之一.给字体添加纹理之后,不仅字体变得更美观.醒目了,而且也字体效果与众不同,也更能吸引观看者的注意力.下面,就一起来看看WPS字体添加纹理的方法吧! WPS添加纹理图案在不打印的情况下查看背景可以用下面的方法: 打印需要使用其它方法,页眉页脚法: 选择视图选项卡中的页眉页脚,进入页眉页脚编辑状态,选择插入选项卡中的"形状"画一个和纸张一样大的矩形,设置填充效果,并且右击,选择叠放层次

android实现字体闪烁动画的方法

  本文实例讲述了android实现字体闪烁动画的方法.分享给大家供大家参考.具体如下: 这里基于线程和Timer实现Android的字体闪烁动画效果. ? public class ActivityMain extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); spark();

巧用photoshop打造火焰字体特效思路及方法

  巧用photoshop打造火焰字体特效思路及方法,电影海报或者广告图片适用,熊熊烈火,文字的内容也比较容易被欣赏者熟记在心,简单粗暴的技巧,耐心跟着一步步做就可以完成 分类: PS文字教程

Python获取系统默认字符编码的方法

  本文实例讲述了Python获取系统默认字符编码的方法.分享给大家供大家参考.具体分析如下: 在Python代码中,普通字符串的编码方式与程序源文件编码方式一致的,而很多IDE在默认情况下,将程序源文件按照系统默认字符编码来保存的. 下面给出用Python获取系统默认编码的例子: ? 1 2 3 4 5 6 7 #!/usr/bin/env python #coding=utf-8 """ 获取系统默认编码 """ import sys pri

jQuery实现限制textarea文本框输入字符数量的方法

  本文实例讲述了jQuery实现限制textarea文本框输入字符数量的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 (function($) { $.fn.extend( { limiter: function(limit, elem) { $(this).on("keyup focus", function() { setCount(this, elem); }