ETH官方钱包

前往
大廳
主題

【Unity Shader 學(xué)習(xí)筆記】水晶效果

%%鼠 拒收病婿 | 2020-12-22 03:41:52 | 巴幣 40 | 人氣 1099

就是跟著這影片打的:

以下是自己對(duì)語(yǔ)法的學(xué)習(xí)筆記:

展示: (我還是不懂為甚麼是倒過(guò)來(lái)的 )


先發(fā)比較短的C# 腳本。
傳參數(shù)給Shader變數(shù)可用(例如) Shader.SetGlobalFloat( shader內(nèi)宣告的變數(shù)名稱(chēng),  值);

>> 或 << 是 位元移動(dòng)運(yùn)算子。 因?yàn)槭?進(jìn)位, x << 1 等於 x * 2, x << 2 等於 x * 4。這篇文章比較詳細(xì)。
在這裡是讓攝影機(jī)像素/ 2^_downResFacter,達(dá)到模糊感(南部畫(huà)質(zhì)特效)。

接下來(lái)都是Shader的事情:
一開(kāi)始以為變數(shù)也要宣告在Properties,後來(lái)才發(fā)現(xiàn)若是用外部腳本傳進(jìn)來(lái)的參數(shù),是不能設(shè)成外顯的。


雖然影片中有說(shuō)COLOR的值是從SpriteRender傳入的,但我手癢把COLOR改成隨便的語(yǔ)意,例TEXCOORD都還是通,亂玩一通發(fā)現(xiàn)就POSITION不能改成其他的 (改了位置就跑掉了)。 我還要想想這是為甚麼....


拍謝註解一堆

這篇#2有對(duì)世界座標(biāo)轉(zhuǎn)換順序方法與順序做比較好的解釋?zhuān)揖妥€(gè)大概:
第一步:
o.vertex = UnityObjectToClipPos(v.vertex);
把點(diǎn)從模型空間轉(zhuǎn)到剪裁空間。剪裁空間可以想成是一種投影或screen space。

第二步:
float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
unity_ObjectToWorld是Unity內(nèi)建的轉(zhuǎn)換矩陣。
在shader中,float3會(huì)被當(dāng)成是"方向"而非"位置",需要float4的w值才是個(gè)完整的"位置"資訊。
w的概念是齊次座標(biāo)(Homogeneous Coordinate),這個(gè)影片講得還不錯(cuò)。
簡(jiǎn)單來(lái)講是用w當(dāng)成縮放值,在orthographic模式下會(huì)=1,但在透視模式下需做第59行的處理,我個(gè)人對(duì)它的理解是"深度",物體離開(kāi)、接近鏡頭時(shí)縮放用(?。

至於NDC(標(biāo)準(zhǔn)化設(shè)備坐標(biāo)),我找到這篇的解釋?zhuān)?D的場(chǎng)景最終都要呈現(xiàn)在2D的螢?zāi)划?huà)面上,螢?zāi)坏淖鶚?biāo)就是要展示在的NDC。


第73行,tex2D(),根據(jù)這篇#4,是回傳該uv位置上的貼圖顏色,且一定是float 4。(會(huì)自動(dòng)補(bǔ)0)。
tex2D(_MainTex,i.uv) * i.color;  意思是貼圖顏色 * sprite render的color,做到color tint
xyz或rgb都可以用。

第75行,將normal map改成世界座標(biāo)
float2 offset = mul( unity_ObjectToWorld, tex2D(_OffsetTex,i.uv).xy * 2 - 1);

意思是將normalMap位移的值轉(zhuǎn)成世界座標(biāo)位移的量。 (*2-1)是將範(fàn)圍[0~1]的uv轉(zhuǎn)成範(fàn)圍[-1~1]

第77行
float4 ambient= tex2D(_AmbientTex, (i.screenuv + offset + _GlobalRefractionMag * 5 )* 2);
放進(jìn)背景貼圖,更有融入感。 後面的乘數(shù)是影片作者加的,單純讓效果好一點(diǎn)。

第78行
float4 worldRef1= tex2D(_GlobalRefractionTex, i.screenuv + offset.xy *_GlobalRefractionMag);
將相機(jī)傳入的texture放到加了位移的uv座標(biāo)上。
_GlobalRefractionMag只是個(gè)很小的乘數(shù),讓offset不要太強(qiáng)。

最後就是rgb加一加,透明度乘一乘輸出。

其中第82、83行我好奇測(cè)試screenuv和uv差在哪, screenuv會(huì)隨著自己在螢?zāi)簧弦苿?dòng)時(shí)改變,uv則是固定的。
若兩個(gè)camera重疊,則玩家物件會(huì)剛好跟倒影重疊,影片開(kāi)頭將倒影攝影機(jī)往旁邊移動(dòng)一點(diǎn)是為了讓成像的screenuv的原點(diǎn)與mainCamera錯(cuò)開(kāi)。




送禮物贊助創(chuàng)作者 !
0
留言

創(chuàng)作回應(yīng)

樂(lè)小呈
想到之前也遇到反轉(zhuǎn)的問(wèn)題,翻了一下舊專(zhuān)案,我當(dāng)初是這樣修的可以參考一下
2020-12-22 10:43:22
樂(lè)小呈
o.uvgrap = ComputeGrabScreenPos(o.vertex);
2020-12-22 10:43:26
樂(lè)小呈
fixed4 col = tex2Dproj(_GrabTexture, i.uvgrap);
2020-12-22 10:43:41
樂(lè)小呈
我們的做法不太依樣,僅供參考 XD
2020-12-22 10:44:45
%%鼠 拒收病婿
看起來(lái)是從FrameBuffer中copy一份紋理的做法?,grabpass好像有效能問(wèn)題,LWRP貌似要用其他方法取代它
2020-12-22 21:47:44
派大星教授死掉了咩噗
vs裡面計(jì)算screenuv完把它flip一下就好了 o.screen.y = 1.0 - o.screenuv.y;
寫(xiě)shader有時(shí)候會(huì)遇到, 通常是因?yàn)閐irectx opengl等平臺(tái)差異
screenuv一個(gè)是左上角當(dāng)0,0一個(gè)是左下當(dāng)0,0 很瞎
2020-12-22 14:43:15
%%鼠 拒收病婿
成功了!!! 大感謝,選你正解XD
2020-12-22 21:50:56
追蹤 創(chuàng)作集

作者相關(guān)創(chuàng)作

相關(guān)創(chuàng)作

更多創(chuàng)作