Unity3d 更改纹理中轮廓的前景色
在我深入讨论我正在讨论的问题之前,需要更多的背景。我已经编写了一个Unity3d 更改纹理中轮廓的前景色,unity3d,shader,Unity3d,Shader,在我深入讨论我正在讨论的问题之前,需要更多的背景。我已经编写了一个FontRenderer类来呈现文本。它的工作原理如下:在运行时,如果我要显示一个字符串ABC,一个游戏对象将生成3个四边形,每个四边形都有从atlas纹理中查找的每个glyph的UV坐标 很简单。这允许在使用相同材质的情况下进行单个绘制调用 但是,如果要添加的功能,例如更改特定标志符号的前景,我将如何处理此问题?我计划这样做\c转义序列:\c[A-F]{2}[A-F]{2}[A-F]{2} 例如,如果我要将A涂成ABC红色,将字
FontRenderer
类来呈现文本。它的工作原理如下:在运行时,如果我要显示一个字符串ABC,一个游戏对象将生成3个四边形,每个四边形都有从atlas纹理中查找的每个glyph的UV坐标
很简单。这允许在使用相同材质的情况下进行单个绘制调用
但是,如果要添加的功能,例如更改特定标志符号的前景,我将如何处理此问题?我计划这样做\c
转义序列:\c[A-F]{2}[A-F]{2}[A-F]{2}
例如,如果我要将A涂成ABC红色,将字符串的其余部分涂成白色,我会将以下字符串传递给FontRenderer
:“\cff000a\cFFFFFFBC”
我的第一个想法是利用atlas纹理。这背后的想法是用新的前景颜色绘制一个新的字形,并在atlas纹理中分配一个精灵。然而,这可能会变得相当复杂
我的下一个想法是使用顶点/片段着色器,但我不确定这是否可行。另一个问题是,如果可能,每个渲染字符串都需要使用“我的着色器”的材质实例,从而增加绘制调用的数量
还有什么其他方法可以做到呢?最简单的程序方法可能是将漫反射着色器的主颜色更改为atlas材质的颜色。这里需要注意的是,每个实例化材质只能使用1种颜色,这意味着如果希望ABC字符串中的A、B和C都是不同的颜色,则需要将它们拆分,从而导致3次绘制调用,而不是一次
另一个选项是使用和着色器按程序为材质着色。因此,在生成四边形时,还需要将每个顶点的颜色设置为指定的颜色
几个特定于Unity3D的快速资源,使用着色器基于顶点颜色为材质着色:
最后,如果上述任何一个都不适合,那么我建议看看字体呈现插件市场,购买或尝试,然后从中学习
祝你好运。最简单的程序方法可能是将漫反射着色器的主颜色更改为atlas材质的颜色。这里需要注意的是,每个实例化材质只能使用1种颜色,这意味着如果希望ABC字符串中的A、B和C都是不同的颜色,则需要将它们拆分,从而导致3次绘制调用,而不是一次
另一个选项是使用和着色器按程序为材质着色。因此,在生成四边形时,还需要将每个顶点的颜色设置为指定的颜色
几个特定于Unity3D的快速资源,使用着色器基于顶点颜色为材质着色:
最后,如果上述任何一个都不适合,那么我建议看看字体呈现插件市场,购买或尝试,然后从中学习
祝你好运。对于第二个选项,我必须将材质实例与该字符串相关联,因为我必须修改参数才能设置特定图示符的颜色。我猜我必须通过4个顶点的组。但是相同材质的多个实例不会增加绘制调用吗?我没有过多地寻找一个包,但不幸的是,我所查找的包是封闭源代码的。另外,我是否会使用float4
数据类型来指定带有alpha的颜色?我不知道256位是如何使用的。是的,我的256位颜色限制是错误的(旧信息!),我已经删除了它。我为您添加了一些链接,以实现一个着色器,该着色器将根据顶点的颜色为网格着色。最终结果仍然应该是1次抽签调用。指定顶点颜色才是关键!需要注意的是使用BindChannels
,它允许您指定如何映射顶点数据。使用第二个选项,我必须将材质实例与该字符串关联,因为我必须修改参数才能设置特定图示符的颜色。我猜我必须通过4个顶点的组。但是相同材质的多个实例不会增加绘制调用吗?我没有过多地寻找一个包,但不幸的是,我所查找的包是封闭源代码的。另外,我是否会使用float4
数据类型来指定带有alpha的颜色?我不知道256位是如何使用的。是的,我的256位颜色限制是错误的(旧信息!),我已经删除了它。我为您添加了一些链接,以实现一个着色器,该着色器将根据顶点的颜色为网格着色。最终结果仍然应该是1次抽签调用。指定顶点颜色才是关键!需要注意的是使用BindChannels
,它允许您指定如何映射顶点数据。