1. 程式人生 > >解讀Unity2018中 ShaderGraph 示例: Procedural

解讀Unity2018中 ShaderGraph 示例: Procedural

ShaderGraph 使您可以直觀地構建著色器。 您可以在圖形網路中建立和連線節點,而不是手寫程式碼。
在之前Unity中包含兩個比較有名的外掛:
  1. Shader Forge  , 在Asset Store中已經搜尋不到了, 應該是作者也不打算怎麼更新了,  並且已經開源
    https://github.com/FreyaHolmer/ShaderForge   
        所以網上有人 讓這個工具 在2018上工作     https://github.com/jackisgames/Shader-Forge-Unity-2018           真的挺遺憾的,這個工具是第一個出來的,而且只有這個工具生成 頂點片段Shader,  Amplify Shader Editor是生成Unity的 表面著色器
    ,  Shader  Graph 是看不到生成的Shader程式碼(可以看編譯後生成的hlsl, glsl程式碼)(注2018.2可以了)!! 所以Unity官方這個工具並不適合學習寫Shader程式碼。
  2. Amplify Shader Editor , 持續更新中, 也支援srp, 2018 等等!  
  3. 官方  Shader  Graph  
            對於寫Shader不是很熟的我來說,讀這些程式碼是痛苦的,也沒時間。  但是Unity官方突出類似的,用節點的方式弄。 可讀性就變得容易多了。 官方提供的 節點就幾種Procedural : shape - Ellipse 橢圓 - Polygon 多邊形 - Rectange 矩形 - Rounded Rectangle 圓角矩形Noise - Gradient Noise - Simple Noise - Voronoi

上圖1 ~ 4 簡單就是直接使用系統的 節點。 但是有一個可以 總結出來: Mutiply 乘法節點 , 任何顏色 * 白色 = 任何顏色!!! 還有另外一個沒有用到 白色(1,1,1,1)加上 任何顏色 = 這個顏色偏向白色 總結: 相加 得到的顏色 偏向 RGB值 比較大的顏色 相乘 得到兩種顏色的混合1-5 游泳圈 怎麼得到的? Subtract 減法節點了, 大圓 - 小圓 = 游泳圈 !!1-6 同時顯示兩個圖形, 是兩個圖形的 Add , 沒錯, 就是Add 節點。 如果位置重疊, 重疊區域就是兩者的add 1-7 跟 1-6的區別 是 每個圖形有自己的顏色, 就是每個圖形在 Add 之前 會自己乘上 Color!!1-8 這個是對 1-4 圖形 做了 Invert Colors 節點
, 顏色取反。 取反 之後在乘以 Color !!1-9 怎麼做到的? 最後傳給一個 Ellipse 橢圓節點 生成的!!! 關鍵的步驟不是在最後, 如果最後傳給 Rectangle 就是
用到兩個節點 “Modulo 模數”, "Reciprocal 倒數" 一個大圖 0~1 的範圍!想把它 分成5個小圖, 5的倒數是 0.2 想象一下 0~1 區間對 0.2 求模, 得到的很多都是 0~0.2 區間的大小。但是是5個 0~0.2 . omg!!! 然後將這個5個 0~0.2 都* 5, 就得到了 5個 0~1 區間的!!! omg !!!
2-1 看他跟 1-4 的區別 是什麼? 區別就是一直改變位置而已。 改變位置 在1-6 中就已經有了 是 Tiling And OffSet , 只要是 Offset(2) 輸入。 運動是 ping pong 形式的, 肯定要使用 Sine 節點, 傳入時間 (時間 * 常量(可以控制速度)),改一下, 如果這時候 直接將 Sine結果傳到 , 會看到運動的效果是: 對角線運動, 左下角到 右上角 的反覆運動!!!
突然感覺好有意思啊~效果是 x 動, y不動, 那就讓x 和 0 通過Combine 節點 組合一下, 然後把 結果給 Tiling And OffSet 的 Offset(2) 輸入。 把Sine 結果 直接給 Combine的 x, OK, 效果達到了!!!!, 讓y動畫話, 就讓r = 0, g = sine結果。 都動就都是 sine 結果 自己實驗!
但是還不行, 沒辦法控制振幅啊! 這種ping-pong 是什麼? -1 ~ 1 的變化!, x~y 的變化和 Lerp節點 是不是很像? 那就是使用Lerp 的 x, y 代表振幅(兩個值要是相反數才行, 就是Negate 節點的作用) Lerp 節點還需要特別重要的 時間: 0~1 一直反覆變化, x~y~x~y~x .... 值就這樣ping-pong 的了。 時間0~1 可以通過Sine 的結果 -1~1 通過 Remap節點 來重對映到 0~1 . OK 了!!! 不對啊? 如果是為了調整振幅,為什麼不直接對 Sine的 結果 乘以 一個 Vector1 的常量作為縮放呢????2-2 跟 1-2 的區別 就是有了 旋轉。 直接使用 Rotate 節點 的結果作為 UV。 Rotate 節點需要時間驅動。 傳入時間 (時間 * 常量(可以控制速度))2-3 跟 1-9 的區別, 就是 把 之前的 UV 節點 換成 可以改變位置的 動畫。 就是 Offset(2)
2-4 他用了圓 實際上是有誤導的 啊, 因為圓的自傳 看不到了。 換成 Rectangle 實際上是有自傳的!!! 明白了, 自傳是整個圖片做了旋轉, 旋轉完之後 在當前 x 周方向上做偏移 ( Tiling And OffSet 的 Offset(2) )(自身的x, 不是一直橫著的)。 Tiling And OffSet 的 Offset(2) 是 Vector2, 前面介紹過了, 使用 Combine 節點進行組合 就OK 了 !!!2-5 Twirl (捻, 擰 ) 節點 處理一下UV 就是這個效果了 !!!2-6 這個是對 2-5 的改進。 Twirl (捻, 擰 ) 節點 , 有一個重要的輸入 “Strength” 。 實際上讓這個值 在0 ~10 之間做 ping-pong動畫~~~~ 這個ping-pong 不要想複雜了, 不用Lerp, 就是對 Sine 節點 結果 做 Remap 節點 重對映 !!! 然後賦值給 “Strength” 2-7 首先是個圓 的運動。 跟 2-1 類似, Sine, Remap, Lerp, Combine 。 區別就是 在 Combine 和 Ellipse 節點節點之間 多了一步處理 。Spherize (球面化) 節點 Combine 的 結果控制 Spherize 的 offset 輸入。(這樣就一直 Ping-Pong 位置遷移)。 Spherize 的結果作為 Ellipse 的UV 輸入!!!2-8 重點在於實現縮放 Polygon 節點 的輸入 Width, Height 兩個值! 剩下就是之前的 Ping-Pong 邏輯 不用Lerp, 就是對 Sine 節點 結果 做 Remap 節點 重對映 !!! 然後賦值給 Width, Height Scale 範圍是 兩個 屬性, 通過 Combine 節點 組合2-9 這完全是一個組合 Scale 變化 是 2-8 實現的, 左右 ping-pong 移動是 2-1, 自傳是 2-2 . 3-1 Color Ping Pong , 就是兩個顏色 做 Ping-Pong動畫唄!!! Ping-Pong 的套路就是 1) 時間 (時間 * 常量(可以控制速度) 傳給Sine, Sine結果 重對映到 0~1 , 得到了時間的Ping-Pong 動畫。 時間動畫結果 作為 Lerp 的引數。 Lerp的 x, y 就是兩個要ping-pong 的顏色值了!!!!3-2 Color Random Flicker 顏色隨機閃爍 只要是動畫, 必須有時間驅動, 但是時間的變化是連續的。 不是隨機跳躍的!!! 那就讓 時間作為隨機種子Seed ,傳入 Random Range 節點 中!!! 但是這個隨機的結果不是顏色, 那就使用Lerp 節點, 在兩個顏色之間 取一個數值!!! 所以 Random Range 的結果要在0~1 之間才行!!!3-3 Color Linear Gradient 顏色線性漸變 UV 節點是什麼???U 相當於國際座標軸的X軸V 就是Y 軸,還有一個W軸          大多數材質貼圖都是為 3D 曲面指定的 2D 平面。因此,說明貼圖位置和變形時所用的座標系與 3D 空間中使用的 X、Y 和 Z 軸座標不同。特別是,貼圖座標使用的是字母 U、V 和 W;在字母表中,這三個字母位於 X、Y 和 Z 之前。U、V 和 W 座標分別與 X、Y 和 Z 座標的相關方向平行。如果檢視 2D 貼圖影象,U 相當於 X,代表著該貼圖的水平方向。V 相當於 Y,代表著該貼圖的豎直方向。W 相當於 Z,代表著與該貼圖的 UV 平面垂直的方向。您可能會問,為什麼 2D 平面需要象 W 這樣的深度座標。一個原因是,相對於貼圖的幾何體對該貼圖的方向進行翻轉時,這個座標是很有用的。為了實現該操作,還需要第三個座標。另外,W 座標對三維程式材質的作用非同小可。
上圖是UV 節點, 對 Out 輸出 使用 Split 節點進行分離, 看看每個通道是什麼樣的? UV的圓點是 左下角! R 其實是 U 通道 , 就是水平方向從 0~1
G 其實是 V 通道,就是垂直方向上 從0~1
這個B 不知道, 總之是黑色!
Alpha 為純白色 一點不意外 !!!
那麼一開始的 UV 彩圖 就得出結論了,就是他們的RGBA的融合啊 !!!!回到這個3-3 要實現的效果上。 線性漸變。 可以使用 UV 的前兩個通道中的一個啊~~~~~ 使用選擇 的這個通道, 作為 Lerp的時間 T 輸入。 就可以對兩個顏色常量 A, B 進行線性插值了~~~~
還差的一點 是 不能旋轉方向。 所以 就有了專案中的 添加了 Rotate 節點 Rotate 節點的位置可以 現對 總UV 進行旋轉, 也可以對Split 的 分量進行旋轉, 效果一樣3-4 Color Radial Gradient 顏色的 徑向漸變 這個依然是對UV 的運用啊~~~ 主要是得到 映象UV 圖
讓它作為 Lerp 節點的 T 引數 , 讓兩個常量顏色 漸變就是了 !!UV 的 兩個通道 U和 V 進行混合 就是Combine 節點 返回 的 RB 是這樣的
同過這黑點從左下角 移到中間就是想要的了~~~~你可以實驗兩個取反, 對 Distance的結果取反 Invert Colors, 對 Mutiply 的結果 Invert Colors3-5 Color Split 顏色分裂 對UV 的一個分量(黑白漸變圖), 經過 Step 節點處理。 然後傳給 Lerp節點。 Step 節點 如果輸入In大於等於輸入Edge,返回1(白色),否則返回0(黑色)3-6 Color Split Ping Pong 這個動畫簡單了, 實際上是讓 Step的 Edge(1) 在 0~1 之間做 Ping-Pong 老套路 : 時間 (時間 * 常量(可以控制速度) 傳給Sine, Sine結果 重對映到 0~1 3-7 Color Soft Split 用到新節點 SmoothStep : 如果輸入In在Edge1和Edge2之間,則返回Hermite插值(https://baike.baidu.com/item/%E5%9F%83%E5%B0%94%E7%B1%B3%E7%89%B9%E6%8F%92%E5%80%BC/8113661)。如果In小於Edge1,則返回0,如果In大於Edge2,則返回1。這個節點類似於Lerp節點,但有兩個顯著差異。第一,此節點返回值介於0和1之間而Lerp返回值介於輸入的A和B之間。第二,該節點使用平滑的Hermite插值而不是線性插值。Hermite插值在開始加速並在最後減速。這對建立自然的動畫,淡入淡出和其他轉換非常有用。 可以先弄一個簡單的
這時候可以改變 Edge1, Edge2 兩個值。 示例 中只是 增加了 Tiling And offset , 可以改變偏移位置而已。 這裡面有一個需要注意 的是: 就是Split 的輸出, 是使用 R, 還是 G, 兩個要使用相同的值, 常量控制才有作用
3-8 這個 Color Soft Split Ping Pong 這個通過改變位置弄的動畫 Ping-Pong 動畫控制的 是 Combine 節點的 R 輸入!!!3-9 Color Shape Split 這個有點意思~
Polygon的結果是 黑白圖片, 非零既一。 現在需求,如果讓白色變成一種其它顏色, 黑色變成一種其它顏色。 做法就是 讓 Polygon的結果 解釋 Lerp的 輸入 T, Lerp 的 兩個輸入 A, B 就是兩種顏色!!!!4-1 Pattern Stripes 圖案條紋 使用到節點 Checkerboard (棋盤) 屬於 Procedural 分類下!!! 讓條紋 調整方向, 通過 Rotate 節點 控制 UV 輸入引數。 斑馬線的顏色 是 Color A, Color B。 Frequency 可以控制兩個軸向的 座標比例, 控制 條的寬度 或者密度 !4-2 跟 4-1 的區別就是把 Frequency 引數作為屬性公開。4-3 跟 4-2 相比 是,傳入的 UV 變了! 在 UV 分類下, 有個 Polar Coordinates 節點!將輸入UV的值轉換為極座標。 在數學中,極座標系是二維座標系,其中平面上的每個點由距參考點的距離和距參考方向的角度確定。產生的效果是輸入到UV的x通道被轉換為距輸入中心值指定的點的距離值,並且相同輸入的y通道被轉換為該點周圍的旋轉角度值。這些值可以分別通過輸入徑向比例和長度比例的值進行縮放。4-4 Pattern Shatter 旋轉, 直接控制 Rotate的 Rotation 引數就可以了 !!! 時間 (時間 * 常量(可以控制速度) 傳給 Rotation 引數。 時間本身就是一個 一直累加的數值, 無窮無盡。 4-5 Pattern Rings 圖案戒指 跟 4-3 相比 最主要的改變就是 將下面兩個值 進行對調了 ! 還是棋盤的 Frequency 引數 !!! 這個圖形 不需要Rotate 旋轉 !
4-6 Pattern Rings Auto Scroll 通過改變UV 座標移動 。 還是 Tiling And Offset 節點處理的! 注意 , 還是 Time 驅動 的是 R, 還是 G 的問題 。 因為 Frequency 引數 非0 的是 R, 所以要驅動 R !!!4-7 Pattern Spiral 圖案螺旋 之前使用過一個節點 Twirl (扭,擰) 。 沒明白 這兩個數值怎麼得出來的???
那兩個值 可以調整, 總之 讓圖案 變成 綠色和 黑色兩種!!!但是這時候得到的 綠色和黑色 並不純。 因為有細微漸變! 那就經過 Step處理, 綠色 和 黑色變成 純色! 但是綠色 不好改變顏色。 需要變成 3-5 的 黑白圖。 那就將純顏色的綠, 使用 Replace Color 節點處理, 然後在傳給 Lerp 4-8 是 4-7 的動畫版本 對 Twirl 節點的 UV 做 Rotate 旋轉 動畫。 記得使用時間驅動~~~~4-9 Pattern Fish Eye 圖案魚眼 在 2- 7 中使用過 Spherize (球面化) 節點 。 使用時間 直接驅動 它的 Offset, 就實現了 滾動動畫。 在把 結果 傳入 Checkerboard 的UV 輸入節點 !!!5-1 Noise Color Blend 確實是兩個顏色混合的一種方式。 噪聲的結果 作為 Lerp的 T 傳入。 結果就是 顏色 A, 顏色 B 的 插值。 5-2 Noise Color Blend Auto Scroll 噪聲的 UV 滾動動畫。 時間驅動 Tiling And Offset 的 Offset , 結果作為 噪聲的 UV 輸入 !!!5-3 Noise Color Split 說 顏色分離也對, 結果純非黑即白! 就是對噪聲 通過 Step 節點處理一下 !5-4 ping-pong 動畫 這個簡單, 主要就是讓 Step 的 Edge 輸入引數 在 0~1 之間 做 Ping-Pong 動畫! 老套路 :對 Sine 結果 做重對映到 0~1 5-5 Noise Color Split Waves 噪音顏色分裂波 關鍵點 是如何總噪聲 到 波紋。 動畫就是 時間驅動 Tiling And Offset 的 Offset , 結果作為 噪聲的 UV 輸入 !!! 先把 Noise Amount 的數值 設定為 100, 看效果。
這肯定就不是博文了, Noise Amount 值很小 到1的時候 才好 !!!! Step 節點 如果輸入In大於等於輸入Edge,返回1(白色),否則返回0(黑色)5-6 Noise Circle 噪聲圈 噪聲 * UV在中心點的Distance 將 結果 通過 Step 處理一下(這個是最終的 黑白外觀) Step結果 傳入 Lerp 的引數T , 進行著色 !!!思考一下 UV, 和 Distance 之間的處理?
5-7 Quad - Noise Circle Auto Scroll 是 5-6 的動畫版本, 動畫就是 時間驅動 Tiling And Offset 的 Offset , 結果作為 噪聲的 UV 輸入 !!! 5-8 Noise Voronoi 泰森多邊形法 有一個專門的 節點 Voronoi 泰森多邊形。 代替 5-1中的 噪聲節點5-9 Noise Voronoi Shuffle 噪音泰森多邊形法洗牌 就是時間驅動 Voronoi 節點的 Angle Offset 節點 !!!

相關推薦

解讀Unity2018 ShaderGraph 示例 Procedural

ShaderGraph 使您可以直觀地構建著色器。 您可以在圖形網路中建立和連線節點,而不是手寫程式碼。 在之前Unity中包含兩個比較有名的外掛:Shader Forge  , 在Asset Store中已經搜尋不到了, 應該是作者也不打算怎麼更新了,

ComboBox在WPF的綁定示例綁定項、集合、轉換,及其源代碼

ati .com med owa panel center generic tle summary 在WPF的Xaml中為ComboBox綁定數據時,由於參數很多,很容易混淆,在ListView中使用更是如此。本文通過對ComboBox在窗口和在ListView中綁定對象的

呼叫鏈系列二解讀UAVStack的呼叫鏈技術

在上週的推送中,我們介紹了呼叫鏈的模型設計與模型時序圖,本週將為大家繼續介紹呼叫鏈是如何在中介軟體增強技術的賦能之下實現服務端資訊收集以及服務間上下文傳遞的。 服務端資訊收集 服務端資訊收集流程如下圖所示,通過在應用容器(Tomcat等)啟動過程中植入切點,實現在應用邏輯執行之前和之後對請求進行劫持。

呼叫鏈系列三解讀UAVStack的呼叫鏈技術

本專題前幾篇文章主要從架構層面介紹瞭如何實現分散式呼叫追蹤系統。這篇文章我們不談架構,就其中的一項關鍵技術實現進行深入探討:如何從超文字傳輸協議(HTTP)中獲取request和response的body和header。 在Java中,HTTP協議的請求/響應模型是由Servlet規範+Servlet容

Mybatis(四)MyBatis核心元件介紹原理解析和原始碼解讀 java代理,靜態代理,動態代理以及spring aop代理方式,實現原理統一彙總

Mybatis核心成員 Configuration        MyBatis所有的配置資訊都儲存在Configuration物件之中,配置檔案中的大部分配置都會儲存到該類中 SqlSession         &

呼叫鏈系列(一)解讀UAVStack的貪吃蛇-呼叫鏈

背景         對於分散式線上服務,一個請求需要經過多個系統中多個模組,可能多達上百臺機器的協作才能完成單次請求。這種場景下單靠人力無法掌握整個請求中各個階段的效能開銷,更無法快速的定位系統中效能瓶頸。當發生故障時通常需要檢視大量日誌跨越多個團隊來確認問題。

Python004-資料處理示例以某個資料(欄位)為基準從資料獲取不同的欄位行數

資料來源樣式如下所示:   需求: 讀取文字,以第一列為基準參考系,每個基準僅輸出滿足需要條數的資料;不滿足,全部輸出。 比如,基準為 6236683970000018780,輸出條數要求為 5。若文字中含有  6236683970000018780 多於

MDX示例求解位數、四分位數(median、quartile)

一個人力資源諮詢集團通過網路爬蟲採集手段將多個知名招聘網站上釋出的求職和招聘等資訊準實時採集到自己的庫裡,形成一個數據量浩大的招聘資訊庫,跟蹤全國招聘和求職的行業、工種、職位、待遇等資訊,並通過商業智慧系統,開展職業職位供求及趨勢等相關統計分析。這家公司竟然用SSAS

python logging模組程式碼示例實現日誌輸出到控制檯, 並且寫入日誌檔案

import logging class Logger(object): def __init__(self, log_file_name, log_level, logger_name):

Radix Tree在Hyper的實現解讀Hyper論文《 The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases 》

有問題可以給我發郵件[email protected] 本文討論如何在實際的資料庫系統中應用Radix Tree作為索引,暨解讀HyPer的論文:The Adaptive Radix Tree:ARTful Indexing for Main-Memory Da

呼叫鏈系列(1)解讀UAVStack的貪吃蛇

一、背景 對於分散式線上服務,一個請求需要經過多個系統中多個模組,可能多達上百臺機器的協作才能完成單次請求。這種場景下單靠人力無法掌握整個請求中各個階段的效能開銷,更無法快速的定位系統中效能瓶頸。當發生故障時通常需要檢視大量日誌跨越多個團隊來確認問題。 二、舉個栗子 程式猿小亮作為一個在職場摸爬滾打多年

綜合示例自動生成一組新聞

lap func tel style display ima one closed alt 點擊按鈕,自動生成5條新聞信息 用一組數組把5條新聞保存起來, 再運用 if 判讀和 for 循環來達到自動生成的效果 1 <!DOCTYPE HTML> 2

解讀京東“拉黑門”被拐彎的真相

京東物流這些天,一則京東封停天天、百世物流的消息甚囂塵上,部分輿論更是指責京東過於“霸權”,一些被封停的物流官微更是在社交媒體上發起“聲討大字報”,認為京東此舉給其帶來了巨大傷害。而京東在稍後給出的官方解釋說明中,明確闡述了此“封殺”之舉為維護用戶體驗、為用戶構建良好的購物環境所趨,並不存在因為商業利益而站隊

擴增子圖表解讀1箱線圖Alpha多樣性

nova 核心 變化 宏基 ova 中位數 ring sphere gen 箱線圖 箱形圖(Box-plot)又稱為盒須圖、盒式圖或箱線圖,是一種用作顯示一組數據分散情況資料的統計圖。因形狀如箱子而得名。在宏基因組領域,常用於展示樣品組中各樣品Alpha多樣性的分布

shell腳本示例計算毫秒級、微秒級時間差

calc eva bsp -c log 數學 需要 示例 內容 有時候需要計算命令的執行時間長度,可以使用time命令,雖然time命令可以精確到毫秒級,但time命令無法計算一堆命令的執行時間。可以也可以直接使用date命令計算命令執行前後的時間差,但直接使用date命令

Eigen的noalias() 解決矩陣運算的混淆問題

需要 右值 什麽 原因 lan sin 一個 eba ner 作者:@houkai本文為作者原創,轉載請註明出處:http://www.cnblogs.com/houkai/p/6349990.html 目錄 混淆例子解決混淆問題混淆和component級的操作。混淆

解讀pythonSocketServer源碼

cli eve sockets tro png onclick 計算機 第一個 類對象 在看SocketServer源碼之前,先看一個例子: class Base(object): def __init__(self, name):

深入解讀php抽象(abstract)類和抽象方法

抽象類 php 抽象方法 在面向對象(OOP)語言中,一個類可以有一個或多個子類,而每個類都有至少一個公有方法作為外部代碼訪問的接口。而抽象方法就是為了方便繼承而引入的,現在來看一下抽象類和抽象方法分別是如何定義以及他們的特點。什麽是抽象方法?我們在類裏面定義的只有方法名沒有方法體的方法就是抽象方

Sqlite3,維基百科的練習

ace pri weight 子結構 from blog post hit 1.3 https://en.wikibooks.org/wiki/SQL_Exercises/The_computer_store 兩個相連的表格 Manufactures: code, name

[14-03] 示例利用匿名內部類簡化代碼

state value 日誌輸出 try sys 異常處理 黃色 ext setname 內部類的其中一個優勢就是可以簡化代碼,現在以一個常用的JDBC獲取數據封裝對象的例子,來簡單談談如何使用匿名內部類來簡化代碼。下面這段代碼,是用JDBC連接,到數據庫查詢到數據之後,將