/// <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); }
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(); } }
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); }