1

在我深入讨论我遇到的问题之前,需要更多的背景信息。我写了一个FontRenderer类来渲染文本。它是这样工作的:在运行时,如果我要显示一个字符串ABCGameObject将生成一个具有 3 个四边形的 a,每个四边形都有从 atlas 纹理中查找的每个字形的 UV 坐标。

很简单。这允许在使用相同材质的情况下进行一次绘制调用。

但是,如果要添加功能,例如更改特定字形的前景,我将如何解决这个问题?我计划这样的\c转义序列:\c[A-F]{2}[A-F]{2}[A-F]{2}.

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

我的第一个想法是利用 atlas 纹理。这背后的想法是用新的前景色绘制一个新的字形,并在 atlas 纹理中分配一个精灵。但是,这可能会变得相当复杂。

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

还有什么办法可以做到?

4

1 回答 1

1

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

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

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

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

祝你好运。

于 2013-08-13T06:48:51.203 回答