關于光照模型

關于光照模型

早期學習筆記,轉載自早期Excel。

存在大量格式錯誤、可讀性非常低,建議等待作者修復后閱讀、或者作為查找性材料使用。

中文名英文名/縮寫說明長什么樣外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
蘭伯特光照模型Lambert Lighting1.蘭伯特反射(Lambert)是最常見的一種漫反射,經驗模型 2.強度僅由L和N的乘積決定,也就是入射光方向和面法線的夾角,如果這個夾角越大、反射越弱,反之越強,現實生活中也是這個道理,很容易理解。 3.代碼:FinalColor=saturate(dot(N,L)); *:saturate(x);//如果x取值小于0,則返回值為0。如果x取值大于1,則返回值為1。若x在0到1之間,則直接返回x的值。外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
半蘭伯特光照模型Half-Lambert Lighting1.Half-Lamber是Valve公司提出來的算法,其為了解決Lambert在背面太暗的問題。經驗模型。 2.為什么蘭伯特在背面會太暗?因為使用了saturate函數,在背面乘值小于0,取0,也就是漫反射強度為0,所以會暗。 3.FinalColor = pow(dot(N,L)*0.5+0.5,2); 4.解析一下公式,先看pow內部,就是把N和L的點乘得到的值從-11映射到01。這樣可能會造成原先亮的地方不那么亮了,暗的地方又顯得太亮了,也就是對比度變低了,于是再做個2次方,把暗的地方壓一下,亮的地方雖然也是壓的(因為都是小于1的值),但是沒有暗的值壓的厲害,相當于整體變暗一點,但是對比度更高。外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
Phong光照模型Phong1.Phong模型用來模擬高光效果。 2. //Phong float3 R = reflect(-L,N); // float3 R = normalize( -L + 2* N* dot(N,L) ); float VR = saturate(dot(V,R)); float NL = saturate(dot(N,L)); float4 Specular = pow(VR,_SpecularPowerValue)*_SpecularScaleValue; float4 Diffuse = NL; FinalColor = Specular + Diffuse; 3.看一下公式,主要是計算高光Specular的部分,它受到視角和反射光線方向的影響,視角和反射光線夾角越小,高光就越強。 4.reflect(-L,N);函數用來計算入射光線以法線為N的表面反射后的出射光線。外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
Blin-Phong光照模型Blin-Phong Lighting1.也是用來模擬高光的經驗模型。 2. //Blin-Phong float3 H = normalize(V+L); float NH = saturate(dot(N,H)); float NL = saturate(dot(N,L)); float4 Specular = pow(NH,_SpecularPowerValue)*_SpecularScaleValue; float4 Diffuse = NL; FinalColor = Specular + Diffuse; 3.H是半程向量,也叫半角向量,是視角方向和入射光方向的中線,Blin-Phong的高光強度由半程向量和面法線的夾角決定,夾角越小,高光越強。 4.和Phong對比,不用計算反射光線方向,性能較好。和Phong相比,高光會大一些、圓滑一些。外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
環繞光照/包裹光照Wrap Lighting1.可以處理物體明暗交界處的顏色 2. float NL = dot(N,L); float NH = dot(N,H); float NLWrap = (NL + _Wrap)/(1 + _Wrap); //add color tint at transition from light to dark //在從明到暗的轉換中添加顏色色調 float scatter = smoothstep(0,_ScatterWidth,NLWrap) * smoothstep(_ScatterWidth2,_ScatterWidth,NLWrap); float specular = pow(saturate(NH),_Shininess); float3 diffuse = max(NLWrap,0) + scatter _ScatterColor; FinalColor.rgb = diffuse + specular; 3.NLWrap有點像之前的半蘭伯特,把diffuse映射到不那么暗的地方,這里的scatter用來計算“邊緣程度”,值越大、也代表越接近明暗交界處。 *:smoothstep(a, b, x); // x<a<b 或 x>a>b 返回0 ,x<b< a 或 x>b>a 返回1 smoothstep與lerp類似,返回 0 和 1 之間平滑的 Hermite 插值。 *:lerp(a,b,w); //(a,b,w)當w為0時返回a,為1時返回b,當w在0-1之間時,比重w將ab進行線性插值,外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
高洛德著色Gouraud Lighting1.簡單來說Gouraud就是在VertexShader而不是在FragmentShader中計算光照的Phong模型。在頂點中計算光照后,再在Fragment中插值。 2.節省性能,但是效果很差。高光和漫反射計算棱角分明,面對較圓滑的模型表現尤其差。外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
帶狀照明/分段著色Banded Lighting1.就是把漫反射分段,之前說的漫反射是平滑過度的,現在把它們隱射到不同的級數里,像條形統計圖那樣。可以用作卡通渲染。 2. //Banded Lighting float NL = (dot(N,L))0.5+0.5; // float _BandedStep = 6; float BandedNL = floor(NL_BandedStep)/_BandedStep; float4 C1 = lerp(_ColorA,_ColorB,BandedNL); float4 C2 = lerp(_ColorB,_ColorC,BandedNL); float4 Diffuse = lerp(C1,C2,BandedNL); // float4 Diffuse = smoothstep(_ColorA,_ColorB,BandedNL); FinalColor = Diffuse; 3.這里先用NL記錄了半蘭伯特計算出來的值,再把它映射到BandedNL里。此案例給了三個用來分段的顏色,先用BandedNL插值出AB間,再插BC間,再插這兩個結果之間。如果只是兩個顏色間分段,只需要一次插值。 *:floor(a)//向下取整外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
月光模型Minnaert Lighting1.Minnaert光照主要是用來模擬月球光照的,其特點是:光照不到的地方一定是全黑的、面法線與視線的夾角越大、看上去也越暗。 2. //Minnaert Lighting float NL = saturate(dot(N,L)); float NV = saturate(dot(N,V)); // float _Roughness = 0.5; float4 Minnaert = saturate(pow(NL*NV,_Roughness)*NV); FinalColor = Minnaert; //公式:Minnaert = (((N.*L)(N.*V))^(_Rough)) * (N.*V)外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
粗糙度光照(自己起的)Oren-Nayar Lighting1.此模型用來描述光在粗糙表面的反射情況,相比于Lambert模型,它考慮了 粗糙度參數,常用來模擬比較粗糙的表面。 2. //Oren-Nayer //粗糙度參數由噪聲圖采樣獲得 float roughness = tex2D(_RoughnessTex,i.uv).r _Roughness; float NL = saturate(dot(N,L)); float NV = saturate(dot(N,V)); float theta2 = roughnessroughness; //A + B約等于1.右邊有函數圖上A下B float A = 1 - 0.5*(theta2/(theta2 +0.33)); float B = 0.45 (theta2/(theta2+0.09)); //反余弦得夾角 float acosNV = acos(NV); float acosNL = acos(NL); //alpha是法線與視線的夾角、法線與光照方向的夾角之間更大的那一個 float alpha = max(acosNV,acosNL); //beta是法線與視線的夾角、法線與光照方向的夾角之間更小的那一個 float beta = min(acosNV,acosNL); //V - NNV 是個綜合了N、V二者夾角經過復雜變換后得到的值,目前無法理解 float gamma = length(V - NNV) * length(L - NNL); float Diffuse = 1; //最終綜合以下影響:環境光、漫反射、粗糙度的復雜計算 float OrenNayer = Diffuse * NL (A+ Bmax(0,gamma)*sin(alpha)*tan(beta)); FinalColor = OrenNayer; //最終效果是:粗糙度越大、約暗,反射的光越弱,但和視角也有一定關系。外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳 這是加了粗糙度貼圖的效果外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
背光/次表面散射(方法之一)(SSS)BackLight1.真實的光照幾乎都包含反射、透射和次表面散射這三種,前兩種以前就了解過,次表面散射的定義是:入射光和出射光在表面的同一側,但入射點和反射點并不在同一個點。因為光線會打入表面內部,在與內部的原子碰撞若干次后反射出來。像玉石等物件,在背光時、邊緣或者薄處比較亮,這種效果就可以用此表面散射來模擬。 2. //WrapLight計算漫反射 float WrapLight = pow(dot(N,L)_WrapValue+(1-_WrapValue),2); //Blin-Phong計算高光 float3 R = reflect(-L,N); float3 H = normalize(V+L); float VR = saturate(dot(V,R)); float NH = saturate(dot(N,H)); float NL = saturate(dot(N,L)); float4 Specular = pow(NH,_SpecularPowerValue)_SpecularScaleValue; float4 Diffuse = WrapLight; //模擬透射現象 float _SSSValue =0.6; //當SSSValue = 0,這個Shift就是光照方向的反方向,這里計算的是片元法線的偏移值 //這里的思想是用一個變量儲存模擬的片元法線變換后的方向,再拿這個方向去計算 float3 N_Shift = -normalize(N*_SSSValue+L);//沿著光線方向上偏移法線,最后在取反 //這里是再用視線方向與偏移后的模擬法線方向計算一次背光強度,視線方向越接近模擬后偏移方向,背光強度越強 float BackLight = saturate(pow(saturate( dot(N_Shift,V)) ,_PowerValue)*_ScaleValue); FinalColor =Diffuse + Specular + BackLight; *:簡單的來說,就是多計算一個背光項,其亮度由NV來計算,但是這個N是處理過的V,是法線往入射光方向偏移一定程度后再取反的法線。 3.對于光照能直接照到的地方,背光應該是不起效的,因為把法線偏向光源后,它與視角的夾角一般會變大,大于90度后值就會小于0了。 4.如果是光照的背面,則是面法線方向與光照方向越接近,背光越亮。外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳 這里是背面
各向異性光照模型Anisotropic Lighting1.用來模擬光照下的頭發、帶狀的高光,在各個方向表現不一致的材質。 2. //shift值通過對紋理采樣獲得,為了使頭發高光有上下偏移 float shift = tex2D(_StretchedNoiseTex,i.uv4).r + _ShiftTangent; //用一個變量儲存向法線偏移一定值后的切線,偏移多少由shift決定 float3 T_Shift = normalize( T+ Nshift); //半程向量 float3 H = normalize(V+L); //把偏移后切線當成原先Phong模型的面法線,用來和半程向量計算高光的強度 float dotTH = dot(T_Shift,H); //定義高光段數 float NumberOfStrip =1; //通過拉伸一下Cos的X軸模擬多段高光 float cosTH =cos(dot(T_Shift,H)NumberOfStrip ); //高光強度映射到0~1 float dirAtten = smoothstep(-1,0,dotTH); //計算高光,dirAtten是僅由物體決定的總體的高光強度,與原先基本沒有區別,cosTH段是通過采樣值做多段處理 float Specular = dirAtten * pow(cosTH,_AnisotropicPowerValue)_AnisotropicPowerScale; float WrapLight = dot(N,L)0.5+0.5; float Diffuse = WrapLight; FinalColor = Diffusefloat4(0.7,0.2,0.4,0) +Specular; return FinalColor; *:簡單的來說,做法就是在計算高光的時候,把原先的法線用“向法線偏移一定程度后的切線”代替。一想、確實,這樣原先是高光的地方就因為偏移變得不是高光了,而總有一圈其他地方的會因為切線偏移后剛好和半程向量比較近,就會出現高光。外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳 這里是加了貼圖的效果
*:上面加灰了的這種說法是片面的,我自己復刻的時候遇到了很大的問題。首先、上面的T_Shift的確是向法線偏移后的切線,但是這不會導致帶狀高光,而是會導致高光位置偏移、形狀扭曲!對于次表面散射的物體,的確需要高光偏移位置合扭曲。真正導致帶狀高光產生的,是CosTH那一項。想象一下,原來整個表面的高光強度被映射到01,此時在cosTH計算的時候,先把高光強度乘以一個指定值,也就是把高光強度映射到0若干,此時超過3.14的部分變成小于0,導致高光強度變為小于0,也就表現為非高光。總之帶狀高光的根本在于Cos函數映射,而高光的扭曲和位移才取決于向法線偏移的切線。 *:SmoothStep項作者應該也寫錯了,應該clamp 0~1 而不是 -1~0,我試了,clamp -1 ~ 0將導致全面變白。

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

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

相關文章

iptables防火墻【其二 實驗篇】

保存&#xff0c;還原規則 防火墻規則的備份和還原 導出&#xff08;備份&#xff09;所有表的規則 iptables-save > /opt/ipt.txt 導入&#xff08;還原&#xff09;規則 iptables-restore < /opt/ipt.txt 將iptables規則文件保存在 /etc/sysconfig/iptables 中&#xf…

亞馬遜賣家賬號注冊復雜嗎?需要什么輔助工具嗎?

在當今數字化的商業世界中&#xff0c;亞馬遜作為全球最大的電商平臺之一&#xff0c;吸引著無數的賣家和買家。對于想要進入亞馬遜銷售市場的賣家來說&#xff0c;首先要完成的一項重要任務就是注冊亞馬遜賣家賬號。本文將詳細介紹亞馬遜注冊的步驟、所需時間&#xff0c;以及…

LIMS系統能解決實驗室管理的哪些痛點

LIMS&#xff08;Laboratory Information Management System&#xff0c;實驗室信息管理系統&#xff09;在解決實驗室管理的痛點方面發揮著重要作用。以下是LIMS系統能夠解決的一些主要痛點&#xff1a; 一、人工介入大量重復性工作 LIMS系統能夠自動化處理實驗室中的許多重復…

[深度學習]基于yolov8+bytetrack+pyqt5實現車輛進出流量統計+車輛實時測速實現

以前使用過yolov5deepsort實現過車輛進出流量統計車輛實時測速&#xff0c;可以看我往期視頻&#xff0c;這回改成yolov8bytetrack實現&#xff0c;實時性更好&#xff0c;原理和原來一樣。車流量進出統計車速測量優點&#xff1a; 使用目標檢測算法考慮bbox抖動&#xff0c;解…

C-數據結構-單向鏈表(帶頭節點)

單向鏈表帶頭節點&#xff08;head&#xff09;&#xff08;數據域&#xff0c;指針域&#xff09; 隨機訪問性比較差 但是插入刪除操作較為簡單。 list.h #ifndef LIST_H__ #define LIST_H__typedef int datatype;typedef struct node_st {datatype data;struct node_st *ne…

將富文本編輯器中的H標簽處理成樹形結構,支持無限層級

做富文本編輯器時&#xff0c;需要將文本里的標題整理成樹形數據&#xff0c; // 這里是數據結構 const data [{"id": "hkyrq2ndc-36yttda0lme00","text": "阿薩德阿薩德阿薩","level": 1,"depth": 1,},{"…

Window Linux 權限提升

#基礎點&#xff1a; 0、為什么我們要學習權限提升轉移技術&#xff1a; 簡單來說就是達到目的過程中需要用到它 心里要想著我是誰 我在哪 我要去哪里 1、具體有哪些權限需要我們了解掌握的&#xff1a; 后臺權限&#xff0c;數據庫權限&#xff0c;Web權限&#xff0c;用戶權…

【VTKExamples::Texture】第六期 TextureThreshold

很高興在雪易的CSDN遇見你 VTK技術愛好者 QQ:870202403 公眾號:VTK忠粉 前言 本文分享VTK樣例TextureThreshold,并解析接口vtkTexture,希望對各位小伙伴有所幫助! 感謝各位小伙伴的點贊+關注,小易會繼續努力分享,一起進步! 你的點贊就是我的動力(^U^)ノ~Y…

127.數據異構方案

文章目錄 前言一、數據異構的常用方法1. 完整克隆2. MQ方式3. binlog方式 二、MQ與Binlog方案實現MQ方式binlog方式注意點 三、總結 前言 何謂數據異構&#xff1a;把數據按需&#xff08;數據結構、存取方式、存取形式&#xff09;異地構建存儲。比如我們將DB里面的數據持久化…

Android 安全補丁介紹

Android 安全補丁介紹 每月安全補丁更新&#xff1a;https://source.android.com/docs/security/bulletin CEV 全稱&#xff1a; Common Vulnerabilities and Exposures (CVE) 常見漏洞和暴露 (CVE) 安全補丁版本查看&#xff1a;設置&#xff0c;關于手機&#xff0c;Andro…

前端基礎入門三大核心之HTML篇:無序列表的深度探索

前端基礎入門三大核心之HTML篇&#xff1a;無序列表的深度探索 一、無序列表基礎概念與作用1.1 什么是無序列表&#xff1f;1.2 無序列表的作用 二、基本用法與代碼示例2.1 最簡單的無序列表2.2 添加自定義樣式 三、進階應用與技巧3.1 列表嵌套3.2 利用CSS實現復雜布局3.3 安全…

云和恩墨海外首秀在吉隆坡召開的2024中國智能科技與文化展覽會

作為中馬建交50周年官方重點推薦的活動之一&#xff0c;2024中國智能科技與文化展覽會&#xff08;第四屆&#xff09;于5月20至21日在毗鄰吉隆坡雙子塔的吉隆坡國際會展中心舉辦。本次展覽會獲得馬來西亞科學技術創新部、馬來西亞通訊部、中國駐馬來西亞大使館和馬來西亞中華總…

【Linux學習】進程地址空間與寫時拷貝

文章目錄 Linux進程內存布局圖&#xff1a;內存布局的驗證 進程地址空間寫時拷貝 Linux進程內存布局圖&#xff1a; 地址空間的范圍&#xff0c;在32位機器上是2^32比特位,也就是[0,4G]。 內存布局的驗證 代碼驗證內存布局&#xff1a; 驗證代碼&#xff1a; #include<s…

linux系統安全加固

目錄 1、賬戶安全基本措施 1&#xff09;系統賬戶清理 2&#xff09;密碼安全控制 3&#xff09;命令歷史限制 2、用戶切換及提權 1&#xff09;使用 su命令切換用戶 2&#xff09;使用sudo機制提升權限 3、系統引導和安全登錄控制 1&#xff09;開機安全控制 2&…

頭歌實踐教學平臺:Junit實訓入門篇

第2關&#xff1a;Junit注解 任務描述 給出一個帶有注解的Junit代碼及其代碼打印輸出&#xff0c;要求學員修改注解位置&#xff0c;讓輸出結果變為逆序。 相關知識 Junit注解 Java注解&#xff08;(Annotation&#xff09;的使用方法是" 注解名" 。借助注解&a…

python數據處理與分析入門-Pandas數據可視化例子

相關內容 Matplotlib可視化練習 Pandas 數據可視化總結 柱狀圖 reviews[points].value_counts().sort_index().plot.bar()散點圖 reviews[reviews[price] < 100].sample(100).plot.scatter(xprice, ypoints)蜂窩圖 reviews[reviews[price] < 100].plot.hexbin(xprice…

Helm安裝kafka3.7.0無持久化(KRaft 模式集群)

文章目錄 2.1 Chart包方式安裝kafka集群 5.開始安裝2.2 命令行方式安裝kafka集群 搭建 Kafka-UI三、kafka集群測試3.1 方式一3.2 方式二 四、kafka集群擴容4.1 方式一4.2 方式二 五、kafka集群刪除 參考文檔 [Helm實踐---安裝kafka集群 - 知乎 (zhihu.com)](https://zhuanlan.…

virtualbox共享文件夾沒有訪問權限

設置好共享文件夾之后&#xff0c;進入虛擬機&#xff0c;共享文件夾的地址是/media/sf_shared。 想要使用cd命令進入該文件夾時&#xff0c;你可能會發現此文件夾無法訪問&#xff0c;系統提示的原因是權限不足。 在虛擬機下查看共享文件夾的屬性&#xff0c;發現該目錄的所…

Nginx - 健康檢查終極指南:探索Upstream Check模塊

文章目錄 概述upstream_check_module模塊安裝和配置指南模塊安裝步驟基本配置示例詳細配置說明檢查類型和參數常見問題及解決方案 SSL檢查和DNS解析功能SSL檢查配置示例和說明配置示例 DNS解析配置示例和說明配置示例 結合實際應用場景的高級配置示例綜合SSL檢查與DNS解析 總結…

Doris【部署 03】Linux環境Doris數據庫部署異常問題收集解決(不斷更新)

Linux環境Doris數據庫部署異常問題 1.FE1.1 Unknown system variable character_set_database1.2 notify new FE type transfer: UNKNOWN1.3 mysql_load_server_secure_path1.4 Only unique table could be updated1.5 too many filtered rows 2.BE2.1 Have not get FE Master …