URP | Shader實(shí)現(xiàn)彎曲效果

目的
實(shí)現(xiàn)場景彎曲球體效果
增加宏控制是否開啟彎曲。
自定義函數(shù)庫,調(diào)用函數(shù)庫
學(xué)習(xí)腳本控制材質(zhì)屬性
思路
獲取模型的世界空間位置信息,頂點(diǎn)世界位置信息和攝像機(jī)位置相減,計(jì)算出一個XYZ的3維向量。
根據(jù)這個XYZ的方向乘偏移系數(shù)。計(jì)算出的結(jié)果偏移 Y軸,
目前計(jì)算都是在世界空間下完成,我們需要轉(zhuǎn)換到模型空間對頂點(diǎn)位置進(jìn)行修改。

彎曲實(shí)現(xiàn)
我們需要獲取那些熟悉信息
頂點(diǎn)世界空間的位置信息
攝像機(jī)的位置信息
準(zhǔn)備數(shù)據(jù)
頂點(diǎn)2個變量控制X還Z的彎曲數(shù)值。
在頂點(diǎn)著色器階段 獲取頂點(diǎn)世界位置信息和攝像機(jī)位置

注意:這里只是示例Shader 沒有輸出到片元著色器階段,如果需要可以輸出到片元著色器階段。
增加彎曲系數(shù)

這里是倆個 方向,一個是X方向, 一個是Z方向。
創(chuàng)建一個三維向量,修改這個三維向量的Y軸。

這里世界頂點(diǎn)位置加我們剛剛計(jì)算出的結(jié)果。
現(xiàn)在是在世界空間,我們需要轉(zhuǎn)換到模型空間

傳入頂點(diǎn)位置信息,輸出到渲染屏幕
效果
頂點(diǎn)效果就出現(xiàn)了


設(shè)置關(guān)鍵字
目前效果實(shí)現(xiàn)了,我們需要一個開關(guān),控制是否開啟。
定義紋理
增加關(guān)鍵字
頂點(diǎn)結(jié)構(gòu)體 增加判斷
這里一個是默認(rèn)的頂點(diǎn)轉(zhuǎn)換到屏幕空間。 ?一個是頂點(diǎn)動畫計(jì)算完在轉(zhuǎn)換到屏幕空間。
效果

全代碼
函數(shù)庫的使用方法
創(chuàng)建一個文件,改成hlsl文件格式。

在文件里增加庫語法
定義一個函數(shù),我們原來的頂點(diǎn)計(jì)算放到函數(shù)里
TransformWorldToHClip ? ?這里我們看到計(jì)算需要輸入頂點(diǎn)位置信息,以及控制彎曲的X,Z的數(shù)值。
注意:這里輸出的是float4類型。
在回到Shader里,導(dǎo)入剛剛定義的庫。
使用函數(shù)替換 原來的代碼
注意:下面這個就是我們剛剛自定義的函數(shù)。
源代碼
hlsl文件
Shader
C# 腳本控制Shader屬性
這里使用動畫曲線控制切換的屬性,一開是是一個平面變成帶有弧度的半球體
創(chuàng)建一個C# 腳本,AnimationCurveTest
創(chuàng)建 幾個變量,外部控制,使用Update函數(shù) 設(shè)置材質(zhì)屬性。
效果

擴(kuò)展 在C#中怎么獲取Shader里的材質(zhì)屬性?
第一種獲取材質(zhì)球?qū)傩?/h1>最簡單的一種獲取材質(zhì)的方法
效果

最簡單的一種獲取材質(zhì)的方法
效果

這樣就需要把材質(zhì)拖到腳本里,這有一個缺點(diǎn),每次都需要拖入。
第二種獲取材質(zhì)球方法
變量不暴露出去,
擴(kuò)展 還可以獲取多個材質(zhì)?
Material[] m_arr_material = GetComponent<Renderer>().materials;
調(diào)整曲線實(shí)現(xiàn)切換效果
設(shè)置好曲線數(shù)值,效果

總結(jié)
根據(jù)攝像機(jī)計(jì)算模型頂點(diǎn)動畫,

使用關(guān)鍵字控制開啟關(guān)閉彎曲變形。

C#腳本控制材質(zhì)屬性的方法
使用函數(shù)庫的方法定義函數(shù),這樣干凈簡單,后期好維護(hù)。
