更改纹理中字形的前景色

时间:2013-08-12 20:55:51

标签: unity3d shader

在我讨论我遇到的问题之前,需要更多的背景知识。我写了一个FontRenderer类来渲染文本。以下是它的工作原理:在运行期间,如果我要显示一个字符串 ABC ,将生成GameObject以产生3个四边形,每个四边形的UV坐标为每个字形都从地图集纹理中查找。

足够简单。考虑到使用相同的材​​料,这允许单次绘制调用。

但是,如果要添加特征,比如改变特定字形的前景,我该如何处理这个问题?我计划\c转义序列如下:\c[A-F]{2}[A-F]{2}[A-F]{2}

例如,如果我要将 ABC 中的 A 颜色为红色而其余字符串为白色,我会将以下字符串传递给FontRenderer"\cFF0000A\cFFFFFFBC"

我的第一个想法是利用地图集纹理。这背后的想法是用新的前景色绘制一个新的字形,并在图集纹理中分配一个精灵。但是,这可能会非常复杂。

我的下一个想法是使用顶点/片段着色器,但我不确定这是否可行。另一个问题是,如果可能的话,每个渲染的字符串都需要使用我的着色器的材质实例,从而增加绘制调用的次数。

还有什么方法可以做到?

1 个答案:

答案 0 :(得分:1)

最简单的程序方法可能是更改漫反射着色器的mainColor以为地图集材质着色。这里需要注意的是,你只能使用每种实例材质的1种颜色,这意味着如果你想要ABC字符串中的A,B和C每种都是不同的颜色,那么你需要将它们分开,导致3次绘制调用而不是一个。

另一种选择是使用vertex colors和着色器对材质进行程序着色。因此,当您生成四边形时,您还要将每个顶点的颜色设置为指定的颜色。

Unity3D特有的一些快速资源,使用着色器根据顶点颜色为材质着色:

最后,如果上述任何一种情况都不合适,那么我建议您先看看插件市场上的字体渲染,然后购买或尝试然后再学习。

祝你好运。