untiy 為預制體動態加載光照貼圖

unity版本為2021.8
預制體不能攜帶光照貼圖信息,只能我們自己準備了
多方查找加自己摸索終于找到了適合新版本的解決方案,直接貼代碼

將這個腳本掛到預制體的最上級

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;[System.Serializable]
public struct RendererInfo
{public Renderer renderer;//網格物體  網格和地形的光照信息是分開的public Terrain terrain;//地形public int lightmapIndex;public Vector4 lightmapScaleScaleOffset;
}
//記錄光照貼圖的信息
public class PrefabLightmapData : MonoBehaviour
{public RendererInfo[] m_RendererInfo;public Texture2D[] m_Lightmaps_light;//顏色貼圖public Texture2D[] m_Lightmaps_dir;//方向貼圖public Texture2D[] m_Lightmaps_shadowmask;//陰影貼圖private void Awake() {RebuildLight();}public void RebuildLight(){if (m_RendererInfo == null || m_RendererInfo.Length == 0) return;LightmapData[] lightmapDataArray = new LightmapData[m_Lightmaps_light.Length];for (int i = 0; i < m_Lightmaps_light.Length; i++){LightmapData lightmapData = new LightmapData();if (i < m_Lightmaps_light.Length) lightmapData.lightmapColor = m_Lightmaps_light[i];if (i < m_Lightmaps_dir.Length) lightmapData.lightmapDir = m_Lightmaps_dir[i];if (i < m_Lightmaps_shadowmask.Length) lightmapData.shadowMask = m_Lightmaps_shadowmask[i];lightmapDataArray[i] = lightmapData;}//為預制體的物體應用光照貼圖ApplyRendererInfo(m_RendererInfo);LightmapSettings.lightmaps = lightmapDataArray;//將光照貼圖應用到Untiy}//應用光照貼圖信息到重建的預制體private void ApplyRendererInfo(RendererInfo[] rendererInfoArray){for (int i = 0; i < rendererInfoArray.Length; i++){RendererInfo rendererInfo = rendererInfoArray[i];if (rendererInfo.renderer != null){rendererInfo.renderer.lightmapIndex = rendererInfo.lightmapIndex;rendererInfo.renderer.lightmapScaleOffset = rendererInfo.lightmapScaleScaleOffset;}else if (rendererInfo.terrain != null){rendererInfo.terrain.lightmapIndex = rendererInfo.lightmapIndex;rendererInfo.terrain.lightmapScaleOffset = rendererInfo.lightmapScaleScaleOffset;}}}
}
//自定義inspector面板
[CustomEditor(typeof(PrefabLightmapData))]
public class PrefabLightmapData_Inspector : Editor
{//重寫OnInspectorGUI類(刷新Inspector面板)public override void OnInspectorGUI(){//繼承基類方法base.OnInspectorGUI();PrefabLightmapData myScript = (PrefabLightmapData)target;//繪制ButtonRect rect = new Rect(0, 0,100,50);if (GUILayout.Button("重新構建烘焙光照")){myScript.RebuildLight();}}
}

在使用下方的腳本完成烘焙后,腳本將自動記錄所有模型和地形的烘焙信息,并在運行后自動重建光照貼圖,如果我們需要在不運行時查看光照貼圖效果,可以手動點擊“重新構建烘焙光照”的按鈕
在這里插入圖片描述

重寫烘焙,烘焙完成后自動準備重建光照貼圖所需要的信息

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public static class BackeLightMap
{[UnityEditor.MenuItem("Tools/光照/烘焙光照貼圖")]private static void GenerateLightmapInfo(){//必須不能是自動烘焙if (UnityEditor.Lightmapping.giWorkflowMode != UnityEditor.Lightmapping.GIWorkflowMode.OnDemand){Debug.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");return;}//烘焙貼圖UnityEditor.Lightmapping.Bake();//找到有這個腳本的物體PrefabLightmapData[] prefabs = Object.FindObjectsOfType<PrefabLightmapData>();foreach (var prefabInScene in prefabs){GameObject scenePrefab = prefabInScene.gameObject;List<RendererInfo> rendererInfos = new List<RendererInfo>();//重建光照貼圖時需要的信息List<Texture2D> lightmaps_light = new List<Texture2D>();//所有的光照貼圖List<Texture2D> lightmaps_dir = new List<Texture2D>();//所有的光照貼圖List<Texture2D> lightmaps_shadowmask = new List<Texture2D>();//所有的光照貼圖GenerateLightmapInfo(scenePrefab, rendererInfos, lightmaps_light, lightmaps_dir, lightmaps_shadowmask);//獲取當前物體的光照貼圖信息和光照貼圖//為光照貼圖信息和光照貼圖賦值prefabInScene.m_RendererInfo = rendererInfos.ToArray();prefabInScene.m_Lightmaps_light = lightmaps_light.ToArray();prefabInScene.m_Lightmaps_dir = lightmaps_dir.ToArray();prefabInScene.m_Lightmaps_shadowmask = lightmaps_shadowmask.ToArray();//替換掉已經保存的預制體GameObject sourcePrefab = UnityEditor.PrefabUtility.GetPrefabParent(prefabInScene) as GameObject;//GameObject sourcePrefab = UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(scenePrefab);if (sourcePrefab != null){UnityEditor.PrefabUtility.ReplacePrefab(scenePrefab, sourcePrefab);}}}//點擊按鈕生成光照貼圖信息private static void GenerateLightmapInfo(GameObject root, List<RendererInfo> rendererInfoList, List<Texture2D> lightmaps_light, List<Texture2D> lightmaps_dir, List<Texture2D> lightmaps_shadowmask){//找到這個物體的所有網格MeshRenderer[] renderers = root.GetComponentsInChildren<MeshRenderer>();//遍歷網格foreach (MeshRenderer meshRenderer in renderers){if (meshRenderer.lightmapIndex != -1){//收集光照貼圖信息RendererInfo rendererInfo = new RendererInfo();rendererInfo.renderer = meshRenderer;rendererInfo.lightmapIndex = meshRenderer.lightmapIndex;rendererInfo.lightmapScaleScaleOffset = meshRenderer.lightmapScaleOffset;//收集光照貼圖//顏色貼圖Texture2D lightmap_light = LightmapSettings.lightmaps[meshRenderer.lightmapIndex].lightmapColor;AddLightMapToCheach(lightmaps_light, lightmap_light);//方向貼圖Texture2D lightmap_dir = LightmapSettings.lightmaps[meshRenderer.lightmapIndex].lightmapDir;AddLightMapToCheach(lightmaps_dir, lightmap_dir);//shadowmaskTexture2D lightmap_shadowmask = LightmapSettings.lightmaps[meshRenderer.lightmapIndex].shadowMask;AddLightMapToCheach(lightmaps_shadowmask,lightmap_shadowmask);//光照信息rendererInfoList.Add(rendererInfo);}}//找到這個物體的所有網格Terrain[] terrains = root.GetComponentsInChildren<Terrain>();//遍歷網格foreach (Terrain terrain in terrains){if (terrain.lightmapIndex != -1){//收集光照貼圖信息RendererInfo rendererInfo = new RendererInfo();rendererInfo.terrain = terrain;rendererInfo.lightmapIndex = terrain.lightmapIndex;rendererInfo.lightmapScaleScaleOffset = terrain.lightmapScaleOffset;//收集光照貼圖//顏色貼圖Texture2D lightmap_light = LightmapSettings.lightmaps[terrain.lightmapIndex].lightmapColor;AddLightMapToCheach(lightmaps_light, lightmap_light);//方向貼圖Texture2D lightmap_dir = LightmapSettings.lightmaps[terrain.lightmapIndex].lightmapDir;AddLightMapToCheach(lightmaps_dir, lightmap_dir);//shadowmaskTexture2D lightmap_shadowmask = LightmapSettings.lightmaps[terrain.lightmapIndex].shadowMask;AddLightMapToCheach(lightmaps_shadowmask, lightmap_shadowmask);//光照信息rendererInfoList.Add(rendererInfo);}}}//將一個光照貼圖添加進緩存private static void AddLightMapToCheach(List<Texture2D> list,Texture2D texture){if (texture == null) return;int index = list.IndexOf(texture);//查找已有的集合里有沒有這個元素,如果沒有,返回-1if (index == -1){list.Add(texture);}}
}

工具欄里會出現烘焙按鈕,點擊烘焙光照貼圖,不要再用Unity自己的烘焙了,為場景中所有掛載了PrefabLightmapData 的預制體烘焙光照
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10026.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

美顏SDK是什么?深度學習技術在直播美顏SDK中的應用探析

美顏SDK的出現為直播、視頻通話等應用提供了強大的美顏功能。接下來&#xff0c;我們將一同探討美顏SDK的概念&#xff0c;以及深度學習技術在直播美顏SDK中的應用。 一、什么是美顏SDK&#xff1f; 美顏SDK是一種軟件開發工具包&#xff0c;旨在為開發者提供便捷而強大的美顏…

四大誤區:中臺產品時設計你中招了幾個?

01 誤區一&#xff1a;管理系統分析工具數字化中臺 傳統企業在經營管理過程中會根據業務或管理需求&#xff0c;不斷添加和升級諸如OA、CRM等不同類別的管理系統。 為了更好地響應前臺的業務需求&#xff0c;有些企業成立了新的或擴大、加強了原有的技術部門&#xff0c;由…

LeetCode 題目 116:填充每個節點的下一個右側節點指針

作者介紹&#xff1a;10年大廠數據\經營分析經驗&#xff0c;現任字節跳動數據部門負責人。 會一些的技術&#xff1a;數據分析、算法、SQL、大數據相關、python&#xff0c;歡迎探討交流 歡迎加入社區&#xff1a;碼上找工作 作者專欄每日更新&#xff1a; LeetCode解鎖1000題…

C#上位機1ms級高精度定時任務

precisiontimer 安裝擴展包 添加引用 完整代碼 using PrecisionTiming;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; us…

WinSCP軟件出錯:連接被意外關閉了

問題描述&#xff1a; WinSCP 登錄 M3568 的 linux系統&#xff0c;提示 列出’/home/root’的目錄項時出錯&#xff0c;連接被意外關閉 具體提示如下圖所示&#xff0c;列出’/home/root’的目錄項時出錯。 連接被意外關閉了 服務器發送命令的退出狀態255 原因及解決&#xf…

notepad++安裝 hex-editor插件

打開notepad 點擊插件 搜索 hex-editor,點擊右側 安裝install 安裝成功后&#xff0c;在已安裝插件中就有顯示了

spring boot參數驗證注解@NotNull、@NotBlank和@NotEmpty區別

目錄 前言說明舉例 前言 使用spring boot參數驗證是常常會使用NotNull、NotBlank和NotEmpty三個判斷是否不為空的注解&#xff0c;中文都有不能為空的意思&#xff0c;大部分使用者都傻傻分清它們之間到底有什么區別。今天就讓咱們來一起探索它們之間的不同吧。 說明 注解名…

等保測評安全物理環境測評講解

等保測評中的安全物理環境測評主要關注信息系統的物理安全保護措施&#xff0c;確保機房、設備和數據的物理安全。以下是安全物理環境測評的關鍵點講解&#xff1a; 1. **物理位置選擇**&#xff1a; - 機房應選擇在具有防震、防風和防雨能力的建筑內。 - 應避免設在建筑…

【數據庫】數據庫指令

一。數據庫打開 1.命令行 2.進入mysql mysql -uroot -p密碼 3.退出 exit&#xff1b; 二。針對數據庫的操作 1.創建數據庫&#xff08;有分號&#xff09; create database student; 2.使用數據庫 use student 3.刪除數據庫&#xff08;有分號&#xff09; drop database…

verilog基礎語法之數據類型

verilog基礎語法之數據類型 1、 wire類型2、 reg類型3、向量 Verilog最常用的數據類型有兩種&#xff1a;線網&#xff08;wire&#xff09;和寄存器&#xff08;reg&#xff09;。其中&#xff0c;wire 類型表示硬件單元之間的物理連線&#xff0c;reg用來表示存儲單元。 1、…

數據庫調優-數據庫優化

數據庫優化 如何發現復雜的SQL有問題&#xff1f; 一個個去explain嗎&#xff1f;你有沒有這樣的困惑&#xff0c;開發代碼運行順暢絲滑&#xff0c;上生產了卻卡的一逼&#xff1f; 哈哈&#xff0c;相信大家都會遇到這樣的問題&#xff01; sql 復制代碼 # 舉個栗子&…

4. 從感知機到神經網絡

目錄 1. 從感知機到神經網絡 2. 最簡單的神經網絡 3. 激活函數的引入 1. 從感知機到神經網絡 之前章節我們了解了感知機&#xff0c;感知機可以處理與門、非與門、或門、異或門等邏輯運算&#xff1b;不過在感知機中設定權重的工作是由人工來做的&#xff0c;而設定合適的&a…

【將Maven源改為國內阿里云鏡像源】

目錄 一、如何配置Maven鏡像源&#xff1f; 二、Idea中的Maven配置 ?三、項目與你本地倉庫和中央倉庫的聯系 一、如何配置Maven鏡像源&#xff1f; 1、打開你的Maven用戶設置文件(settings.xml)。默認情況下&#xff0c;該文件存在于你的用戶目錄下的.m2文件夾中。如果你沒…

小程序內使用web-view組件嵌套H5頁面,當H5頁面更換了內容后,小程序里的h5頁面不更新

這個問題是由于小程序緩存了H5的內容造成的&#xff0c;可以在H5鏈接后面拼接個參數&#xff0c;加上時間戳可做用于H5的版本號&#xff0c;這樣每次訪問都可以全新的鏈接展示內容避免緩存&#xff0c;代碼如下wxml&#xff1a; <view> <web-view src"{{urlpath…

Kafka 執行命令超時異常: Timed out waiting for a node assignment

Kafka 執行命令超時異常&#xff1a; Timed out waiting for a node assignment 問題描述&#xff1a; 搭建了一個kafka集群環境&#xff0c;在使用命令行查看已有topic時&#xff0c;報錯如下&#xff1a; [rootlocalhost bin]# kafka-topics.sh --list --bootstrap-server…

《機器學習by周志華》學習筆記-決策樹-01

本書中的「決策樹」有時指學習方法,有時指學得的樹。 1、基本流程 1.1、概念 基本流程,亦稱「判定樹」 決策樹(decision tree),是一種常見的機器學習方法。以二分類任務為例,我們希望從給定訓練數據集學得一個模型,用以對新樣例進行分離。 以二分類任務為例,可看作對…

一圖看懂 | 藍卓煤炭行業解決方案

煤炭是我國能源保障的“壓艙石,也是國民經濟中重要的支柱產業之一無論是發電、建材、造紙、冶金、化工等工業領域都離不開煤炭近年來&#xff0c;在“雙碳”及能源安全雙重背景下推動智能化技術與煤炭產業的融合發展提升煤礦安全生產能力的重要性與日俱增智慧礦山的建設已逐漸成…

CentOS 7安裝配置docker

CentOS 7、8安裝、配置docker 這里宿主機的型號選擇是centos7.9.2009的版本 1.宿主機關閉防火墻和selinux&#xff0c;配置ipv4 #設置SELinuxdisabled vim /etc/selinux/config SELinuxdisabled 查看防火墻狀態&#xff1a;firewall-cmd --state 關閉防火墻&#xff1a;syst…

selenium爬取TapTap評論

上一篇寫的beautifulsoup和request爬取出的結果有誤。首先&#xff0c;TapTap網頁以JS格式解析&#xff0c;且評論并沒有“下一頁”&#xff0c;而是每次加載到底部就要進行等待重新加載。我們需要做的&#xff0c;是模仿瀏覽器的行為&#xff0c;所以這里我們用Selenium的方式…

2024年數維杯B題完整代碼和思路論文講解與分析

2024數維杯數學建模完整代碼和成品論文已更新&#xff0c;獲取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/bgic2nbxs2h41pvt?singleDoc# 2024數維杯數學建模B題45頁論文和代碼已完成&#xff0c;代碼為全部問題的代碼 論文包括摘要、問題重述、問題分析、模型假設、…