/// <summary>
        /// 将RenderTexture保存成一张png图片
        /// </summary>
        public static bool SaveRenderTextureToPNG(RenderTexture rt, string path, string fileName)
        {
            Texture2D png = SaveRenderTextureToTexture2D(rt);

            if (png == null)
            {
                return(false);
            }
            EditorExtUtil.SaveTexture2DtoFile(png, path, fileName, EditorExtUtil.SavingTextureFormat.PNG, true);

            return(true);
        }
示例#2
0
        void OnGUI()
        {
            EditorExtUtil.UI_PathField("生成文件路径", ref outputPath);

            GUILayout.Label("生成文件名");
            outputTextureName = EditorGUILayout.TextField(outputTextureName);
            GUILayout.Space(10);

            modeIndex = GUILayout.Toolbar(modeIndex, new[] { "RGB+A", "R+G+B+A" }, GUILayout.Height(20), GUILayout.ExpandWidth(true));

            if (modeIndex == 0)
            {
                UI_TextureSlot(0, "RGB Texture", false);
                UI_TextureSlot(3, "Alpha Texture", true);
            }
            else if (modeIndex == 1)
            {
                UI_TextureSlot(0, "Red Texture", true);
                UI_TextureSlot(1, "Green Texture", true);
                UI_TextureSlot(2, "Blue Texture", true);
                UI_TextureSlot(3, "Alpha Texture", true);
            }


            if (GUILayout.Button("Do Combine"))
            {
                Texture2D final = null;
                if (modeIndex == 0)
                {
                    texArray[1]        = texArray[0];
                    texArray[2]        = texArray[0];
                    channelRefArray[0] = 0;
                    channelRefArray[1] = 1;
                    channelRefArray[2] = 2;
                    final = CombineRGBASameSize(texArray, channelRefArray);
                }
                else if (modeIndex == 1)
                {
                    final = CombineRGBASameSize(texArray, channelRefArray);
                }

                EditorExtUtil.SaveTexture2DtoFile(final, outputPath, outputTextureName, EditorExtUtil.SavingTextureFormat.TGA, true);
                AssetDatabase.Refresh();
            }
        }
示例#3
0
        void OnGUI()
        {
            mode = GUILayout.Toolbar(mode, new[] { "SingleObjMode", "DualObjMode" });
            GUILayout.Space(10);

            EditorExtUtil.UI_PathField("生成文件路径", ref outputPath);

            GUILayout.Label("生成文件名");
            outputTextureName = EditorGUILayout.TextField(outputTextureName);
            GUILayout.Space(10);

            size = EditorGUILayout.IntField("Size", size);
            GUILayout.Space(10);

            rgbRenderTexture = EditorGUILayout.ObjectField("RGB RenderTexture", rgbRenderTexture, typeof(RenderTexture), false) as RenderTexture;
            aRenderTexture   = EditorGUILayout.ObjectField("Alpha RenderTexture", aRenderTexture, typeof(RenderTexture), false) as RenderTexture;
            GUILayout.Space(10);

            rgbMaterial = EditorGUILayout.ObjectField("RGB Material", rgbMaterial, typeof(Material), false) as Material;
            aMaterial   = EditorGUILayout.ObjectField("Alpha Material", aMaterial, typeof(Material), false) as Material;
            GUILayout.Space(10);

            if (mode == 0)
            {
                if (GUILayout.Button("BuildScene"))
                {
                    if (rgbRenderTexture == null)
                    {
                        rgbRenderTexture = new RenderTexture(size, size, depth);
                        AssetDatabase.CreateAsset(rgbRenderTexture, outputPath + "/" + outputTextureName + "_RGB.renderTexture");
                    }
                    if (aRenderTexture == null)
                    {
                        aRenderTexture = new RenderTexture(size, size, depth);
                        AssetDatabase.CreateAsset(aRenderTexture, outputPath + "/" + outputTextureName + "_A.renderTexture");
                    }

                    GameObject camera_obj = new GameObject(outputTextureName + "_RGB_camera");
                    SetupCamera(camera_obj, rgbRenderTexture);

                    GameObject camera_a_obj = new GameObject(outputTextureName + "_A_camera");
                    SetupCamera(camera_a_obj, aRenderTexture);

                    string     targetName = outputTextureName + "_target";
                    GameObject target     = GameObject.Find(targetName);
                    if (target == null)
                    {
                        target      = Instantiate(AssetDatabase.LoadAssetAtPath <GameObject>("Assets/Example/Matcap/Ball_High.fbx"));
                        target.name = targetName;
                    }

                    target.GetComponent <Renderer>().sharedMaterial = rgbMaterial;

                    camera_obj.transform.Translate(0, 0, 5);
                    camera_obj.transform.LookAt(target.transform);
                    camera_a_obj.transform.Translate(0, 0, 5);
                    camera_a_obj.transform.LookAt(target.transform);

                    SceneView.RepaintAll();
                    AssetDatabase.Refresh();
                }
                if (GUILayout.Button("Selected Camera Aim Target"))
                {
                    CameraAim("");
                }
                if (GUILayout.Button("Swap Material"))
                {
                    SwapMaterial();
                }
            }
            else if (mode == 1)
            {
                if (GUILayout.Button("BuildScene_RGB"))
                {
                    if (rgbRenderTexture == null)
                    {
                        rgbRenderTexture = new RenderTexture(size, size, depth);
                        AssetDatabase.CreateAsset(rgbRenderTexture, outputPath + "/" + outputTextureName + "_RGB.renderTexture");
                    }

                    GameObject camera_obj = new GameObject(outputTextureName + "_RGB_camera");
                    SetupCamera(camera_obj, rgbRenderTexture);

                    string     targetName = outputTextureName + "_RGB_target";
                    GameObject target     = GameObject.Find(targetName);
                    if (target == null)
                    {
                        target      = Instantiate(AssetDatabase.LoadAssetAtPath <GameObject>("Assets/Example/Matcap/Ball_High.fbx"));
                        target.name = targetName;
                    }

                    target.GetComponent <Renderer>().sharedMaterial = rgbMaterial;

                    camera_obj.transform.Translate(0, 0, 5);
                    camera_obj.transform.LookAt(target.transform);

                    SceneView.RepaintAll();
                    AssetDatabase.SaveAssets();
                }

                if (GUILayout.Button("BuildScene_A"))
                {
                    if (aRenderTexture == null)
                    {
                        aRenderTexture = new RenderTexture(size, size, depth);
                        AssetDatabase.CreateAsset(aRenderTexture, outputPath + "/" + outputTextureName + "_A.renderTexture");
                    }

                    GameObject camera_obj = new GameObject(outputTextureName + "_A_camera");
                    SetupCamera(camera_obj, aRenderTexture);

                    string     targetName = outputTextureName + "_A_target";
                    GameObject target     = GameObject.Find(targetName);
                    if (target == null)
                    {
                        target      = Instantiate(AssetDatabase.LoadAssetAtPath <GameObject>("Assets/Example/Matcap/Ball_High.fbx"));
                        target.name = targetName;
                    }

                    target.GetComponent <Renderer>().sharedMaterial = aMaterial;

                    target.transform.Translate(10, 0, 0);
                    camera_obj.transform.Translate(10, 0, 5);
                    camera_obj.transform.LookAt(target.transform);

                    SceneView.RepaintAll();
                    AssetDatabase.SaveAssets();
                }

                EditorGUILayout.BeginHorizontal();
                {
                    if (GUILayout.Button("Selected Camera Aim RGB"))
                    {
                        CameraAim("_RGB");
                    }
                    if (GUILayout.Button("Selected Camera Aim A"))
                    {
                        CameraAim("_A");
                    }
                }
                EditorGUILayout.EndHorizontal();
            }

            EditorGUILayout.BeginHorizontal();
            {
                if (GUILayout.Button("Create Texture RGB"))
                {
                    SaveRenderTextureTool.SaveRenderTextureToPNG(rgbRenderTexture, outputPath, outputTextureName + "_RGB");
                    AssetDatabase.Refresh();
                }
                if (GUILayout.Button("Create Texture A"))
                {
                    SaveRenderTextureTool.SaveRenderTextureToPNG(aRenderTexture, outputPath, outputTextureName + "_A");
                    AssetDatabase.Refresh();
                }
                if (mode == 1)
                {
                    if (GUILayout.Button("Create Texture RGBA"))
                    {
                        Texture2D rgb = SaveRenderTextureTool.SaveRenderTextureToTexture2D(rgbRenderTexture);

                        Texture2D a = SaveRenderTextureTool.SaveRenderTextureToTexture2D(aRenderTexture);

                        if (rgb == null)
                        {
                            EditorUtility.DisplayDialog("Error", "rgbRenderTexture saved in Texture2D is null", "OK");
                            return;
                        }
                        if (a == null)
                        {
                            EditorUtility.DisplayDialog("Error", "aRenderTexture saved in Texture2D is null", "OK");
                            return;
                        }

                        Texture2D texture = TextureCombineTool.CombineRGBAndASameSize(rgb, a);
                        EditorExtUtil.SaveTexture2DtoFile(texture, outputPath, outputTextureName, EditorExtUtil.SavingTextureFormat.PNG, true);
                        AssetDatabase.Refresh();
                    }
                }
            }
            EditorGUILayout.EndHorizontal();
        }
        /// <summary>
        /// 将地形中的颜色信息导出给材质,将会导出混合图(PNG),支持最多4套贴图混合,多余信息不导出
        /// </summary>
        /// <param name="terrain"></param>
        /// <param name="targetMaterial">目标材质,必须是<c>S3Unity/terrainBlend</c></param>
        /// <param name="splatMapPathWithoutExt">导出混合图的路径</param>
        public static void ExportToMaterial(Terrain terrain, Material targetMaterial, string splatMapPathWithoutExt)
        {
            if (terrain == null)
            {
                Debug.LogError("[TerrainMaterialConvertTool] ExportToMaterial: Terrain is null");
                return;
            }

            if (targetMaterial == null)
            {
                Debug.LogError("[TerrainMaterialConvertTool] ExportToMaterial: Target material is null");
                return;
            }

            if (targetMaterial.shader.name != "S3Unity/terrainBlend")
            {
                Debug.LogError("[TerrainMaterialConvertTool] ExportToMaterial: Target material shader error");
                return;
            }

            TerrainData terrainData = terrain.terrainData;

            TerrainLayer[] layers   = terrainData.terrainLayers;
            Texture2D      splatMap = terrainData.GetAlphamapTexture(0);
            string         filePath = EditorExtUtil.SaveTexture2DtoFile(splatMap, splatMapPathWithoutExt, EditorExtUtil.SavingTextureFormat.PNG, false);

            if (filePath == null || !File.Exists(filePath))
            {
                Debug.LogError("[TerrainMaterialConvertTool] ExportToMaterial: Splat map export error");
                return;
            }

            bool      hasNormalMap = false;
            bool      hasRMMap     = false;
            Texture2D newSplatMap  = AssetDatabase.LoadAssetAtPath <Texture2D>(filePath);

            targetMaterial.SetTexture("tBlendingMap", newSplatMap);
            Vector4 rmi = targetMaterial.GetVector("_RMMapIntensity");

            for (int i = 0; i < Mathf.Min(layers.Length, Max_Layers_Count); i++)
            {
                TerrainLayer layer = layers[i];
                targetMaterial.SetTexture($"tDetailMap{i}", layer.diffuseTexture);
                //terrainData.size.xyz: width, height, length
                //DO NOT USE SetVector to set tex_ST
                targetMaterial.SetTextureScale($"tDetailMap{i}", new Vector2(SafeDivide(terrainData.size.x, layer.tileSize.x), SafeDivide(terrainData.size.z, layer.tileSize.y)));
                targetMaterial.SetTextureOffset($"tDetailMap{i}", new Vector2(SafeDivide(layer.tileOffset.x, layer.tileSize.x), SafeDivide(layer.tileOffset.y, layer.tileSize.y)));
                //Set map to null to remove old map
                targetMaterial.SetTexture($"tBumpMap{i}", layer.normalMapTexture);
                if (layer.normalMapTexture != null)
                {
                    hasNormalMap = true;
                }
                targetMaterial.SetTexture($"tSpecularRM{i}", layer.maskMapTexture);
                targetMaterial.SetFloat($"_metallic{i}", layer.metallic);
                targetMaterial.SetFloat($"_glossiness{i}", layer.smoothness);
                if (layer.maskMapTexture == null)
                {
                    rmi[i] = 0;
                }
                else
                {
                    rmi[i]   = 1;
                    hasRMMap = true;
                }
            }
            targetMaterial.SetVector("_RMMapIntensity", rmi);
            EditorExtUtil.SetMaterialKeyword(targetMaterial, "BUMPMAP", hasNormalMap, true);
            EditorExtUtil.SetMaterialKeyword(targetMaterial, "_RMMAP_ON", hasRMMap, true);
        }