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