五彩斑斕的白—偏振彩色反射(鐳射)

2021-01-08 Thepoly

上周我們公司原畫師畫了一張很好看的鐳射衣服原畫,這個材質號稱原畫師一畫就廢的材質。BulingBuling的。我們原畫師非常強,畫的真好。看到後很有實現的欲望。於是我要挑戰一下設計界甲方的最高難度,五彩斑斕黑的哥哥,五彩斑斕白。說了這麼多,其實非常非常容易,核心代碼就幾句話的事情。我是在拾人牙慧。並且實現的方式也不止一種。

先上最後效果圖

1 分析

首先我們先了解一下,這種效果會在哪裡用到,比如:車漆的反射,泡泡,這種比較洋氣的鐳射衣服也會用到。但是鐳射衣服一般外面還會有一層類似透明雨披的東西或者就是透明的。我這裡沒有現成的模型就沒有去製作,要是想做的話把模型丟進MAX擠出一層也可以。

這裡我找了一些五彩斑斕白的參考:

這個圖讓我想起來小時候外婆家豬圈棚就是這個紙

話說我也挺想做這種的,奈何沒有找到類似的模型,自己又懶得做(其實是做的醜),只能找個裙子湊合湊合(所以說啊,美術大佬就非常重要)

這種的把豬圈棚紙當雨披穿的,顏色相對上面的比較飽和,類似UE4的HueShift節點

但是本文不是基於這個UE節點的算法製作的,這裡就不去贅述。

2 思考

看完上面的圖,那麼問題來了,我們常見的泡泡是不是也是這種?沒錯,泡泡也可以認為是具有偏振彩色反射的。但是泡泡有一個更加洋氣的名字,叫薄膜幹涉。

感興趣的同學可以去這個github庫看看。

去年春節的時候我也實現過一個類似的,跟我有一年塑料朋友圈友情的朋友應該見到過。

仔細觀察這種材質,大概就是彩虹色漸變+反光+透明(如果有的話),光的原理涉及到光的幹涉。題外話,大家知道一根筷子進水和空氣會發生一次折射,那麼泡泡是一個閉合的球體,會發生兩次折射。當然我們這裡實現的是不透明的衣服,折射不在我們的考慮範圍內,我們考慮反射就好。

首先我們想一下,這個不靈不靈的效果,和什麼有關呢?燈光方向?視口方向?攝像機的位置?法線方向?

3 實現

對,其實都有關係 ,首先我們來講解一下燈光方向,即世界空間的燈光方向,一個float3的向量,但是我們這裡假設燈光是不變的就只有一盞光,光照模型中我們也假設是一個標準的PBS光照模型(如果講清PBS真的要講幾天幾夜,這裡我就直接用的Unity標準的表面著色器,對標ASE的stanrad,畢竟本文重點是偏振幅彩色反射),向量具有方向性。視口方向同理,即顯示生活中我們人眼的觀察方向(需要歸一化)。

這裡的代碼實現原理是用攝像機位置減去空間物體的位置得來的結果。

// 視覺方向v。即相機到物體的向量歸一化。// 等價UnityWorldSpaceViewDir(mul(unity_ObjectToWorld,v.vertex))fixed viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld,v.vertex).xyz);

Unity為我們定義好了攝像機位置的參數,在UnityShaderVariables.cginc這個文件中我們可以查到

#define _WorldSpaceCameraPos unity_StereoWorldSpaceCameraPos[unity_StereoEyeIndex]

直接可以通過_WorldSpaceCameraPos 這個方法拿到對應的向量數據

節點版本:我們這裡使用了攝像機位置和一個float值相乘,為什麼?下面第二個Debug給大家看。再和世界空間法線點乘獲得值

Debug(1):

我們發現當我旋轉視口的時候(即當前的攝像機位置產生了變化),顏色變化了。

然後我們將點乘的值給Cos函數後,再給一個藍色。

Debug :可以看到,當我移動攝像機位置和遠近的時候,顏色會發生不同程度的偏移,當我縮放上面的Tile值時,藍色部分重疊的也就更加頻繁。

我想這裡大家應該是可以理解的,我再解釋一下:

攝像機位置距離越遠,點乘值就會改變,而點乘是可以與float值相乘且滿足交換律的。當我的值發生了變化,Cos也就發生了變化,cos是一個波浪弧線,當裡面的自變量越大,弧線也就越密集。就會得到上面的效果。

那麼我們對應的表面著色器代碼應該怎麼寫呢?

(這裡照顧一下新人能夠實現效果,說了一下創建)

首先我們先創建一個表面著色器

創建後發現裡面有代碼,沒錯,裡面已經預製了一個完整的PBS,我們只需要填充就好(當然,這裡得解釋一下,對於沒有了解過UnityShader

機制的朋友來說,表面著色器完全是一個黑合。如果沒有研究過PBR的實現方式,並不知道Unity到底幫我們做了什麼。很方便,但是Pass和變體也很多)不過對練習和初學來說卻非常好入門。

以下為全部代碼:

Shader"Custom/CustomFilm"{Properties{_Metallic("Metallic",Range( 0 , 1)) = 1_ContrastMask1("ContrastMask1",Color) = (0,0,1,1)_Smoothness("Smoothness",Range( 0 , 1)) = 1_Tile("Tile",Float) = 1_MainTex("MainTex",2D) = "white" {}_MainColor("MainColor",Color) = (1,1,1,0)_MaskRgb("MaskRgb",Color) = (1,1,1,0)}SubShader{Tags{ "RenderType"="Opaque" }CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 3.0sampler2D_MainTex;structInput{float2uv_MainTex;float3worldNormal;};half_Smoothness;half_Metallic;half_Tile;half4_MainColor;half4_MaskRgb;half4_ContrastMask1;voidsurf (Input IN, inout SurfaceOutputStandard o){half3WorldNormal = normalize (IN.worldNormal);half3CameraPos = _WorldSpaceCameraPos * _Tile;half3DotPostion = dot (CameraPos,WorldNormal);half3Mask01 = saturate ( cos (DotPostion) * _ContrastMask1.rgb);half3CrossColor = cross (_ContrastMask1.rgb , float4(1,1,1,1));half3Mask02 = saturate ( sin (DotPostion) * CrossColor);half3AddMask = Mask01 + Mask02;halfRGBToGray = saturate ( 0.2989 * AddMask.r + 0.587 * AddMask.g + 0.114 * AddMask.b);half4c = tex2D (_MainTex, IN.uv_MainTex) * _MaskRgb;half3FinalColor = lerp (c , _MainColor , RGBToGray);o.Albedo = FinalColor.rgb;o.Metallic = _Metallic;o.Smoothness = _Smoothness;o.Alpha = 1;}ENDCG}FallBack"Diffuse"}

這個還是很容易的,我們首先去定義Properties內我們用到的所有東西

同時定義好聲明類型

OK,這個時候,我們往輸入結構體內獲得世界法線。

相對於Unlit來講,表面Shader封裝的非常完美,不需要我們再進行矩陣轉換獲得世界空間的法線

在輸出結構體內歸一化後進行下面的計算,計算步驟和上面節點過程是一樣的。

好,回歸節點:我們下面要計算sin

這裡和上面一樣,不重複廢話了。

然後我們將藍色(0,0,1)和白色(1,1,1)叉乘,結果就是垂直於這兩個三維向量的向量所代表的顏色(這裡是叉乘的性質,不了解的需要學一下數學基礎)注意哦,叉乘是不滿足交換律的。我沒有用normalize是想增強顏色對比。

最後我們與sin相乘著色與之前的藍色相加,紅綠藍三個通道就出來了。

對應的代碼

下面,我要這個相加後的三維向量,給我變成一個灰度圖。因為我是用來做線性插值(Lerp)的變量的。

這裡就涉及到一個RGB轉灰度的公式了,有三種常用的轉法,ASE自帶轉灰度的節點,Unity好像也是帶的,但是我忘了是哪個函數,知道的朋友可以下面告訴我。

最常用也最類似的的轉灰度公式即是這個(一個經驗數據):RGB 按照 0.2989 R,0.5870 G 和 0.1140 B 的比例構成像素灰度值我們這裡相加即可,因為並不重複,也可以使用三個通道的值相加後除3,求一個平均值。

我們拿到了一個float值後傳給lerp

既然要做五彩斑斕的白,我們lerp的AB值肯定要有一個是白的,這張花花綠綠的圖是什麼?這張圖不得不提一句,是經過圖形界大量的工作科研者測量出來的一個偏振彩色圖(當然你要使用PS自己拉一個漸變也可以的,達到效果即可,同理UE4的一個HueShift節點。圖形第一奧義:看起來是對的就是對的。)

對應的代碼:

這裡扯一下Lerp這個函數,當我用自研引擎寫glsl時,我才知道Unity封裝的是有多好,GLSL內對應的Lerp函數叫mix,也就是說我每一種情況都要考慮到,不能和Unity內一樣(相對來說Unity的寫法比GLSL隨意多了)。

最後,如果想加上一點亮晶晶的顆粒感,可以用視口方向點乘世界空間法線(給一張法線貼圖,UV平鋪給高)這裡我就直接用圖表表示了,以下是圖表和效果

本文到這裡就結束啦,感謝各位看官,如需要工程文件,可以加群:867472754裡面找 ,一起討論問題。歡迎各路神仙!

如果遇到上文問題或者錯誤可以聯繫我,敬請斧正!

相關焦點

  • 什麼是鐳射面料 鐳射布料是如何製作的
    什麼是鐳射面料 鐳射布料是如何製作的 2018-06-20 14:31:45 來源:全球紡織網 什麼是鐳射面料?鐳射布料是如何製作的?
  • 偏振成像的基本原理和優點
    光有三個基本特性:強度、波長和偏振.今天幾乎所有的相機都是為單色或彩色成像而設計的。單色相機用於測量在像素級寬帶光譜上的光強,而彩色或多光譜相機則用於檢測紅、綠、藍和近紅外波段的光強。同樣,偏振照相機用於在多偏振狀態下捕捉光的強度。
  • 【君峰·名詞】環形偏振鏡和線性偏振鏡有什麼區別
    偏振鏡由鏡片主體和一個與它相連並可旋轉的後座框兩部分組成,鏡片主體由極細的水晶玻璃組成光柵。旋轉時,偏振鏡的光柵將那些不與它平行的偏振光線阻擋。因此,偏振鏡能夠控制和選擇記錄與它平行的反射光(此反射光為偏振光)數量。這就是偏振鏡能夠消除或減弱非金屬表面反光的道理。但大多數偏振鏡有一點偏藍色。同時在用與拍攝時也會阻擋與偏振光振動方向相同的部分非偏振光。
  • 攝影中偏振鏡的作用
    偏振鏡用得著的時候作用非常大,用不著的時候不但無用甚至會起到反作用,影響畫質!偏光鏡全稱為POLARIZED LIGHT鏡,簡稱PL鏡。又稱偏振鏡。偏振鏡能有選擇地讓某個方向振動的光線通過,在彩色和黑白攝影中常用來消除或減弱非金屬表面的強反光,從而消除或減輕光斑。
  • 光偏振技術再次迎來進步,光偏振在機器視覺中的應用來得
    自然界中的光可以通過吸收,折射,反射,散射和雙折射。例如,當光照射到水時,它可以垂直於線性反射,即在該特定方向上偏振,反射到水表面,我們將其稱為眩光。再舉一個例子,當太陽在天空中移動時,太陽光線照射窗戶的角度將發生變化。在某些時候,光線會以被感知為眩光的角度從窗戶反射或偏振。
  • 光偏振技術再次迎來進步,光偏振在機器視覺中的應用
    自然界中的光可以通過吸收,折射,反射,散射和雙折射。例如,當光照射到水時,它可以垂直於線性反射,即在該特定方向上偏振,反射到水表面,我們將其稱為眩光。再舉一個例子,當太陽在天空中移動時,太陽光線照射窗戶的角度將發生變化。在某些時候,光線會以被感知為眩光的角度從窗戶反射或偏振。天空是藍色的,因為陽光會照射大氣的分子結構並散射,從而使光在特定方向上偏振。
  • 反射式RAP型橢圓偏振光譜儀及其應用
    1 引 言橢圓偏振橢偏光譜測量技術自問世以來已有 100 多年歷史,1887 年,Drude 發現光與物質相互作用將導致光的偏振態發生改變,偏振態在相互作用前後所發生的變化與物質的屬性、
  • 墨西哥現五彩斑斕的雲令居民迷惑
    在菲律賓、亞利桑那州、加利福尼亞州和墨西哥等多處均見到五彩斑斕的雲彩,這樣多彩的雲讓當地居民產生了疑惑,但是對這種迷幻物質科學家是這樣解釋的。墨西哥現五彩斑斕的雲令居民迷惑周一晚上,加利福尼亞州,墨西哥和亞利桑那州的部分地區在天空閃閃發亮 ,居民們捕捉到令人驚嘆的雲
  • 無墨印品|從此,別再叫我鐳射全息
    原標題:無墨印品|從此,別再叫我鐳射全息 市場上除了上篇講述的主流的鐳射全息技術,如今最複雜和防偽力度最高的鐳射全息技術是全息真彩色技術。要了解全息真彩色技術,那就必須搞清楚它與印刷之間的關係,以及全息能否完全的還原物體本來的顏色。
  • CCS Chemistry | 雙圓偏振,光反射與螢光發射同時兼得!自組裝與...
    吉林大學徐雁教授與英國布裡斯託大學Stephen Mann教授合作首次成功實現了雙圓偏振光反射和雙圓偏振螢光發射的晶態納米纖維素CNC基光子晶體膜的自發構築,並展示了該CNC膜在高級光學防偽圖標方面的應用潛力。
  • MCGrating | 案例四: Littrow反射與TM偏振的平面波入射角的關係
    平面波產生於作為徑向偏振 CO2 雷射器中後腔鏡的三角形光柵。入射光正常入射到三角形的一邊以進行高級掃描。具有兩個變化:(1)掃描數據以內置表格的形式輸出 MC Grating 代碼。(2)由內置方程提供入射條件。本例是研究由三角形光柵產生的 TM 偏振平面波的入射角與 Littrow 反射之間的關係。
  • 偏振鏡是創作好作品的秘密武器
    日常仰望天空由於,雜色繁多,各種光線散射、漫反射實際景色遠沒有一些令人震撼的風光照片多姿多彩;觀看水面如鏡子一般反射出天空的白色,而優秀的風光攝影照片卻能夠透過水麵的鏡面反射清晰地觀察到水底的金魚與光潔的鵝卵石;透過玻璃窗山頂的清晰風光都離不開偏振鏡的優秀作用。
  • 鐳射羽絨服是什麼意思
    鐳射羽絨服是什麼意思 2020-12-18 14:57:19 來源:全球紡織網 鐳射羽絨服是什麼意思?
  • 偏振概論
    但是,如果這兩個分量具有不同的幅度,或者存在除π/ 2以外的相位差,則它們將產生橢圓偏振光(右)對於反射和透射而言最重要的兩個正交線性偏振狀態稱為p偏振和s偏振。P偏振光(來自德國平行光)具有平行於入射平面偏振的電場,而S偏振光(來自德國senkrecht)垂直於入射平面。
  • 彩虹、肥皂泡和光碟上的彩色是一回事嗎?
    光線射到水珠的後壁,一部分透出水珠,而另一部分反射回水珠。反射回來的光再次到達水與空氣的界面,又有一部分透出來,一部分反射回去。這透出來的光,就是我們看到的虹。一個薄膜有上下兩個表面,光照上去,兩個表面都會把光反射回來。從這兩個表面反射回來的光互相疊加而出現幹涉現象。對於某一波長的光,在一定厚度的薄膜上下兩個表面反射,這兩個反射光可能加強,也可能互相抵消。反射的角度也會影響到這種加強或抵消。我們在觀察薄膜上的某一個位置時,如果一種波長的光互相加強,則另一種波長的光就可能抵消。
  • 【小麓講堂】偏振光學基礎知識(四):典型偏振器件:偏振片、波片、渦旋波片
    非偏振光入射到金屬線柵上,平行於線柵排列方向的偏振光分量Ep被金屬線柵反射,或因為對金屬線柵的內部電子做功而被吸收,垂直於線柵排列方向的偏振光分量Es透過線柵繼續傳播,從而得到線偏振光。從背光源發出的光為380 nm~780 nm的非偏振白光,經過下POL後變成線偏振光。LC(液晶層)填充具有雙折射特性的液晶分子,TFT陣列基板在外部輸入電信號的作用下,能夠驅動每個亞像素內的液晶分子旋轉,從而改變經過每個亞像素的線偏振光的偏振方向。從下POL出來的線偏振光經過液晶層後,每個亞像素對應的線偏振光都具有各自獨立的偏振方向,再經過CF(彩色濾光片)後,分別變成紅、綠、藍三原色線偏振光。
  • 有大容量和超酷星軌反射鐳射
    另外,這款包的表面還採用星軌反射鐳射工藝,是一種全新的潮玩設計,適合追求潮流的人士。realme真我託特包realme真我託特包配備了一條非常堅固的肩帶,最大承重達到6kg,而經典的託特包造型,擁有12L的超大容量空間,不管是筆記本電腦、化妝品或者書籍,都能順利裝下。另外,我們注意到,這款包的肩帶的顏色是不同於包身的,採用了一種撞色搭配,黑金色的肩帶和黑白兩款包十分搭。
  • 選修3-4 13.6 光的偏振
    如何獲得偏振光光的偏振現象並不罕見。除了從太陽、電燈等光源直接發出的光以外,我們通常看到的絕大部分光,都是不同程度的偏振光。自然光在玻璃、水面、木質桌面等表面反射時,反射光和折射光都是偏振光。入射角變化時偏振的程度也有所變化。
  • 偏振鏡 + 塑料 = 創意大片
    今天要為您介紹的,就是僅用偏振鏡和一些塑料製品就能玩的創意攝影技法,缺錢缺時間卻還想出片的童鞋們別錯過哦!猜一猜,這是什麼?1.>三腳架(有最好,沒有也能拍)這一玩法的基本原理是,把物體放在外部偏振光源和相機的偏振鏡之間,攝影師在通過旋轉偏振鏡來使塑料片上呈現出不同的色彩效果。
  • 偏振雷射的應用
    在大氣光學、海洋光學中,人們早就開始了對混濁介質中偏振光的散射現象研究,並取得了一系列的成果,如大氣雷射雷達系統通過分析雲層散射光的偏振特性能遙感大氣中各種氣溶膠的存在;根據介質散射和目標反射光的不同偏振特性可利用偏振技術排除粒子散射光的幹擾從而提高水下圖像的清晰度;近年來隨著生物組織光學的不斷升溫,生物組織中偏光信息的價值愈來愈引起人們的重視。