当前位置:   article > 正文

unity编辑器拓展十一——将两张RGB图合并成一张_unity texture2d合并2个为什么会是黑色的

unity texture2d合并2个为什么会是黑色的

        游戏角色shader,包含的东西比较多,还要做到动态合并,程序那边希望贴图经可能少,而我们美术用了两张图,一张图的RGB是高光、流光、自发光,另外一张图的RGB是不同区域的偏色,其实每个通道的一整张贴图只用了一部分,其他地方都是空的,于是就想到把两张图合并成一张图来使用。合并后的这张贴图的R通道:0到128 为高光 128到255为偏色区域,前提是偏色跟高光不要重合 所以这个偏色区域最好是皮肤类的,无明显高光类的。从美术的角度,让他们直接按照这样的色阶来画,肯定是很困难的,所以他们还是按照两张图来做,做是做到不交叉,然后我们用工具将两张图合并成一张图,将偏色从0到255改成128到255,将高光从0到255改成0到128,这样再把两个颜色合并到一起。其他通道也是如此。

如图:                                           

        

           偏色                                                    高光                                                     合并后

这样就是一个通道的合成,到shader里 ,贴图采样后,将0到128提取出来,变换成0到255当作高光贴图来用,将128到255提取出来,变换成0到255当作偏色来用

工具代码如下:

 

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. public class TextureCombine : EditorWindow
  6. {
  7. [MenuItem("Tools/角色工具/合并贴图")]
  8. static void window()
  9. {
  10. TextureCombine win = (TextureCombine)EditorWindow.GetWindow(typeof(TextureCombine), false, "合并贴图", false);
  11. win.Show();
  12. }
  13. Texture2D tex1;
  14. Texture2D tex2;
  15. Texture2D tex3;
  16. //第一张贴图的的像素组
  17. List<Color> color01 = new List<Color>();
  18. //第二张贴图的的像素组
  19. List<Color> color02 = new List<Color> ();
  20. //得出第三张贴图得像素组
  21. List<Color> color03 = new List<Color>();
  22. private void OnGUI()
  23. {
  24. tex1 = EditorGUILayout.ObjectField("偏色贴图", tex1, typeof(Texture), true) as Texture2D;
  25. tex2 = EditorGUILayout.ObjectField("高光贴图", tex2, typeof(Texture), true) as Texture2D;
  26. tex3 = EditorGUILayout.ObjectField("合并后效果", tex3, typeof(Texture), true) as Texture2D;
  27. if (GUI.Button(new Rect(100, 40, 50, 25), "合并"))
  28. {
  29. if (tex1!=null && tex2 != null)
  30. {
  31. color01.Clear();
  32. color02.Clear();
  33. color03.Clear();
  34. TextureCombin();
  35. }else
  36. this.ShowNotification(new GUIContent("没贴图你点个屁啊!!!"));
  37. }
  38. }
  39. void TextureCombin()
  40. {
  41. //取出第一张贴图的像素
  42. for (int i = 0; i < tex1.height; i++)
  43. {
  44. for (int j = 0; j < tex1.width; j++)
  45. {
  46. Color a = tex1.GetPixel(j, i);
  47. //将0到1转换成0.51-1 需要加判断 0值也会被加到0.51 就不是黑底了
  48. if (a.r>0)
  49. a.r = a.r * 0.51f + 0.49f;
  50. if (a.g > 0)
  51. a.g = a.g * 0.51f + 0.49f;
  52. if (a.b > 0)
  53. a.b = a.b * 0.51f + 0.49f;
  54. color01.Add(a);
  55. }
  56. }
  57. //取出第二张贴图的像素
  58. for (int i = 0; i < tex1.height; i++)
  59. {
  60. for (int j = 0; j < tex1.width; j++)
  61. {
  62. Color a = tex2.GetPixel(j, i);
  63. //将0-1的值 转换为 0-0.49
  64. a.r *= 0.49f;
  65. a.g *= 0.49f;
  66. a.b *= 0.49f;
  67. color02.Add(a);
  68. }
  69. }
  70. //得出第一张加第二张贴图
  71. for (int i = 0; i< color01.Count; i++)
  72. {
  73. Color color = new Color();
  74. if (color01[i].r != 0 && color02[i].r != 0)
  75. {
  76. this.ShowNotification(new GUIContent("R通道“偏色”跟“高光”交集哦!!!"));
  77. break;
  78. }
  79. else
  80. color.r = color01[i].r + color02[i].r;
  81. if (color01[i].r != 0 && color02[i].r != 0)
  82. {
  83. this.ShowNotification(new GUIContent("G通道“偏色”跟“流光”有交集哦!!!"));
  84. break;
  85. }
  86. else
  87. color.g = color01[i].g + color02[i].g;
  88. if (color01[i].b != 0 && color02[i].b != 0)
  89. {
  90. this.ShowNotification(new GUIContent("B通道“偏色”跟“自发光”有交集哦!!!"));
  91. break;
  92. }
  93. else
  94. color.b = color01[i].b + color02[i].b;
  95. color03.Add(color);
  96. }
  97. //给第三张图赋值
  98. if (color03.Count == tex1.width * tex1.height)
  99. {
  100. tex3 = new Texture2D(tex1.width, tex1.height, TextureFormat.RGB24, true);
  101. for (int i = 0; i < tex1.height; i++)
  102. {
  103. for (int j = 0; j < tex1.width; j++)
  104. {
  105. tex3.SetPixel(j, i, color03[j + tex1.width * i]);
  106. }
  107. }
  108. tex3.Apply();
  109. string a = AssetDatabase.GetAssetPath(tex1);//Assets/aa/F2_D001_Body_C 1.psd
  110. string[] sArray = a.Split('.'); //取“.”前面部分
  111. a = sArray[0];//取“.”前面部分
  112. byte[] bytes = tex3.EncodeToPNG();
  113. string filename = a+"_Combin.png";//将合并的贴图储存到第一张贴图的路径下
  114. System.IO.File.WriteAllBytes(filename, bytes);
  115. EditorApplication.ExecuteMenuItem("Assets/Refresh");
  116. }
  117. }
  118. }

 

将两张贴图拖拽到相应位置,点击“合并”,然后新的贴图将保存到偏色贴图的位置,名称为偏色贴图的名称 + “_Combin”

合并后的贴图为png贴图,本来想存成TGA的,发现Texture2D类没有TGA的接口,没弄成功。记得T4m里的那张通道图好像是TGA的,有空去再去研究下。

亲,如果您觉得本文不错,愿意给我一些动力的话,请用手机扫描二维码即可向我打赏

                                         打赏

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/98099
推荐阅读
相关标签
  

闽ICP备14008679号