1 public class OverlayBlendModeTest : MonoBehaviour
2 {
3 // 两张需要混合的图片
4 public Texture2D ima1;
5 public Texture2D ima2;
6
7 public float Opacity = 0.1f;
8
9 private Texture2D tex;
10
11 void Start()
12 {
13 tex = new Texture2D(ima1.width, ima1.height, TextureFormat.ARGB32, false);
14 }
15
16 void Update()
17
18 { //设置混合度 逐像素读取混合
19 Texture2dHandle.SetOpacity = Opacity;
20 for (int y = 0; y < ima1.height; y++)
21 {
22 for (int x = 0; x < ima1.width; x++)
23 {
24
25 var dC = ima1.GetPixel(x, y);
26 var uC = ima2.GetPixel(x, y);
27 var oC = Texture2dHandle.OverlayBlendMode(uC, dC);
28 tex.SetPixel(x, y, oC);
29
30 }
31 }
32
33 tex.Apply();
34 gameObject.GetComponent<Renderer>().material.mainTexture = tex;
35 }
36 }
1 public class Texture2dHandle
2 {
3
4 /// <summary>
5 /// 混合度
6 /// </summary>
7 private static float Opacity = 0.3f;
8
9 /// <summary>
10 /// 设置混合度
11 /// </summary>
12 public static float SetOpacity
13 {
14 set
15 {
16 if (value < 0)
17 value = 0;
18 else if (value > 1)
19 value = 1;
20
21 Opacity = value;
22 }
23 }
24
25 /// <summary>
26 /// 正片叠底
27 /// </summary>
28 /// <returns></returns>
29 public static Color Multiply(Color b, Color t)
30 {
31 //b.g *= t.g;
32 //b.b *= t.b;
33 //b.r *= t.r;
34 //b.a = 1;
35
36 var c = new Color(b.r * t.r, b.g * t.g, b.b * t.b, 1);
37 return Color.Lerp(b, c, Opacity);
38 }
39
40 /// <summary>
41 /// 滤色
42 /// </summary>
43 /// <param name="b"></param>
44 /// <param name="t"></param>
45 /// <returns></returns>
46 public static Color Screen(Color b, Color t)
47 {
48 b = Minus(b);
49 t = Minus(t);
50
51 var c = Minus(Multiply(Multiply(b, t), 2.0f));
52
53 return Color.Lerp(b, c, Opacity);
54 }
55
56 /// <summary>
57 /// 叠加
58 /// </summary>
59 /// <param name="b"></param>
60 /// <param name="t"></param>
61 /// <returns></returns>
62 public static Color OverlayBlendMode(Color b, Color t)
63 {
64
65 Color c = new Color();
66 c.r = OverlayBlendMode(b.r, t.r);
67 c.g = OverlayBlendMode(b.g, t.g);
68 c.b = OverlayBlendMode(b.b, t.b);
69 c.a = 1;
70
71 return Color.Lerp(b, c, Opacity);
72 }
73
74
75 private static float OverlayBlendMode(float basePixel, float blendPixel)
76 {
77 if (basePixel < 0.5)
78 {
79 return (float)(2.0 * basePixel * blendPixel);
80 }
81
82
83 return (float)(1.0 - 2.0 * (1.0 - basePixel) * (1.0 - blendPixel));
84 }
85
86 /// <summary>
87 /// 倍数
88 /// </summary>
89 /// <param name="c"></param>
90 /// <param name="index"></param>
91 /// <returns></returns>
92 private static Color Multiply(Color c, float index = 1)
93 {
94 c.r *= index;
95 c.g *= index;
96 c.b *= index;
97 return c;
98 }
99
100 private static Color Minus(Color c, int index = 1)
101 {
102 c.r = index - c.r;
103 c.b = index - c.b;
104 c.g = index - c.g;
105 return c;
106 }
107 }