




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文由麦可网收集整理,转载请注明出处。Unity烘焙材质到单一贴图的脚本这个脚本由 CocoaChina 版主 “四角钱” 分享,可以将复杂的材质(比如有法线贴图的材质)进行烘焙,转变为单一的贴图。可用来将 Unity 的游戏移植到移动平台时候使用。请将脚本放 Editor 文件夹里,使用时选择一个 Material 材质,然后在菜单种Custom/Bake Material打开并调整照明和其他参数,点击Bake按钮就会生成一个单一的贴图。class BakeMaterialSettingsprivate static var kEditorPrefsName = BakeMaterialSettings;static var kBakingLayerShouldBeUnusedInScene = 30;static var kStandardTexNames = new Array (_MainTex, _BumpMap, _Detail, _ParallaxMap, _Parallax);var bakeAlpha = false;var bakeMainTexAsWhite = false;var minTextureResolution = 8;var maxTextureResolution = 2048;var emptyScene = false;var useCustomLights = false;var ambient = Color.black;static var kLights = 3;var enableLight = new booleankLights;var colorLight = new ColorkLights;var dirLight = new Vector2kLights;function BakeMaterialSettings ()Load ();function Load ()bakeAlpha = EditorPrefs.GetBool(kEditorPrefsName + .bakeAlpha);bakeMainTexAsWhite = EditorPrefs.GetBool(kEditorPrefsName + .bakeMainTexAsWhite);minTextureResolution = EditorPrefs.GetInt(kEditorPrefsName + .minTextureResolution, 8);maxTextureResolution = EditorPrefs.GetInt(kEditorPrefsName + .maxTextureResolution, 2048);emptyScene = EditorPrefs.GetBool(kEditorPrefsName + .emptyScene);useCustomLights = EditorPrefs.GetBool(kEditorPrefsName + .useCustomLights);ambient.r = EditorPrefs.GetFloat(kEditorPrefsName + .ambient.r);ambient.g = EditorPrefs.GetFloat(kEditorPrefsName + .ambient.g);ambient.b = EditorPrefs.GetFloat(kEditorPrefsName + .ambient.b);ambient.a = EditorPrefs.GetFloat(kEditorPrefsName + .ambient.a, 1.0f);for (var q = 0; q kLights; +q)enableLightq = EditorPrefs.GetBool(kEditorPrefsName + .enableLight + q);colorLightq.r = EditorPrefs.GetFloat(kEditorPrefsName + .color.r + q, 0.5f);colorLightq.g = EditorPrefs.GetFloat(kEditorPrefsName + .color.g + q, 0.5f);colorLightq.b = EditorPrefs.GetFloat(kEditorPrefsName + .color.b + q, 0.5f);colorLightq.a = EditorPrefs.GetFloat(kEditorPrefsName + .color.a + q, 1.0f);dirLightq.x = EditorPrefs.GetFloat(kEditorPrefsName + .dir.x + q);dirLightq.y = EditorPrefs.GetFloat(kEditorPrefsName + .dir.y + q);function Save ()EditorPrefs.SetBool(kEditorPrefsName + .bakeAlpha, bakeAlpha);EditorPrefs.SetBool(kEditorPrefsName + .bakeMainTexAsWhite, bakeMainTexAsWhite);EditorPrefs.SetInt(kEditorPrefsName + .minTextureResolution, minTextureResolution);EditorPrefs.SetInt(kEditorPrefsName + .maxTextureResolution, maxTextureResolution);EditorPrefs.GetBool(kEditorPrefsName + .emptyScene, emptyScene);EditorPrefs.SetBool(kEditorPrefsName + .useCustomLights, useCustomLights);EditorPrefs.SetFloat(kEditorPrefsName + .ambient.r, ambient.r);EditorPrefs.SetFloat(kEditorPrefsName + .ambient.g, ambient.g);EditorPrefs.SetFloat(kEditorPrefsName + .ambient.b, ambient.b);EditorPrefs.SetFloat(kEditorPrefsName + .ambient.a, ambient.a);for (var q = 0; q kLights; +q)EditorPrefs.SetBool(kEditorPrefsName + .enableLight + q, enableLightq);EditorPrefs.SetFloat(kEditorPrefsName + .color.r + q, colorLightq.r);EditorPrefs.SetFloat(kEditorPrefsName + .color.g + q, colorLightq.g);EditorPrefs.SetFloat(kEditorPrefsName + .color.b + q, colorLightq.b);EditorPrefs.SetFloat(kEditorPrefsName + .color.a + q, colorLightq.a);EditorPrefs.SetFloat(kEditorPrefsName + .dir.x + q, dirLightq.x);EditorPrefs.SetFloat(kEditorPrefsName + .dir.y + q, dirLightq.y);class BakeMaterial extends EditorWindowprivate static var kMateriBakeNodeName = _MateriaBakeSetup;private static var kWindowMinSize = Vector2 (300, 386);private static var settings : BakeMaterialSettings;private static var visible : boolean = false;private var camera : GameObject;private var plane : GameObject;private var previewTexture : Texture;private var lights : GameObject = new GameObjectBakeMaterialSettings.kLights;private var stateChanged = false;private var texViewScrollPosition = Vector2.zero;private var lastMaterial : Material;private var originalScene = ;private var scheduleBakeOnNextUpdate = false;private function SetupScene ()DestroyScene ();var oldGo = GameObject.Find(kMateriBakeNodeName);if (oldGo)DestroyImmediate (oldGo);camera = new GameObject (kMateriBakeNodeName, Camera);plane = GameObject.CreatePrimitive (PrimitiveType.Plane);var cam = camera;cam.camera.backgroundColor = Color.black;cam.camera.clearFlags = CameraClearFlags.SolidColor;cam.camera.orthographic = true;cam.camera.orthographicSize = 5.0;cam.camera.cullingMask = 1 settings.kBakingLayerShouldBeUnusedInScene;plane.transform.parent = cam.transform;plane.transform.position = Vector3.forward * 10.0;plane.transform.rotation = Quaternion.Euler (0, 0, 180) * Quaternion.Euler (-90, 0, 0);plane.layer = settings.kBakingLayerShouldBeUnusedInScene;for (var l in lights)l = new GameObject (Light, Light);l.light.type = LightType.Directional;l.light.cullingMask = 1 settings.kBakingLayerShouldBeUnusedInScene;l.transform.parent = cam.transform;l.active = false;private function UpdateScene (m : Material)for (q = 0; q settings.kLights; +q)lightsq.active = settings.useCustomLights & settings.enableLightq;lightsq.light.color = settings.colorLightq;lightsq.transform.rotation = Quaternion.AngleAxis(settings.dirLightq.x, Vector3.up) *Quaternion.AngleAxis(settings.dirLightq.y, Vector3.right);if (settings.useCustomLights)RenderSettings.ambientLight = settings.ambient;else if (settings.emptyScene)RenderSettings.ambientLight = Color.white;plane.renderer.material = m;private function DestroyScene ()GameObject.DestroyImmediate (camera);GameObject.DestroyImmediate (plane);GameObject.DestroyImmediate (previewTexture);function UpdateMaterialPreview (m : Material) : RenderTextureif (!m)return;var saveAmbientLight = RenderSettings.ambientLight;var saveMainTexture = m.mainTexture;if (settings.bakeMainTexAsWhite)m.mainTexture = null;/ setupif (!camera)SetupScene ();camera.SetActiveRecursively(true);UpdateScene (m);var res = FindLargestTextureResolution (plane.renderer.sharedMaterial, settings.minTextureResolution, settings.maxTextureResolution);var rt = RenderCameraToRenderTexture (camera.camera, res.x, res.y);/ restorecamera.SetActiveRecursively(false);RenderSettings.ambientLight = saveAmbientLight;m.mainTexture = saveMainTexture;previewTexture = rt;return rt;function CaptureMaterial(m : Material)var matAssetPath = AssetDatabase.GetAssetPath (m);var assetPath = System.IO.Path.Combine (System.IO.Path.GetDirectoryName (matAssetPath), System.IO.Path.GetFileNameWithoutExtension (matAssetPath);var rt = UpdateMaterialPreview (m);RenderTextureToPNG (rt, settings.bakeAlpha, assetPath + .png);function OnEnable ()if (!settings)settings = new BakeMaterialSettings ();SetupScene ();visible = true;function OnDisable ()DestroyScene ();settings.Save ();visible = false;static function GetTargetMaterial () : Materialreturn EditorUtility.InstanceIDToObject (Selection.activeInstanceID) as Material;function OnSelectionChange ()Repaint ();function Update ()var rebuildScene = false;if (scheduleBakeOnNextUpdate)Bake ();scheduleBakeOnNextUpdate = false;rebuildScene = true;if (originalScene = & EditorApplication.currentScene = )settings.emptyScene = true;if (settings.emptyScene & originalScene = & EditorApplication.currentScene != )DestroyScene ();if (EditorApplication.SaveCurrentSceneIfUserWantsTo ()originalScene = EditorApplication.currentScene;EditorApplication.NewScene ();elsesettings.emptyScene = false;rebuildScene = true; else if (!settings.emptyScene & originalScene != )EditorApplication.OpenScene (originalScene);rebuildScene = true;originalScene = ;if (rebuildScene)SetupScene ();if (rebuildScene | stateChanged | !settings.emptyScene)UpdateMaterialPreview (lastMaterial);Repaint ();stateChanged = false;function OnGUI ()var material = GetTargetMaterial ();if (lastMaterial != material)UpdateMaterialPreview (material);if (material)lastMaterial = material;EditorGUILayout.BeginHorizontal();EditorGUILayout.BeginVertical(GUILayout.MaxWidth(200);if (!(originalScene = & EditorApplication.currentScene = )settings.emptyScene = !EditorGUILayout.BeginToggleGroup(Scene ligthing, !settings.emptyScene);EditorGUILayout.EndToggleGroup();settings.useCustomLights = EditorGUILayout.BeginToggleGroup(Custom lighting, settings.useCustomLights);if (settings.useCustomLights)EditorGUI.indentLevel = 1;settings.ambient = EditorGUILayout.ColorField(Ambient, settings.ambient);for (var q = 0; q settings.kLights; +q)settings.enableLightq = EditorGUILayout.BeginToggleGroup(Light, settings.enableLightq);EditorGUI.indentLevel = 2;settings.colorLightq = EditorGUILayout.ColorField(Color, settings.colorLightq);settings.dirLightq = EditorGUILayout.Vector2Field(Direction, settings.dirLightq);EditorGUILayout.EndToggleGroup();EditorGUI.indentLevel = 0;EditorGUILayout.EndToggleGroup();settings.bakeAlpha = EditorGUILayout.Toggle(Bake Alpha, settings.bakeAlpha);settings.bakeMainTexAsWhite = !EditorGUILayout.Toggle(MainTex, !settings.bakeMainTexAsWhite);settings.minTextureResolution = EditorGUILayout.IntField(Min Resolution, settings.minTextureResolution);settings.maxTextureResolution = EditorGUILayout.IntField(Max Resolution, settings.maxTextureResolution);settings.minTextureResolution = Mathf.Max(2, settings.minTextureResolution);settings.maxTextureResolution = Mathf.Max(settings.minTextureResolution, settings.maxTextureResolution);EditorGUILayout.BeginHorizontal();if (GUILayout.Button(Bake)CaptureMaterial (lastMaterial);if (GUILayout.Button(Bake Selected)scheduleBakeOnNextUpdate = true;EditorGUILayout.EndHorizontal();EditorGUILayout.EndVertical();texViewScrollPosition = EditorGUILayout.BeginScrollView (texViewScrollPosition);var r = GUILayoutUtility.GetAspectRect(1.0f);if (previewTexture)EditorGUI.DrawPreviewTexture(r, previewTexture);EditorGUILayout.EndScrollView(); EditorGUILayout.EndHorizontal();if (GUI.changed)stateChanged = true;MenuItem(Custom/Bake Material ., false, 5)static function CreateBakeEditor()var window = EditorWindow.GetWindow(BakeMaterial);window.title = Bake Material;window.minSize = kWindowMinSize;window.Show();MenuItem(Custom/Bake Selected Materials, false, 4)static function Bake()var instanceIDs = Selection.instanceIDs;var currentScene = EditorApplication.currentScene;var wasAlreadyVisible = BakeMaterial.visible;var window = EditorWindow.GetWindow(BakeMaterial);if (window.settings.emptyScene)if (!EditorApplication.SaveCurrentSceneIfUserWantsTo ()return;EditorApplication.NewScene ();window.SetupScene ();for (var i in instanceIDs)var m : Material = EditorUtility.InstanceIDToObject (i) as Material;if (m)window.CaptureMaterial (m);window.DestroyScene ();if (window.settings.emptyScene & currentScene)EditorApplication.OpenScene (currentScene);if (!wasAlreadyVisible)window.Close ();static function FindLargestTextureResolution (m : Ma
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物流配送工期目标保证措施
- 四有好老师信息技术融合心得体会
- 康复治疗计划结合物理疗法方法
- 院感科主任对感染预防职责
- 阳光幼儿园陪餐人员协作职责
- 肥胖及近视学生家庭干预措施
- 三年级英语课外阅读指导计划
- 小学四年级语文写作能力培养计划
- 企业营销推广策划合作合同
- 专业医疗设备销售与推广协议
- MSA测量系统分析第四版
- 围手术期质量评价标准(手术室)
- 化学品安全技术说明(胶水)
- 吊篮操作工岗位风险告知卡
- 输血法律法规培训PPT
- 海姆立克急救(生命的拥抱)课件
- 越南语基础实践教程1第二版完整版ppt全套教学教程最全电子课件整本书ppt
- 标准化项目部驻地建设方案(五星级)
- T∕ACEF 027-2021 农药污染地块土壤异味物质识别技术指南
- 建筑结构:高层建筑结构选型
- 软件系统平台对接接口方案计划
评论
0/150
提交评论