最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

自用代碼

2023-02-25 14:30 作者:夢夏螢火蟲  | 我要投稿

Shader "SepShader/SnowShader" { Properties { _MainTex("Base (RGB)", 2D) = "white" {} ??_Snow("Snow Level", Range(0,1)) = 0 _SnowColor("Snow Color", Color) = (1.0,1.0,1.0,1.0) _SnowDirection("Snow Direction", Vector) = (0,1,0)//此處表示的其實(shí)是雪落下方向的反向,比如我們默認(rèn)雪是從天空直接落下來的,理論上應(yīng)該為(0,-1,0),但是此處取得是它的反向,用的是(0,1,0) _SnowDepth("Snow Depth", Range(0,0.3)) = 0.1 //新的凹凸紋理貼圖 ???_Bump("Bump", 2D) = "bump" {} //濕潤度 _Wetness("Wetness", Range(0, 0.5)) = 0.3 } SubShader{ Tags{ "RenderType" = "Opaque" } LOD 200 ? CGPROGRAM //我們在下邊代碼的末尾加入了vertex:vert表示我們將使用自己定義的vertex函數(shù),此函數(shù)名稱為vert。 ??#pragma surface surf Lambert vertex:vert ? sampler2D _MainTex; //必須添加一個(gè)與Properties代碼區(qū)中的同名的_Bump變量,作為Properties中_Bump的引用。 //具體緣由詳見教程第一部分。 sampler2D _Bump; float _Snow; float4 _SnowColor; float4 _SnowDirection; float _SnowDepth; float _Wetness; //此處要注意,我們不能直接用每個(gè)像素的法向值,因?yàn)榉ㄏ蛸N圖(normal map)為我們計(jì)算的每個(gè)像素法向值是在切空間的法向值,所以我們必須重新計(jì)算出每個(gè)像素在世界坐標(biāo)系下真正的法向值,以此來和SnowDirection進(jìn)行比較來決定此處是否覆蓋上雪的顏色。 ? //得到世界坐標(biāo)系下的法向量還是有點(diǎn)麻煩的,為此我還特意看了下官方文檔。因?yàn)槲覀兊谋砻嬷鲗懭肓薿.Normal,所以按照第一部分的講解,我們需要使用INTERNAL_DATA來計(jì)算世界坐標(biāo)系下的法向量,此處我們使用了WorldNormalVector函數(shù)。 struct Input { float2 uv_MainTex; //用來得到_Bump的uv坐標(biāo) float2 uv_Bump; float3 worldNormal; INTERNAL_DATA }; ? void surf(Input IN, inout SurfaceOutput o)? { ? //該像素的真實(shí)顏色值 half4 c = tex2D(_MainTex, IN.uv_MainTex); ? //從凹凸貼圖中得到該像素的法向量 o.Normal = UnpackNormal(tex2D(_Bump, IN.uv_Bump)); ? half difference = dot(WorldNormalVector(IN, o.Normal), _SnowDirection.xyz) - lerp(1, 0, _Snow); difference = saturate(difference / _Wetness); o.Albedo = difference * _SnowColor.rgb + (1 - difference) *c; o.Alpha = c.a; } /* 首先我們傳給vert函數(shù)一個(gè)參數(shù)appdata_full v,參數(shù)的類型為appdata_full(Unity內(nèi)置類型),該類型包含了紋理坐標(biāo),法向量,頂點(diǎn)位置,以及切線信息。如果你還需要使用其他的數(shù)據(jù)類型,你可以使用自定義的輸入結(jié)構(gòu)體作為pixel函數(shù)的第二個(gè)參數(shù)傳遞額外的信息 — 目前我們不需要這樣做。 _SnowDirection使用的是世界坐標(biāo)系,但是我們需要的其實(shí)是模型局部坐標(biāo)系下的_SnowDirection。所以我們需要先將_SnowDirection轉(zhuǎn)化到模型的局部坐標(biāo)系下。而我們只需要將_SnowDirection乘以Unity內(nèi)置矩陣 – UNITY_MATRIX_IT_MV(IT表示Inverse Transpose逆轉(zhuǎn)置矩陣,MV表示 ModelView矩陣,該矩陣表示是ModelView的逆轉(zhuǎn)置矩陣)。 現(xiàn)在我們得到了該頂點(diǎn)的法向量(vert函數(shù)應(yīng)該是對每個(gè)vertex調(diào)用一次,相對于surf函數(shù)對每個(gè)pixel調(diào)用一次)。我們?nèi)匀幌裆厦孀龇e雪效果時(shí)那樣,將轉(zhuǎn)換坐標(biāo)系空間后的雪落下相反方向和模型局部坐標(biāo)系下的法向量進(jìn)行點(diǎn)乘,得到的結(jié)果仍然和一個(gè)插值比較。不過此時(shí)插值項(xiàng)不再是_Snow,而是_Snow*2/3,這表示只有那些更接近雪落下方向的區(qū)域才會增加雪的厚度,更符合自然現(xiàn)象。 而這些通過測試的區(qū)域,沿著(sn.xyz+v.normal)方向進(jìn)行加厚,也就是將其頂點(diǎn)沿此方向伸展一定距離。注意到增厚的程度取決于_SnowDepth和_Snow,而增厚的方向是由物體法向和雪落的方向綜合作用的,這也符合自然現(xiàn)象。 */ void vert(inout appdata_full v) { //將_SnowDirection轉(zhuǎn)化到模型的局部坐標(biāo)系下 if (dot(v.normal, _SnowDirection.xyz) >= lerp(1, 0, ((1 - _Wetness) * _Snow * 2) / 3)) { v.vertex.xyz += (_SnowDirection.xyz + v.normal) * _SnowDepth * _Snow; } } ENDCG } FallBack "Diffuse" }

自用代碼的評論 (共 條)

分享到微博請遵守國家法律
望城县| 高青县| 淮南市| 中山市| 平原县| 永靖县| 内丘县| 虹口区| 乐都县| 麻阳| 长治市| 襄樊市| 南康市| 金坛市| 烟台市| 敦煌市| 县级市| 吉安市| 昭苏县| 安福县| 江山市| 霍山县| 大连市| 南宫市| 呼和浩特市| 渝北区| 楚雄市| 原平市| 巴东县| 珲春市| 封丘县| 同仁县| 普兰店市| 利津县| 囊谦县| 唐山市| 雷山县| 永济市| 绥德县| 康马县| 涟水县|