【光照】Unity中的[經驗模型]

【從UnityURP開始探索游戲渲染】專欄-直達

圖形學第一定律:“看起來對就對”

URP光照模型發展史

  • ?2018年?:URP首次發布(原LWRP),繼承傳統前向渲染的Blinn-Phong簡化版
  • ?2019年?:URP 7.x引入Basic Shader的簡化光照模型
  • ?2020年?:URP 10.x整合PBR核心(GGX+Smith)
  • ?2022年?:URP 14.x新增Screen Space Global Illumination (SSGI)

核心原理架構

URP的經驗光照模型基于?能量守恒近似?和?藝術家友好設計?原則,通過數學簡化實現實時渲染效率。其核心公式體系包含:

?光能分布模型?:

Lo=Ld+Ls+La

L_d=k_d*(N\cdot L)*I

L_s=k_s*(N\cdot H)^n*I

L_a=k_a*I_a

  • L_d:蘭伯特漫反射(Lambert)
  • L_s?:Blinn-Phong鏡面反射
  • L_a?:環境光分量

?微表面近似?:

URP的SimpleLit使用改進的Blinn-Phong模型:

hlsl
float spec = pow(max(0, dot(N, H)), _Glossiness * 256);
float3 specular = _SpecColor * lightColor * spec;

實現Blinn-Phong風格的光照模型

  • 使用URP標準庫Lighting.hlsl實現光照計算

  • 包含完整的頂點-片段著色器結構

  • 實現Blinn-Phong風格的光照模型

  • 支持主方向光的漫反射+鏡面反射計算

  • SimpleLit.shader

    Shader "Custom/SimpleLit"
    {Properties{_BaseColor("Color", Color) = (1,1,1,1)_SpecColor("Specular", Color) = (0.5,0.5,0.5)_Gloss("Glossiness", Range(0,1)) = 0.5}SubShader{Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" }HLSLINCLUDE#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"CBUFFER_START(UnityPerMaterial)float4 _BaseColor;float4 _SpecColor;float _Gloss;CBUFFER_ENDstruct Attributes{float4 positionOS : POSITION;float3 normalOS : NORMAL;};struct Varyings{float4 positionCS : SV_POSITION;float3 normalWS : TEXCOORD0;float3 viewDirWS : TEXCOORD1;};ENDHLSLPass{HLSLPROGRAM#pragma vertex vert#pragma fragment fragVaryings vert(Attributes IN){Varyings OUT;OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);OUT.normalWS = TransformObjectToWorldNormal(IN.normalOS);OUT.viewDirWS = GetWorldSpaceViewDir(TransformObjectToWorld(IN.positionOS.xyz));return OUT;}half4 frag(Varyings IN) : SV_Target{// 標準化向量float3 N = normalize(IN.normalWS);float3 V = normalize(IN.viewDirWS);// 獲取主光源Light mainLight = GetMainLight();float3 L = mainLight.direction;float3 H = normalize(L + V);// 漫反射計算float NdotL = max(0, dot(N, L));float3 diffuse = _BaseColor.rgb * mainLight.color * NdotL;// 鏡面反射計算float NdotH = max(0, dot(N, H));float spec = pow(NdotH, _Gloss * 256);float3 specular = _SpecColor.rgb * mainLight.color * spec;// 組合輸出return half4(diffuse + specular, 1);}ENDHLSL}}
    }
    

實際應用步驟

?創建材質?:

  • 在Project窗口右鍵 → Create → Material
  • Shader選擇"Example/SimpleLit"

?光源配置?:

csharp
// C#控制光源示例using UnityEngine.Rendering.Universal;public class LightController : MonoBehaviour {public Light2D urpLight;void Update() {urpLight.intensity = Mathf.PingPong(Time.time, 1.5f);}
}

?高級配置參數?:

csharp
// URP Asset配置路徑
Edit → Project Settings → Graphics → Scriptable Render Pipeline Settings

關鍵參數:

  • Main Light Shadows
  • Additional Lights Count
  • Reflection Probes

性能優化建議

  • 移動平臺使用SimpleLit代替Lit
  • 控制Additional Lights數量(建議≤4)
  • 使用Light Layers分層渲染
  • 靜態物體啟用Baked Global Illumination

最新版URP(2023.2)已支持光線追蹤擴展包,可通過Package Manager添加Ray Tracing模塊實現混合渲染管線。

核心光照模型實現類

類名功能
UniversalForwardRenderer主渲染管線入口
Lighting.hlsl包含所有光照計算函數
BRDF.hlsl實現PBR核心算法
MainLight.hlsl主方向光處理
AdditionalLights.hlsl附加點光源/聚光燈

URP內置光照模型類型

URP實現架構

關鍵HLSL實現

URP光照計算核心代碼路徑:

Packages/com.unity.render-pipelines.universal/ShaderLibrary/
├── Lighting.hlsl         # 光照入口
├── MainLight.hlsl        # 主方向光處理
├── AdditionalLights.hlsl # 附加光源
└── BRDF.hlsl            # PBR基礎函數

URP中快速調用標準光照模型實現

?腳本位置?

  • URP內置的SimpleLit.shaderLit.shader(位于Packages/com.unity.render-pipelines.universal/Shaders/
  • 關鍵變量:_SpecularIntensity(控制高光強度)和_Smoothness(控制反射模糊度)

?核心計算邏輯?

  • ?Lambert漫反射?:通過dot(worldNormal, worldLightDir)計算基礎光照

  • ?Phong/Blinn-Phong鏡面反射?:其中halfDir為半角向量(normalize(lightDir + viewDir)

    hlsl
    // Phong模型
    float3 specular = pow(max(0, dot(reflectDir, viewDir)), _SpecularIntensity);
    // Blinn-Phong模型
    float3 specular = pow(max(0, dot(normal, halfDir)), _SpecularIntensity);
    

?Lighting.hlsl直接調用以上計算公式-調用入口?

  • 在Shader的SurfaceInput.hlsl中定義光照輸入結構體InputData
  • 通過UniversalFragmentBlinnPhong函數處理光照,這些都定義在Lighting.hlsl中。
  • 在Lighting.hlsl中有以下經驗光照的函數可直接調用
    • LightingLambert
    • LightingSpecular
    • CalculateBlinnPhong
    • UniversalFragmentBlinnPhong

【從UnityURP開始探索游戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)

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

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

相關文章

uniapp小程序使用自定義底部tabbar,并根據用戶類型動態切換tabbar數據

1.注意點 在pages.json中配置tabbar如下字段:custom:true ,會自動隱藏原生tabbar,使用自定義的tabbar2.如何自定義呢 可以使用第三方組件庫的tabbar組件,然后二次封裝下內部封裝邏輯: 1.點擊切換邏輯 2.根據…

Redis 哨兵 (基于 Docker)

目錄 1. 基本概念 2. 安裝部署 (基于 Docker) 2.1 使用 docker 獲取 redis 鏡像 2.2 編排 主從節點 2.3 編排 redis-sentinel 節點 3. 重新選舉 4. 選舉原理 5. 總結 1. 基本概念 名詞 邏輯結構物理結構主節點Reids 主服務一個獨立的 redis-server 進程從節點Redis 從…

Python學習-day4

Python 語言的運算符: 算術運算符比較(關系)運算符賦值運算符邏輯運算符位運算符成員運算符身份運算符運算符優先級 算術運算符 定義變量a 21,變量b 10。運算符描述實例加 - 兩個對象相加a b 輸出結果 31-減 - 得到負數或是一個數減去另一…

Vite 插件 @vitejs/plugin-legacy 深度解析:舊瀏覽器兼容指南

📖 簡介 vitejs/plugin-legacy 是 Vite 官方提供的兼容性插件,專門用于為現代瀏覽器構建的應用程序提供對舊版瀏覽器的支持。該插件通過自動生成兼容性代碼和 polyfill,確保您的應用能夠在 IE 11 等舊版瀏覽器中正常運行。 核心價值 向后兼…

數據質檢之springboot通過yarn調用spark作業實現數據質量檢測

Spring Boot 應用中通過 YARN 來調用 Spark 作業的來執行數據質檢。這是一個非常經典的數據質量檢測、數據優化的常用架構,將Web服務/業務處理(Spring Boot)與大數據質檢(Spark on YARN)解耦。 核心架構圖 首先,通過一張圖來理解整個流程的架構: 整個流程的核心在于,…

SQL優化_以MySQL為例

MySQL SQL 優化詳細教程與案例 1. 理解SQL執行過程 在優化之前,需要了解MySQL如何處理SQL查詢: 客戶端發送SQL語句到服務器服務器檢查查詢緩存(MySQL 8.0已移除查詢緩存)解析器解析SQL,生成解析樹預處理器驗證權限和表…

探索數據結構中的 “樹”:揭開層次關系的奧秘

在計算機科學的廣袤森林中,有一種數據結構如同參天大樹般支撐著無數應用的根基 —— 它就是 “樹”(Tree)。它不僅僅是一個抽象概念,更是我們理解和組織信息、模擬現實世界層級關系的強大工具。1. 什么是 “樹”?從家族…

技術框架之RPC

一、序言:為什么我們需要RPC?在單體應用時代,函數調用是進程內的簡單操作。但隨著業務規模擴大,系統被拆分為多個獨立服務(如訂單服務、支付服務),服務間通信成為剛需。早期開發者常使用HTTPJSO…

【光照】Unity中的[光照模型]概念辨析

【從UnityURP開始探索游戲渲染】專欄-直達 基礎光照模型? ?標準光照模型(Standard Lighting Model)? ?定義?:傳統光照計算的框架,通常包含漫反射、鏡面反射和環境光三部分。?特點?:非物理經驗模型&#xff0c…

MCU上跑AI—實時目標檢測算法探索

MCU上跑實時目標檢測算法 前幾年一直忙著別的事情沒有在技術分享上下功夫, 這段時間穩定下來就想和幾個志同道合的朋友做點有意義的事情, 于是乎就使用MCU做了個與AI有識別相關的 “小玩意兒”. 本人負責嵌入式端相關的編碼, AI相關的工作由好友 AgeWang 負責. 這兒把一些成果給…

SpringBoot 整合 RabbitMQ 的完美實踐

引言: 本文總字數:約 9200 字 預計閱讀時間:38 分鐘 為什么 RabbitMQ 是消息中間件的優選? 在分布式系統架構中,消息中間件扮演著 "交通樞紐" 的角色,負責協調各個服務之間的通信。目前主流的消息中間件有 RabbitMQ、Kafka 和 RocketMQ,它們各具特色: Kafka…

nestjs 發起請求 axios

1、下載npm i --save nestjs/axios axios2、全局配置import { HttpModule } from nestjs/axios;Global() Module({imports: [HttpModule.registerAsync({inject: [ConfigService],useFactory: async (configService: ConfigService) > {return {timeout: configService.get(…

將 Logits 得分轉換為概率,如何計算

場景:動物識別,輸入一張28*28的圖像,模型輸出屬于 貓、狗、鳥 哪個類型。需求:假設模型 ??Logits(模型在每個類別的置信度得分) 輸出為??:[貓: 3.2, 狗: 1.5, 鳥: -0.8]。計算 ??Softmax …

【Qt】bug排查筆記——QMetaObject::invokeMethod: No such method

問題如題目所示:QMetaObject::invokeMethod: No such method xxxx,在網上好一頓查,又將查到的資料喂給了 Ai,才最終將問題解決,特此記錄下。 一、問題背景 在做公司項目時,使用了插件的方式開發。主程序加載…

Spring Boot手寫10萬敏感詞檢查程序

使用Spring Boot手寫10萬敏感詞檢查程序 本文將介紹如何使用Spring Boot構建一個高效的敏感詞檢查系統,能夠處理多達10萬個敏感詞的檢測需求。我們將使用DFA(Deterministic Finite Automaton)算法來實現高效匹配,并提供RESTful API接口。 實現步驟 1. 創建Spring Boot項…

零構建的快感!dagger.js 與 React Hooks 實現對比,誰更優雅?

“Add Tags” 技術方案并行對比:React Hooks vs dagger.js(含核心 JS 代碼) 源碼: React Hooks:https://codepen.io/prvnbist/pen/jJzROe?editors1010dagger.js:https://codepen.io/dagger8224/pen/ZErjzw…

矩池云中LLaMA- Factory多機多卡訓練

LLaMA Factory 是一款開源低代碼大模型微調框架,集成了業界最廣泛使用的微調技術,支持通過 Web UI 界面零代碼微調大模型,目前已經成為開源社區內最受歡迎的微調框架之一。但是在矩池云上如何使用LLaMA-Factory多機多卡訓練模型呢&#xff1f…

Nginx的反向代理與正向代理及其location的配置說明

一、Nginx中location匹配優先級Nginx中location匹配優先級location支持各種匹配規則,在多個匹配規則下,Nginx對location的處理是有優先級的,優先級高的規則會優先進行處理;而優先級低的規則可能會最后處理或者不進行處理。注意&am…

神經網絡正則化三重奏:Weight Decay, Dropout, 和LayerNorm

正則化是機器學習中防止模型過擬合、提升泛化能力的核心技術。Weight Decay、Dropout和LayerNorm是三種最常用的方法,但它們的工作原理和首要目標截然不同。下面的流程圖揭示了它們的核心區別與聯系: #mermaid-svg-vymek6mFvvfxcWiM {font-family:"…

兩臺電腦通過網線直連共享數據,設置正確,卻互相ping不通的解決方法

因為某些原因,需要兩臺電腦互傳資源,但是某臺電腦可能無法連接外網。如果手頭有根網線,很容易想到通過一根網線連接兩臺電腦互傳數據。 這里先說一下基本的設置: 兩臺電腦最好都關閉防火墻;兩臺電腦都打開專用網絡和公…