Unity中動態切換光照貼圖LightProbe的方法

關鍵代碼:LightmapSettings.lightmaps = lightmapDatas;

LightmapData中操作三張圖:lightmapColor,lightmapDir,以及一張ShadowMap

這里只操作前兩張:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class LightingSwitchBtn : MonoBehaviour
{public bool IsTurnOn = false;// / 光照信息LightmapData[] lightmapDatas;/// 暗的時候的貼圖public Texture2D[] lightmapDark;public Texture2D[] lightmapDarkDir;/// 亮的時候的貼圖public Texture2D[] lightmapLight;public Texture2D[] lightmapLightDir;void Awake(){}public void OnPointerClick(){Debug.Log("1111");SwichState();}public void SwichState(){Debug.Log("2222");bool ClickState = !IsTurnOn;if (ClickState){SetLightMap(lightmapLight, lightmapLightDir);}else{SetLightMap(lightmapDark, lightmapDarkDir);}IsTurnOn = ClickState;}public void SetLightMap(Texture2D[] lightmapTex, Texture2D[] lightmapDir){if (lightmapTex == null){return;}lightmapDatas = new LightmapData[lightmapTex.Length];for (int i = 0; i < lightmapTex.Length; i++){LightmapData lmd = new LightmapData();lmd.lightmapColor = lightmapTex[i];lmd.lightmapDir = lightmapDir[i];lightmapDatas[i] = lmd;}LightmapSettings.lightmaps = lightmapDatas;}}

更新光照貼圖后,還需要更新天空球,這里以HDRP管線為例,URP和build in同理:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.UI;public class LightingSwitchBtn : MonoBehaviour
{public bool IsTurnOn = false;LightmapData[] lightmapDatas;   /// 光照信息[Header("上午")] /// 亮的時候的貼圖public Texture2D[] lightmapLightDir;public Texture2D[] lightmapLight;[Header("下午")]  /// 暗的時候的貼圖public Texture2D[] lightmapDarkDir;public Texture2D[] lightmapDark;[Header("晚上")]/// 晚上的貼圖public Texture2D[] lightmapNightDir;public Texture2D[] lightmapNight;[Header("天空")]public Texture SkyAM;public Texture SkyPM;public Texture SkyNight;[Header("Volume組件")]public Volume myVolume;public Texture mySkyTex;private HDRISky hdriSky;[Range(0,1)]public float TimeSwitch = 0;#region BoolIsTurnOn// public void SwichState()// {//     Debug.Log("啊啊啊");//     bool ClickState = !IsTurnOn;//     if (ClickState)//     {//         SetLightMap(lightmapLight, lightmapLightDir);//     }//     else//     {//         SetLightMap(lightmapDark, lightmapDarkDir);//     }//     IsTurnOn = ClickState;// }#endregion//天空切換void Awake(){VolumeProfile volumeProfile = myVolume.profile;volumeProfile.TryGet<HDRISky>(out hdriSky);mySkyTex = hdriSky.hdriSky.value;}//光照貼圖切換public void AM_Time(){Debug.Log("AM");SetLightMap(lightmapLight, lightmapLightDir);hdriSky.hdriSky.value = SkyAM;}public void PM_Time(){Debug.Log("PM");SetLightMap(lightmapDark, lightmapDarkDir);hdriSky.hdriSky.value = SkyPM;}public void Night_Time(){Debug.Log("Night");SetLightMap(lightmapNight, lightmapNightDir);hdriSky.hdriSky.value = SkyNight;}public void SetLightMap(Texture2D[] lightmapTex, Texture2D[] lightmapDir){if (lightmapTex == null){return;}lightmapDatas = new LightmapData[lightmapTex.Length];for (int i = 0; i < lightmapTex.Length; i++){LightmapData lmd = new LightmapData();lmd.lightmapColor = lightmapTex[i];lmd.lightmapDir = lightmapDir[i];lightmapDatas[i] = lmd;}LightmapSettings.lightmaps = lightmapDatas;}}

以上是光照貼圖部分的切換,但是這樣會有個問題,就是光照貼圖并不會影響到新加入的模型的漫反射,因為三個時段的漫反射是由冷到暖的顏色上的變化,如果你沒有更新LightProbe的信息,那么你加入的模型必定會是很突兀的,如下圖所示:

很明顯新加入的沙發并沒有暖色調影響到它,那是因為缺少LightProbe的更新,那么如果我們想更新三個時段的LightProbe,就需要將三個時段的的LightProbe保存為Asset,然后去動態加載它;

以下是將LightProbe保存為Asset的資源腳本:

using UnityEditor;
using UnityEngine;public class LightProbeAssetCreator : EditorWindow
{[MenuItem("Assets/Create/Light Probe Asset")]static void CreateLightProbeAsset(){// 獲取當前場景中的光照探針數據LightProbes lightProbes = LightmapSettings.lightProbes;// 確保光照探針對象存在if (lightProbes != null){// 創建一個新的實例并將其保存為資產LightProbes lightProbesCopy = Instantiate(lightProbes);// 將實例化的光照探針保存為新資產AssetDatabase.CreateAsset(lightProbesCopy, "Assets/Arts/Scence/LightProbe/lightProbe.asset");// 刷新 AssetDatabase,以確保資產立即出現在項目視圖中AssetDatabase.SaveAssets();AssetDatabase.Refresh();// 輸出成功消息Debug.Log("Light Probe Asset created at Assets/lightProbe.asset");}else{Debug.LogError("No Light Probes found in LightmapSettings.");}}
}

動態加載LightProbe資產的腳本:

//using EH;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using System.Collections.Generic;
using UnityEditor;public class LightingSwitchBtn : MonoBehaviour
{LightmapData[] lightmapDatas;   /// 光照信息[Header("上午")] /// 亮的時候的貼圖public Texture2D[] lightmapLightDir;public Texture2D[] lightmapLight;[Header("下午")]  /// 暗的時候的貼圖public Texture2D[] lightmapDarkDir;public Texture2D[] lightmapDark;[Header("晚上")]/// 晚上的貼圖public Texture2D[] lightmapNightDir;public Texture2D[] lightmapNight;[Header("天空")]public Texture SkyAM;public Texture SkyPM;public Texture SkyNight;[Header("Volume組件")]public Volume myVolume;public Texture mySkyTex;private HDRISky hdriSky;[Header("直線光")]public Light RealLight;public float Temperature_AM = 5800;public float Intensity_AM = 10;[Space(10)]public float Temperature_PM = 5200;public float Intensity_PM = 20;[Space(10)]public float Temperature_Night = 7500;public float Intensity_Night = 10;[Header("RenderTex")]public RenderTexture RTX01;public RenderTexture RTX02;public Material myMat;[Range(0,1)]public float TimeSwitch = 0;[Header("漫反射(Light Probes Group)")]public LightProbes loadedLightProbes;public string assetPath_AM = "Assets/Arts/Scence/LightProbe/lightProbe_AM.asset";public string assetPath_PM = "Assets/Arts/Scence/LightProbe/lightProbe_PM.asset";public string assetPath_Night = "Assets/Arts/Scence/LightProbe/lightProbe_Night.asset";//天空切換void Awake(){//FW.Get<EffectMgr>().lightControl = this;VolumeProfile volumeProfile = myVolume.profile;volumeProfile.TryGet<HDRISky>(out hdriSky);mySkyTex = hdriSky.hdriSky.value;}//光照貼圖切換public void AM_Time(){Debug.Log("AM");SetLightMap(lightmapLight, lightmapLightDir);hdriSky.hdriSky.value = SkyAM;LightDirCol(Temperature_AM,Intensity_AM);LoadLightProbe( assetPath_AM);}public void PM_Time(){Debug.Log("PM");SetLightMap(lightmapDark, lightmapDarkDir);hdriSky.hdriSky.value = SkyPM;LightDirCol(Temperature_PM,Intensity_PM);LoadLightProbe( assetPath_PM);}public void Night_Time(){Debug.Log("Night");SetLightMap(lightmapNight, lightmapNightDir);hdriSky.hdriSky.value = SkyNight;LightDirCol(Temperature_Night,Intensity_Night);LoadLightProbe( assetPath_Night);}public void SetLightMap(Texture2D[] lightmapTex, Texture2D[] lightmapDir){if (lightmapTex == null){return;}lightmapDatas = new LightmapData[lightmapTex.Length];for (int i = 0; i < lightmapTex.Length; i++){LightmapData lmd = new LightmapData();lmd.lightmapColor = lightmapTex[i];lmd.lightmapDir = lightmapDir[i];lightmapDatas[i] = lmd;}LightmapSettings.lightmaps = lightmapDatas;}public void LightDirCol( float TemperatureTime , float IntensityTime){RealLight.colorTemperature = TemperatureTime;HDAdditionalLightData hdLight = RealLight.GetComponent<HDAdditionalLightData>();hdLight.intensity = IntensityTime;Debug.Log("光照強度" + RealLight.intensity);}void Update(){if (Input.GetKeyDown(KeyCode.Q)){LightDirCol(Temperature_AM,Intensity_AM);}else if (Input.GetKeyDown(KeyCode.E)){LightDirCol(Temperature_PM,Intensity_PM);}else if(Input.GetKeyDown(KeyCode.R)){LightDirCol(Temperature_Night,Intensity_Night);}}void LoadLightProbe( string assetPath){// 加載光照探針資產loadedLightProbes = AssetDatabase.LoadAssetAtPath<LightProbes>(assetPath);if (loadedLightProbes != null){LightmapSettings.lightProbes = loadedLightProbes;}else{Debug.LogError("光照探針毛都沒 " + assetPath);}}
}

其中LightProbes的加載關鍵代碼是:

    void LoadLightProbe( string assetPath){// 加載光照探針資產loadedLightProbes = AssetDatabase.LoadAssetAtPath<LightProbes>(assetPath);if (loadedLightProbes != null){LightmapSettings.lightProbes = loadedLightProbes;}else{Debug.LogError("光照探針毛都沒 " + assetPath);}}

完整腳本有冗余,請自行刪減;

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

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

相關文章

實例分割 | yolov11訓練自己的數據集

前言 因工作要求使用的都是yolov5系列的模型&#xff0c;今天學習一下最先進的yolov11&#xff0c;記錄一下環境配置及訓練過程。 1.項目下載及環境安裝 源碼位置&#xff1a;yolov11 可以看到&#xff0c;這里要求python版本大于等于3.8&#xff0c;我這里安裝python3.10.…

大模型推理時的尺度擴展定律

大模型推理時的尺度擴展定律 FesianXu at 20250212 at Wechat Search Team 前言 大模型的尺度擴展定律告訴我們&#xff1a;『LLM的性能會隨著模型的參數量、模型的訓練量、模型的訓練數據量的增加而增加』。訓練存在尺度擴展定律&#xff0c;測試也存在尺度擴展定律&#xff…

如何使用useEffect模擬組件的生命周期?

什么是 useEffect&#xff1f; useEffect 是 React 提供的一個 Hook&#xff0c;用于處理副作用&#xff08;side effects&#xff09;。它允許你在函數組件中執行一些操作&#xff0c;這些操作通常會影響組件的渲染&#xff0c;比如數據獲取、訂閱、DOM 操作等。通過 useEffe…

Linux網絡基礎(協議 TCP/IP 網絡傳輸基本流程 IP VS Mac Socket編程UDP)

文章目錄 一.前言二.協議協議分層分層的好處 OSI七層模型TCP/IP五層(或四層)模型為什么要有TCP/IP協議TCP/IP協議與操作系統的關系(宏觀上是如何實現的)什么是協議 三.網絡傳輸基本流程局域網(以太網為例)通信原理MAC地址令牌環網 封裝與解包分用 四.IP地址IP VS Mac地址 五.So…

網絡安全-使用DeepSeek來獲取sqlmap的攻擊payload

文章目錄 概述DeepSeek使用創建示例數據庫創建API測試sqlmap部分日志參考 概述 今天來使用DeepSeek做安全測試&#xff0c;看看在有思路的情況下實現的快不快。 DeepSeek使用 我有一個思路&#xff0c;想要測試sqlmap工具如何dump數據庫的&#xff1a; 連接mysql數據庫&#…

AI繪畫軟件Stable Diffusion詳解教程(2):Windows系統本地化部署操作方法(專業版)

一、事前準備 1、一臺配置不錯的電腦&#xff0c;英偉達顯卡&#xff0c;20系列起步&#xff0c;建議顯存6G起步&#xff0c;安裝win10或以上版本&#xff0c;我的顯卡是40系列&#xff0c;16G顯存&#xff0c;所以跑大部分的模型都比較快&#xff1b; 2、科學上網&#xff0…

Linux NAT和代理服務器

目錄 0.前言 1.NAT 網絡地址轉換 1.1 NAT 技術背景 1.2 NAT的定義與分類 1.3 NAT的工作原理 1.4 NAT的缺陷 2.代理服務器 2.1 概述 2.2 正向代理 2.3 反向代理 2.4 NAT 與代理服務器的區別和聯系 3.小結 &#xff08;圖像由AI生成&#xff09; 0.前言 在前面的文章中&#x…

AI學習第七天

數組&#xff1a;基礎概念、存儲特性及力扣實戰應用 在計算機科學與數學的廣袤領域中&#xff0c;數組作為一種極為重要的數據結構&#xff0c;發揮著不可或缺的作用。它就像一個有序的 “數據倉庫”&#xff0c;能高效地存儲和管理大量數據。接下來&#xff0c;讓我們深入了解…

ue5 創建多列StreeView的方法與理解

創建StreeView的多列樣式怎么就像是創建單行單列差不多?貌似就是在單行單列中加入了多列widget? 示例代碼 DetailTabWidget #pragma once #include "TreeViewItemBase.h"class SDetailTabWidget : public SCompoundWidget {SLATE_BEGIN_ARGS(SDetailTabWidget){…

Linux之yum詳解

—— 小 峰 編 程 目錄 1、Linux軟件的安裝方式 2、什么是yum 3、配置網絡yum源 4、yum命令 【語法】 【yum常用命令】 1、Linux軟件的安裝方式 在CentOS系統中&#xff0c;軟件管理方式通常有三種方式&#xff1a; rpm安裝 、 yum安裝 以及 編譯安裝 。 2、什么是yum…

lvgl運行機制分析

lv_timer_handler() 是 LVGL 的“心臟”&#xff1a;這個函數會依次做以下事情&#xff1a; 處理定時器&#xff08;如動畫、延遲回調&#xff09;。 讀取輸入設備&#xff08;如觸摸屏、按鍵的狀態&#xff09;。 刷新臟區域&#xff08;僅重繪屏幕上發生變化的區域&#xf…

達夢數據庫授權給某個用戶查詢其他指定用戶下所有表的權限

方法1&#xff1a; 新版本有一個數據庫參數 GRANT_SCHEMA&#xff0c;表示是否開啟授予和回收模式權限功能。0&#xff1a;否&#xff1b;1&#xff1a;是 此參數為靜態參數&#xff0c;默認是0&#xff0c;將改參數修改為1后&#xff0c;重啟數據庫生效。 將參數修改為1 S…

人大金倉國產數據庫與PostgreSQL

一、簡介 在前面項目中&#xff0c;我們使用若依前后端分離整合人大金倉&#xff0c;在后續開發過程中&#xff0c;我們經常因為各種”不適配“問題&#xff0c;但可以感覺得到大部分問題&#xff0c;將人大金倉視為postgreSQL就能去解決大部分問題。據了解&#xff0c;Kingba…

Python之參數星號(*)使用筆記

背景 在學習python時發現方法調用和方法定義會經常發現有帶星號的標記&#xff0c;為了弄明白是怎么使用的。特此做個筆記。 一、參數符號對比速查表 符號類使用場景作用描述示例無符號函數定義/調用普通位置參數或關鍵字參數.def func(a, b)*函數定義收集多余位置參數為元組…

使用haproxy實現MySQL服務器負載均衡

一、環境準備 主機名IP地址備注openEuler-1192.168.121.11mysql-server-1openEuler-2192.168.121.12mysql-server-2openEuler-3192.168.121.13clientRocky-1192.168.121.51haproxy 二、mysql-server配置 [rootopenEuler-1 ~]# yum install -y mariadb-server [rootopenEuler…

Python與Web3.py庫:構建去中心化應用的未來

Python與Web3.py庫&#xff1a;構建去中心化應用的未來 在區塊鏈的世界里&#xff0c;“去中心化”是最核心的理念之一&#xff0c;它賦予了用戶更多的控制權和自由&#xff0c;消除了傳統中心化系統中的單點故障和信任問題。而在這場技術革命中&#xff0c;Web3.0無疑是最受矚…

對“預訓練”的理解

預訓練有什么用 傳統的機器學習是偏數學的&#xff0c;對數據的量不做過多要求&#xff0c;而深度學習的項目通常是有大量的數據可供使用。 在平常的任務或者項目中&#xff0c;我們可能并沒有大量數據&#xff0c;只有少量數據&#xff0c;在這時我們就可以通過“借用”有大…

VMware Ubuntu 共享目錄

在VMware中掛載Ubuntu共享目錄需要以下步驟&#xff0c;分為設置共享文件夾和在Ubuntu中掛載兩部分&#xff1a; 一、VMware 設置共享文件夾 關閉Ubuntu虛擬機 在配置前&#xff0c;建議先關閉虛擬機&#xff08;若已運行需關閉&#xff0c;部分VMware版本支持熱添加&#xff0…

AF3 crop_chains函數解讀

AlphaFold3 feature_processing_multimer模塊的crop_chains函數的功能是對多條鏈的蛋白質結構預測任務中的MSA(多序列比對)特征和模板特征進行裁剪(cropping)。裁剪的目的是為了控制輸入模型的MSA序列數量和模板數量,以適應模型的輸入限制或優化計算效率。 源代碼: def…

Java基礎-數組,集合創建方式

Java 中 new 關鍵字的作用 在 Java 中&#xff0c;new 關鍵字用于 在堆內存中分配空間 并創建對象。 數組 和 集合 在 Java 中都是對象&#xff0c;因此必須使用 new 來創建實例。Java 和 C 之間的主要區別在于 內存管理 和 對象的創建方式。 Java 與 C 中數組 & 集合的創…