图像混合模式 正片叠底、滤色、叠加

 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 }

 

posted @ 2016-10-27 09:56  筱程  阅读(1122)  评论(0编辑  收藏  举报