C# 统一动态地在纹理上重新映射颜色

C# 统一动态地在纹理上重新映射颜色,c#,unity3d,texture2d,C#,Unity3d,Texture2d,我正在联合制作RTS游戏。在这类游戏中,玩家通常可以使用单位颜色标记来确定单位忠诚度。我现在正在尝试实现这个系统,它将紫色重新映射到单元所有者的颜色上 一个想法是确定将用作遮罩的颜色,然后再还原为任何颜色。可以使用一些色调分布函数来完成: 解决方案1 我使用了基于max()的函数。你可以 此解决方案有两大缺陷: 紫色不能用(反正我也不喜欢) 仅全色适用(无棕色、黑色、白色……) 你在上面看到的只是我的摆弄。实际的项目将在C#中的Unity引擎上运行 解决方案2 我的朋友提出了不同的方法:每幅图

我正在联合制作RTS游戏。在这类游戏中,玩家通常可以使用单位颜色标记来确定单位忠诚度。我现在正在尝试实现这个系统,它将紫色重新映射到单元所有者的颜色上

一个想法是确定将用作遮罩的颜色,然后再还原为任何颜色。可以使用一些色调分布函数来完成:

解决方案1

我使用了基于
max()
的函数。你可以

此解决方案有两大缺陷:

  • 紫色不能用(反正我也不喜欢)
  • 仅全色适用(无棕色、黑色、白色……)
  • 你在上面看到的只是我的摆弄。实际的项目将在C#中的Unity引擎上运行

    解决方案2 我的朋友提出了不同的方法:每幅图像都应该使用一个贴图——要么是褪色的,要么就是
    true
    /
    false
    数组——来映射应该在哪里应用颜色。我还没有试过这个,因为测试临时性更复杂

    在统一中改变纹理 看来,问题是:

    Q:我应该如何在Unity中实现动态纹理着色(生成)?我的任何方法都是好方法吗?我应该如何使用什么函数生成新纹理

    我需要的不是完整的代码,而是关于应该使用哪些函数的信息。我希望其他用户也能从一般信息中获益

    为了帮助您回答这个问题,我可以猜这个过程将有三个重要部分:

  • 以某种方式获得模型材质的纹理(我们只知道此处的纹理)
  • 如果尚未重新存储,请使用某些算法正确更改图像。我们需要一些像素处理
  • 将纹理应用回模型材质

  • 如果使用纹理操纵路线,则需要为每种颜色创建存储在内存中的纹理的附加副本,这将增加场景的“加载”时间。您可以使用具有渲染器组件的游戏对象上使用的
    renderer.material.mainTexture
    访问游戏对象的纹理。然后,您可以使用各种像素操作选项,如
    SetPixel
    SetPixels
    ,分批执行,以获得更好的性能

    然而,我建议有第三种选择。如果编写/修改自定义着色器,则可以在渲染时执行颜色替换,而不会显著降低性能。这可以通过添加一个步骤来完成,您可以将颜色输出从RGB转换为HSV,更改色调和饱和度,然后再转换回HSV

    通过设置色调和饱和度外部参数,您应该能够使用全范围的颜色,包括用于标记颜色的任何颜色

    来自Unity论坛的内容应该有助于使用色调偏移着色器

    hue = min(hue, pow(Math.abs(hue-MASK_HUE),8)*5000000+RESULT_HUE)