Unity实现文本转贴图

本文实例为大家分享了Unity实现文本转贴图的具体代码,供大家参考,具体内容如下

导入字体

导入ttf字体,修改Character为Custom set,并填入Custom Chars:

可以看到,Unity为我们生成了对应的材质和贴图:

从上图可以看出:

1、Unity中Texture2D的坐标原点为左下角,和OpenGL相同,V坐标与DX相反。
2、某些字符被上下翻转,某些字符被顺时针旋转了90度
这两点需要特别注意。

原理分析

本文中使用的方法是创建一个Texture,然后利用Texture2D的

public Color[] GetPixels(int x, int y, int blockWidth, int blockHeight);

成员方法,读取字体贴图中的像素信息,然后基于特定字符,利用Texture2D的

public void SetPixel(int x, int y, Color color);

方法,将像素信息写入创建的Texrue。

确定GetPixels的参数x,y时,需要注意以下两点:

1、对于被上下翻转的字符,比如数字“1”,利用CharacterInfo. uvTopLeft计算;
2、对于被顺时针旋转90度的字符,比如字母“K”,利用CharacterInfo.uvBottomRight计算。

代码实现

public Texture2D TextToTexture(
        Font font,
        string text,
        int textureWidth, int textureHeight,
        int drawOffsetX, int drawOffsetY,
        int textGap, int spaceGap, int rowHeight,
        Color textColor,
        Color backgroundColor)
    {
        // 创建返回的Texture
        var textTexture = new Texture2D(textureWidth, textureHeight, TextureFormat.ARGB32, true);
        Color[] emptyColor = new Color[textureWidth * textureHeight];
        for (int i = 0; i < emptyColor.Length; i++)
        {
            emptyColor[i] = backgroundColor;
        }
        textTexture.SetPixels(emptyColor);

        // 字体贴图不可读,需要创建一个新的可读的
        var fontTexture = (Texture2D)font.material.mainTexture;
        var readableFontTexture = new Texture2D(fontTexture.width, fontTexture.height, fontTexture.format, fontTexture.mipmapCount, true);
        Graphics.CopyTexture(fontTexture, readableFontTexture);

        // 调整偏移量
        var originalDrawOffsetX = drawOffsetX;// 记录一下,换行用
        drawOffsetY = textureHeight - drawOffsetY - rowHeight;// 从上方开始画

        // 逐个字符绘制
        foreach (var @char in text.ToCharArray())
        {
            if (@char == ' ')
            {
                drawOffsetX += spaceGap;
                continue;
            }

            if (@char == '\n')
            {
                // 换行
                drawOffsetX = originalDrawOffsetX;
                drawOffsetY -= rowHeight;

                continue;
            }

            int charWidth, charHeight;// 字符宽高
            Color[] charColor;// 字符颜色,数组内颜色的顺序为从左至右,从下至上

            font.GetCharacterInfo(@char, out CharacterInfo info);
            if (info.uvTopLeft.x < info.uvBottomRight.x)// 处理被垂直翻转的字符
            {
                charWidth = info.glyphWidth;
                charHeight = info.glyphHeight;

                charColor = readableFontTexture.GetPixels(
                    (int)(readableFontTexture.width * info.uvTopLeft.x),
                    (int)(readableFontTexture.height * info.uvTopLeft.y),
                    charWidth, charHeight);

                for (int j = 0; j < charHeight; j++)
                {
                    for (int i = 0; i < charWidth; i++)
                    {
                        if (charColor[j * charWidth + i].a != 0)
                        {
                            textTexture.SetPixel(
                                drawOffsetX + i,
                                drawOffsetY + charHeight - j,// 从上往下画,把字符颠倒过来
                                textColor);
                        }
                    }
                }
            }
            else// 处理被顺时针旋转90度的字符
            {
                charWidth = info.glyphHeight;
                charHeight = info.glyphWidth;

                charColor = readableFontTexture.GetPixels(
                    (int)(readableFontTexture.width * info.uvBottomRight.x),
                    (int)(readableFontTexture.height * info.uvBottomRight.y),
                    charWidth, charHeight);

                for (int j = 0; j < charHeight; j++)
                {
                    for (int i = 0; i < charWidth; i++)
                    {
                        if (charColor[j * charWidth + i].a != 0)
                        {
                            // 旋转
                            textTexture.SetPixel(
                                drawOffsetX + charHeight - j,
                                drawOffsetY + i,
                                textColor);
                        }
                    }
                }
            }

            // 更新偏移
            drawOffsetX += charWidth + textGap;
        }

        textTexture.Apply();
        return textTexture;
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3D Shader实现贴图切换效果

    本文实例为大家分享了shader实现基于世界坐标的贴图置换效果. 效果如下: 设置面板如下: 可在面板上设置切换方向,与切换对象,及其切换速度. shader实现如下: Shader "XM/Effect/SwapTexture" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Targ

  • unity实现贴图矩阵运算(旋转平移缩放)

    我们在shader中对贴图处理时,有时候会有一些比较复杂的运算,比方说三角函数,开方等,一般情况下,如果可以在越上层做运算,性能会越高.C# > Vertex > fragment 因此,考虑到贴图的旋转用到的三角函数,可以使用在C#中传入旋转矩阵得到,然后使用uv直接乘以矩阵就可以了. 封装了vmatrix4x4,分享一下: using UnityEngine; namespace D11.Skin { public class VMatrix { public float[,] m; pu

  • 解决unity3d导入模型贴图材质丢失的问题

    今天导入了一个模型,但是模型贴图丢失了,而且Inspector面板中处于不能编辑的状态 虽然可以通过重新创建材质来替换,但是这样会生成一个新的prefab,觉得不太好 做出如下更改,将对应材质填入即可 补充:Unity光照贴图丢失的坑 最近项目出版本的时候出现了部分建筑光照贴图不正常的情况,而且仅仅是部分模型,这部分模型都是有多个场景会用到的,所以都是单独出来打包的. 然后以为是模型上面的光照信息丢失了,通过测试,并没有丢失,可以通过获取模型上的MeshFilter打印出来,部分丢失的话,也与光

  • Unity实现文本转贴图

    本文实例为大家分享了Unity实现文本转贴图的具体代码,供大家参考,具体内容如下 导入字体 导入ttf字体,修改Character为Custom set,并填入Custom Chars: 可以看到,Unity为我们生成了对应的材质和贴图: 从上图可以看出: 1.Unity中Texture2D的坐标原点为左下角,和OpenGL相同,V坐标与DX相反. 2.某些字符被上下翻转,某些字符被顺时针旋转了90度 这两点需要特别注意. 原理分析 本文中使用的方法是创建一个Texture,然后利用Textur

  • Unity实现仿3D轮转图效果

    本文实例为大家分享了Unity实现仿3D轮转图效果的具体代码,供大家参考,具体内容如下 一.效果演示 二.实现思路 ——获取位置:可以将每个item的运行轨迹看作一个椭圆,分为四段进行观察,四个黑点视为四个item,观察四个黑点的位置,比例值为0.125和0.375的位置相同,比例值为0.625和0.875的位置相同,比例值为0.375和0.625的位置相反,可得结论[0,0.25]:轨迹总长度*当前比例值(0.25,0.5]:轨迹总长度 * (0.5 - 当前比例值)(0.5,0.75]:轨迹

  • Unity实现图片生成灰白图的方法

    本文实例为大家分享了Unity生成图片灰白图的具体代码,供大家参考,具体内容如下 效果 原图 生成出来的灰白图 制作方法 把文章末尾的的TextureUtils.cs脚本放到工程的Assets / Editor目录中 然后选中项目中的一张图片,然后点击菜单Tools / GenGrayTexture 就会在同级目录中生成灰白图片了 // TextureUtils.cs using System.Collections; using System.Collections.Generic; usin

  • Unity工具类之生成文本验证码

    本文实例为大家分享了Unity生成文本验证码的具体代码,供大家参考,具体内容如下 文本验证码 由于我经常使用Unity进行webgl版本的开发,看到网站上面用户登录有很多的验证码验证.借鉴相关博客,写了Unity的工具类文本验证码,代码如下: 工具类:VerificationCode using System.Collections; using System.Collections.Generic; using System.Text; /// <summary> /// 该工具类为:生成验

  • 使用Python提取文本中含有特定字符串的方法示例

    今天搞了一天的文本处理,发现python真的太适合做数据处理了.废话不多说,一起学习吧! 1.我的原始数据是这样的,如图 2.如果要提取每行含有pass的字符串,代码如下: import re filepath = "E:/untitled1/analyze_log/test.log" txt = open(filepath, "r").read() result="" test_text = re.findall(".........

  • 详解提升场景文本识别中的语言模型

    一.语言模型定义 1. 什么是语言模型? 如图1所示,顾名思义,语言模型即根据当前语境的上下文推断当前句子的意思.具体的标准定义为:对于语言序列w1,w2,-wn,语言模型就是计算该序列的概率即P(w1,w2,-wn). 2. 为什么需要语言模型? 文本图像中包含两层信息:视觉纹理信息和语言信息.由于单纯根据视觉纹理信息进行文字识别缺少了对上下文的字符语义信息的挖掘,时常会导致错误的文本识别结果(之后会详细说明).因此如何获得鲁棒的语言信息来提升识别性能成为了最近场景文本识别任务中比较受欢迎的思

  • 详解Unity安卓共享纹理

    概述 本文的目的是实现以下的流程: Android/iOS native app 操作摄像头 -> 获取视频流数据 -> 人脸检测或美颜 -> 传输给 Unity 渲染 -> Unity做出更多的效果(滤镜/粒子) 简单通信 在之前的博客里已经说到,Unity 和安卓通信最简单的方法是用 UnitySendMessage 等 API 实现. Android调用Unity: //向unity发消息 UnityPlayer.UnitySendMessage("Main Cam

  • 如何利用python批量提取txt文本中所需文本并写入excel

    目录 1.提取txt文本 2.增加数据框的列 3.引入基础csv数据,并扩列 汇总 总结 1.提取txt文本 我想要的文本是如图所示,宝可梦的外貌描述文本,由于原本的数据源结构并不是很稳定,而且也不是表格形式,因此在csdn上查了半天. 最原始的一行一行提取(不建议,未采用) fi = open("D:\python_learning\data\data\Axew.txt","r",encoding="utf-8") wflag =False #

  • 浅谈标签和JLabel类构造方法 原创

    标签有 JLabel 类定义,它的父类为 JComponet 类. 标签可以显示一行只读文本.一个图像或带图像的文本.它并不能产生任何类型的事件,只能简单地展示图片和文本,但是可以使用标签的特性指定标签上文本的对齐方式.         JLabel类提供了多种构造方法,可以创建多种标签,如展示只有文本的标签.只有图标的标签或包含文本和图标的标签.JLabel类常用的几个构造方法如下: public JLabel():创建一个不带图标和文本的JLabel对象. public JLabel():创

  • TextView实现图文混合编排的方法

    一.简介 在这里实现图文混合编排使用的是:TextView中预定义的类似Html的标签 二.方法 * 1.设置好html标签的文本 String html="<font>图片1</font><img src='image1'/>"; html+="<font>图片2</font><img src='image2'/>"; html+="<font>图片3</font&

随机推荐