第八天 開始Unity Shader的學習之Blinn-Phong光照模型

Unity Shader的學習筆記

第八天 開始Unity Shader的學習之Blinn-Phong光照模型


文章目錄

  • Unity Shader的學習筆記
  • 前言
  • 一、Blinn-Phong光照模型
      • ①計算高光反射部分
      • 效果展示
  • 二、召喚神龍:使用Unity內置的函數
  • 總結


前言

今天我們編寫另一種高光反射的實現方法 – Blinn光照模型.同時了解一些Unity的內置函數.


提示:以下是本篇文章正文內容,下面案例可供參考

一、Blinn-Phong光照模型

Blinn模型沒有使用反射方向,而是引入了新的矢量h,它是通過對視角方向v和光照方向l相加后在歸一化得到的.公式如下:
Blinn模型的h變量計算方法
Blinn模型計算高光反射的公式如下:
Blinn高光反射的公式
代碼如下:

Shader "Unity Shaders Book/Chapter 6/Blinn Phong"{Properties{_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)_Specular ("Specular", Color) = (1, 1, 1, 1)//_Gloss用于控制高光反射屬性_Gloss ("Gloss", Range(8.0, 256)) = 20}SubShader{Pass{Tags {"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Diffuse;fixed4 _Specular;float _Gloss;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);//o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);  下面的代碼和上面的是一個作用o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}fixed4 frag(v2f i) : SV_Target{fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 worldNormal = normalize(i.worldNormal);//fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);  下面的代碼和上面的是一個作用fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);fixed3 halfDir = normalize(viewDir + worldLightDir);fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(i.worldNormal, halfDir)), _Gloss);return fixed4(ambient + diffuse + specular, 1.0);}ENDCG}}Fallback "Specular"
}

①計算高光反射部分

首先我們還是計算出視角方向,然后再對視角方向和光照方向相加之后再歸一化得到的,最后再計算高光部分即可.

效果展示

Blinn-Phong模型演示
可以從效果圖看出來,Blinn-Phong光照模型的高光反射部分看起來更大,更亮一點,在實際渲染中,絕大多數我們都會選擇Blinn-Phong光照模型,但是這兩種光照模型都是經驗模型,換句話說,我們不應該認為Bliin_phong模型是對"正確的"Phong模型的近似,實際上,Blinn-Phong模型更符合實驗結果.

二、召喚神龍:使用Unity內置的函數

我們在之前的Shader代碼中,很多東西都是我們手動計算的,例如視角方向,光源方向等(雖然我們使用的_WorldSpaceLightPos0.xyz得到的光源方向只適合平行光,如果有更復雜的光源信息,這種方法就是錯誤的了),但是手動計算的過程比較麻煩,Unity提供一些內置函數來幫助我們計算這些信息.

函數名描述
float3 WorldSpaceViewDir(float4 v)輸入一個模型空間中的頂點位置,返回世界空間中從該點到攝像機的觀察方向,內部實現使用了UnityWorldSpaceViewDir函數
float3 UnityWorldSpaceViewDir(float4 v)輸入一個世界空間中的頂點位置,返回世界空間中從該點到攝像機的觀察方向
float3 ObjectSpaceViewDir(float4 v)輸入一個模型空間中的頂點位置,返回模型空間中從該點到攝像機的觀察方向
float3 WorldSpaceLightDir (float4 v)僅可用于前向渲染中,輸入一個模型空間中的頂點位置,返回世界空間中從該點到光源的光照方向,內部使用了UnityWorldSpaceLightDir 函數,沒有被歸一化
UnityWorldSpaceLightDir (float4 v)僅可用于前向渲染中,輸入一個世界空間中的頂點位置,返回世界空間中從該點到光源的光照方向,沒有被歸一化
float3 ObjSpaceLightDir(float4 v)僅可用于前向渲染中,輸入一個模型空間中的頂點位置,返回模型空間中從該點到光源的光照方向,沒有被歸一化
float3 UnityObjectToWorldNormal(float3 norm)把法線方向從模型空間轉換到世界空間中
float3 UnityObjectToWorldDir(float3 dir)把方向矢量從模型空間變換到世界空間中
float3 UnityWorldToObjectDir(float3 dir)把方向矢量從世界空間變換到模型空間中

類似于UnityXXXX的幾個函數都是Unity5中新添加的內置函數,這些幫助函數使得我們不需要跟各種變換矩陣,內置變量打交道,也不需要考慮使用了哪種光源這種問題,而僅僅調用一個函數就可以得到需要的信息.
上面的9個幫助函數中,我們已經掌握了五個器內部實現,都在我們之前的代碼中找到,但是需要注意的是,這些函數沒有保證得到的方向矢量都是單位矢量,因此我們使用之前都需要將他們歸一化.


總結

今天的內容就這么多,我們也可以進行一些嘗試,將之前的計算使用這些函數代替一下.

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

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

相關文章

React八案例上

代碼下載 技術棧: React 核心庫:react、react-dom、react-router-dom腳手架:create-react-app數據請求:axiosUI組件庫: antd-mobile其他組件庫: react-virtualized、formikyup、react-spring 等百度地圖A…

線代[13]|線性代數題37道以及數學分析題3道(多圖預警)

博主首次發布于CSDN,禁止轉載!(CSDN:漢密士2025) 文章目錄 一、緣起|《俗說矩陣》課程目錄照片存檔|線性代數學習脈絡|線代習題集封面存檔|未來——我與線性代數的糾纏 二…

OpenCV 圖形API(24)圖像濾波-----雙邊濾波函數bilateralFilter()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 應用雙邊濾波到圖像。 該函數對輸入圖像應用雙邊濾波,如 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Fil…

AI與5G的融合:如何實現更快速、更智能的物聯網應用?

引言 AI和5G的結合,正在加速物聯網(IoT)應用的發展,讓萬物互聯變得更加智能、高效。5G提供超高速率、低時延和海量連接的網絡能力,而AI則賦予物聯網設備更強的數據分析、預測和自動決策能力。當AI與5G融合,…

在ArcGIS Pro中將柵格NoData值修改為特定值

目錄 問題如下:柵格文件中NoData值為65535,要將該NoData值修改為-9999 步驟一:使用柵格計算器(Raster Calculator)輸出具有新NoData值的柵格文件 步驟二:輸出修改值后的柵格文件(Export Rast…

藍牙連接hci 命令和事件的交互

參考:在HCI層看藍牙的連接過程_hci 獲取藍牙pin碼-CSDN博客 我這邊查看的是core 5.2 一、數據交互流程 1、ACL連接建立后的可選流程 參考藍牙core5.2: vol2 --> PartF --> 4 1.1 AUTHENTICATION REQUESTED Authentication can be explicitly executed at …

【計算機網絡實踐】(十二)大學校園網綜合項目設計

本系列包含: (一)以太網幀分析與網際互聯協議報文結構分析 (二)地址解析協議分析與傳輸控制協議特性分析 (三)交換機的基本操作、配置、 虛擬局域網配置和應用 (四)交…

制造企業數據治理體系搭建與業務賦能實踐

當下制造企業正面臨著前所未有的機遇與挑戰,從多環節業務協同的復雜性,到海量數據資源的沉睡與孤島化;從個性化定制需求的爆發,到供應鏈效率優化的迫切性——如何通過數據治理將“數據包袱”轉化為“數據資產”,已成為…

python高級編程一(生成器與高級編程)

@TOC 生成器 生成器使用 通過列表?成式,我們可以直接創建?個列表。但是,受到內存限制,列表容量肯定是有限的。?且,創建?個包含100萬個元素的列表,不僅占?很?的存儲空間,如果我們僅僅需要訪問前??個元素,那后?絕?多數元素占 ?的空間都??浪費了。所以,如果…

智能指針之設計模式2

前面介紹了工廠模式控制了智能指針和資源對象的創建過程,現在介紹一下智能指針是如何利用代理模式來實現“類指針(like-pointer)”的功能,并控制資源對象的銷毀過程的。 2、代理模式 代理模式是為其它對象提供一種代理以控制對這…

探索R語言:在線學習資源匯總

一、收集關于特定R主題的問題和答案(Q&A) 1. Stack overflow Empowering the world to develop technology through collective knowledge – Stack Overflowhttps://stackoverflow.co/ 二、Rstudio工具欄help Rstudio中有個Cheat sheet&#xf…

《C語言中以數組作為參數的探討》

🚀個人主頁:BabyZZの秘密日記 📖收入專欄:C語言 🌍文章目入 一、數組作為參數的傳遞機制二、數組參數的聲明方式(一)省略數組大小(二)指定數組大小(三&#x…

深入解析區塊鏈技術:原理、應用與未來展望

1 區塊鏈技術原理 1.1 基本概念 區塊鏈本質上是一個分布式賬本,它由一系列按照時間順序排列的數據塊組成,每個數據塊包含了一定時間內的交易信息。這些數據塊通過密碼學技術相互鏈接,形成一個不可篡改的鏈條。其核心特點包括去中心化、不可篡…

selenium快速入門

一、操作瀏覽器 from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By# 設置選項 q1 Options() q1.add_argument("--no-sandbo…

面試如何應用大模型

在面試中,如果被問及如何應用大模型,尤其是面向政務、國有企業或大型傳統企業的數字化轉型場景,你可以從以下幾個角度進行思考和回答: 1. 確定應用大模型的目標與痛點 首先,明確應用大模型的業務目標,并結合企業的實際需求分析可能面臨的痛點。這些企業通常會關注如何提…

嵌入式常見概念的介紹

目錄 一、MCU、MPU、ARM (一)MCU(微控制器) (二)MPU(微處理器) (三)ARM(架構) 二、DSP (一)數字信號處理…

深度強化學習(DRL)框架與多目標調度優化詳解

深度強化學習(DRL)框架與多目標調度優化詳解 (截至2025年4月,結合最新研究進展) 一、DRL主流框架及核心算法 通用DRL框架 Ray RLlib:支持分布式訓練,集成PPO、A3C、DQN等算法,適用于…

centos 安裝python3.9.9

這里寫自定義目錄標題 安裝編譯依賴 sudo yum -y groupinstall "Development Tools" sudo yum -y install openssl-devel bzip2-devel libffi-devel wget zlib-devel yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel …

【動態規劃】深入動態規劃:背包問題

文章目錄 前言01背包例題一、01背包二、分割等和子集三、目標和四、最后一塊石頭的重量|| 完全背包例題一、完全背包二、 零錢兌換三、零錢兌換||四、完全平方數 前言 什么是背包問題,怎么解決算法中的背包問題呢? 背包問題 (Knapsack problem) 是?種組…

Vue 接口請求 Nginx配置實時壓縮 速度起飛

生效之前 nginx配置如下 gzip on; gzip_min_length 1k; gzip_buffers 16 256k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types application/json application/javascript text/javascript text/css text/plain; gzip_vary on; 生效之后 #user…