在纹理上动态重新映射颜色

时间:2014-11-06 22:02:53

标签: c# unity3d texture2d

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

一个想法是确定将用作面具然后重新着色为任何颜色的颜色。可以使用一些色调分布函数来完成:

解决方案1 ​​

enter image description here

我使用基于max()的功能。你可以see the plot there

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

这个解决方案有两个很大的缺陷:

  1. 紫色无法使用(我不喜欢它)
  2. 只适用全彩色(无棕色,黑色,白色......)
  3. 你上面看到的只是我的小事。实际项目将在C#中的Unity引擎上运行。

    解决方案2

    我的朋友提出了不同的方法:每张图片都应使用地图 - 褪色或只是true / false数组 - 来映射应用颜色的位置。我还没有尝试过这个,因为测试ad-hoc更加复杂。

    以统一的方式改变纹理

    似乎是texture for material can be easily altered in Unity,所以问题是:

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

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

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

    1. 以某种方式获取模型材质的纹理(我们只知道这里的GameObject
    2. 如果尚未重新着色,请使用一些算法正确更改图像。我们在这里需要一些像素操作
    3. 将纹理应用回模型材质

1 个答案:

答案 0 :(得分:1)

如果你去纹理处理路线,你需要为每种颜色制作存储在内存中的纹理的附加副本,这将增加场景的“加载”时间。您可以使用具有渲染器组件的GameObject上使用的renderer.material.mainTexture来访问GameObject的纹理。然后,您可以使用各种像素操作选项(例如SetPixelSetPixels)批量执行此操作以获得更好的性能。

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

通过制作色相和饱和度外部参数,您应该能够使用各种颜色,包括用于标记颜色的任何颜色。

来自Unity论坛的

This post应该有助于使用色调偏移着色器。