首页 > 其他分享 >osg 使用整理 (9):文本渲染

osg 使用整理 (9):文本渲染

时间:2023-10-29 22:33:48浏览次数:38  
标签:字符 FreeType 字形 渲染 vec4 字体 文本 osg

osg 使用整理 (9):文本渲染

1 FreeType文本渲染

​ FreeType用于加载TrueType字体并渲染到位图的库。TrueType字体通过数学公式表示的曲线来描述字体轮廓。类似于矢量图像,这些光栅化后的字体图像可以根据需要的字体高度来生成。FreeType所做的事就是加载TrueType字体并为每一个字形生成位图以及计算几个度量值(Metric)。我们可以提取出它生成的位图作为字形的纹理,并使用这些度量值定位字符的字形。

​ a. 初始化FreeType库,并且将这个字体加载为一个FreeType称为面的东西。

​ b. 定义字体大小,设置字体宽度高度。

​ c. 调用FT_Load_Char函数激活指定的字形。调用FT_LOAD_RENDER创建8位灰度位图。

​ 使用FreeType加载的每个字形没有相同的大小。使用FreeType生成的位图大小恰好能包含这个字符可见区域。因此FreeType加载了一些度量值来指定每个字符的大小和位置。如下图所示。
每一个字形都放在一个水平的基准线上。一些字形恰好位于基准线上,而另外一些则会稍微越过基准线以下。这些度量值精确定义了摆放字形所需的每个字形距离基准线的偏移量、每个字形的大小、预留空间大小。可以定义一个结构体存储字形对应的度量值以及纹理。

2 osg::TextBase类

​ osgText库中实现了二维、三维文本渲染,可以自由设置参数达到不同的渲染效果。字体基类的成员变量和成员函数如下图所示。

常用属性设置接口:

设置文字分辨率
void setFontResolution(unsigned int width,unsigned int height) 默认为32*32个像素单元
设置对齐方式
void setAlignment(Alignment alignment)
设置布局方式
void setLayout(Layout layout)
设置绘制模式
void setDrawMode(unsigned int mode)

​ 实现逻辑:

a. 创建一个Font字体对象,并读取字体。调用FreeType遍历字符生成每个字符的纹理和字符度量值。

b. 创建一个osgText::Text对象,设置文字属性,同时关联字体。遍历一行字符串渲染每一个字符,我们从之前创建的Characters映射表中取出对应的Character结构体,并根据字符的度量值来计算四边形的维度。根据四边形的维度我们就能动态计算出6个描述四边形的顶点,并使用glBufferSubData函数更新VBO所管理内存的内容。

c. 实现shader

#version 330 core
layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex>
out vec2 TexCoords;

uniform mat4 projection;

void main()
{
    gl_Position = projection * vec4(vertex.xy, 0.0, 1.0);
    TexCoords = vertex.zw;
}
#version 330 core
in vec2 TexCoords;
out vec4 color;

uniform sampler2D text;
uniform vec3 textColor;

void main()
{    
    vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);
    color = vec4(textColor, 1.0) * sampled;
}

3 SDF渲染字体技术

​ 流程

​ a. TTF将矢量字库中的字符,按照要求的尺寸输出为灰度点阵图,在这一过程中字库引擎处理了AA以及像素匹配

​ b. 将字符灰度点阵图写入到字符图集纹理中,并记录其对应的uv位置和尺寸

​ c. 计算字符面片的顶点位置,要保证其在像素中间,大小与字符图元一致,以得到最好的渲染效果

​ d. 纹理、材质、模型传给GPU进行渲染

标签:字符,FreeType,字形,渲染,vec4,字体,文本,osg
From: https://www.cnblogs.com/wangxydela/p/17796683.html

相关文章

  • 如果后端返回上万条数据,前端如何渲染成长列表呢?
    使用虚拟列表   只对可见区域进行渲染,对非可见区域中的数据不渲染或部分渲染的技术,从而达到极高的渲染性能,虚拟列表其实是按需显示的一种实现。   虚拟列表一般包含三个组成部分:可视区域、列表渲染区域、真实列表区域。列表渲染区大于等于可视区。比如容器区域需要渲......
  • Python自动处理pptx:新建、另存、添加幻灯片、添加标题、插入文本图片图形、提取文本
    Python-pptx库是一个用于创建、更新和读取MicrosoftPowerPoint.pptx文件的Python库。它允许我们使用Python脚本自动化PowerPoint文件的创建、更新和读取操作,是一个非常方便自动化处理PPTX的工具。安装pipinstallpython-pptx创建frompptximportPresentationppt=Presentat......
  • # yyds干货盘点 # 导入的xls文件,数字和日期都是文本格式,到df3都正常,但df4报错,什么原因
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【斌】问了一个Pandas数据处理的问题,一起来看看吧。我之前用过xls,现在练习pandas:目前导入的xls文件,数字和日期都是文本格式,到df3都正常,但df4报错,df4是算加权平均。下图是报错截图:二、实现过程这里我和【黑科技·鼓包】、【瑜......
  • Windows与UOS虚拟机实现互相复制粘贴文本及文件
    往期文章:麒麟KYLINOS2303版本上使用KDE桌面共享软件hello,大家好啊,今天给大家带来一篇在VMwareworkstation17Pro上安装UOS虚拟机后实现互相复制粘贴文本及文件的文章,主要通过open-vm-tools-desktop软件实现,当我们安装完UOS1060虚拟机后,想要复制里面的内容到Windows上的时候,会发......
  • 文本型数字编号排序,职场常见场景!
    1职场实例小伙伴们大家好,今天我们来解决一种职场办公中常见的问题:文本型数字编码排序问题。掌握这个问题的解题思想,有助于我们提高办公效率。如下图所示:是一份小区单元楼户号电费缴纳明细表,A列为户号,B列为电费金额,现在我们想要对B列电费金额进行升序排序,希望按照户号的“楼宇号-单......
  • OSG开发笔记(二十九):OSG加载模型文件、加载3DMax三维型文件Demo
    前言  Osg深入之后需要打开模型文件,这些模型文件是已有的模型文件,加载入osg之后可以在常见中展示模型文件,该节点可以操作,多个逼真的模型的节点就实现了基本的场景构建。<br>Demo  <br>说明  三维模型文件一般是由专业的三维建模人员完成,可以去buy通用模型,但是定制模型......
  • vue3+ts 禁止文本框自动填充内容
    如果`<input>`元素的`autocomplete`属性设置为`"off"`但并没有起作用,这可能是因为不同浏览器对此属性的实现方式存在一些差异。为了更可靠地禁用自动填充功能,你可以尝试以下解决方案之一:1.添加`autocomplete="new-password"`属性值:一些浏览器会将`"off"`视为默认值,但......
  • Kubernetes 中使用consul-template渲染配置
    Kubernetes中使用consul-template渲染配置当前公司使用consul来实现服务发现,如Prometheue配置中的target和alertmanager注册都采用了consul服务发现的方式,以此来灵活应对服务的变更。但对于其他服务,是否也有一个通用的方式来使用consul管理配置文件?本文中描述如何使用consul-tem......
  • 微信小程序获取用户名和头像方式以及使文本可复制方法
    1.微信小程序获取微信昵称和头像在微信小程序之前的版本可以通过wx.getUserInfo和wx.getUserProfile来获取微信头像和昵称。2022年11月8日24时之后上述两个接口均被微信小程序进行回收。本来以为通过一些其他方式也可以获取到微信头像和昵称,比如设置button组件的open-type为getU......
  • [Vue]条件渲染
     1.v-if  写法:    (1)v-if="表达式"    (2)v-else-if="表达式"    (3)v-else="表达式"  适用于:切换频率较低的场景。  特点:不展示的DOM元素直接被移除。  注意:v-if可以和v-else-if、v-else一起使用,但要求结构不能被“......