Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 更改纹理中轮廓的前景色_Unity3d_Shader - Fatal编程技术网

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
,它允许您指定如何映射顶点数据。