日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity Shader 实现透明护盾效果

發布時間:2024/3/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity Shader 实现透明护盾效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


這是大致的效果圖,圖片壓得有點糊。我參考了本篇博客 Unity shader護盾特效.
這是原博客展示的圖片:

本例采用了特殊的模型與貼圖,原博客里有視頻鏈接的教程,從模型到貼圖。
以下是代碼

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'Shader "Summer/Shield" {Properties{_MainTex ("Texture", 2D) = "white" {}_ScanTex ("Scan Texture", 2D) = "white" {}_Color("Color",Color)=(0,0,0,1)_ScanColor("Scan Color",Color)=(0,0,0,1)_RimColor("rim color",Color) = (1,1,1,1)//邊緣顏色_RimPower ("rim power",range(1,10)) = 2//邊緣強度_FresnelScale("ScanFresnelScale",range(0,1))=0.5_ScanSpeed("ScanSpeed",range(0,2))=0.5_ScanScale("ScanScale",range(0,1))=0.1}SubShader{Tags { "Queue"="Transparent""IgnoreProjector" = "True" //我們不希望任何投影類型材質或者貼圖,影響我們的物體或者著色器"RenderType" = "Transparent" }LOD 100ZWrite OffBlend SrcAlpha OneMinusSrcAlphaCGINCLUDE#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;//涉及到了兩個UV通道float2 scanUV:TEXCOORD1;fixed4 color:COLOR;float3 normal:NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;fixed4 vertColor:TEXCOORD1;float2 scanUV:TEXCOORD2;};sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Color;sampler2D _ScanTex;float4 _ScanTex_ST;fixed4 _ScanColor;float _ScanSpeed;fixed4 _RimColor;float _RimPower;fixed _FresnelScale;fixed _ScanScale;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.scanUV=TRANSFORM_TEX(v.scanUV,_ScanTex);float3 V = WorldSpaceViewDir(v.vertex);V = mul(unity_WorldToObject,V);//視方向從世界到模型坐標系的轉換o.vertColor=v.color;o.vertColor.r = dot(v.normal,normalize(V));o.vertColor.r*=sign(o.vertColor.r);//取正,sign返回其符號,使其計算的漫反射系數為正return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);i.scanUV.y+=_Time.y*_ScanSpeed;fixed scanF=tex2D(_ScanTex,i.scanUV).a;clip(-scanF);col=col*i.vertColor.a*_Color;fixed fresnel=_FresnelScale+(1-_FresnelScale)*pow((1-i.vertColor.r),_RimPower);fixed fresnleAlpha=lerp(0,1,fresnel);fixed4 backCol=fixed4(_RimColor.rgb,fresnleAlpha);fixed4 fianlColor=(col+backCol)+_ScanColor*scanF;return fianlColor;}v2f vert_Convex(appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.scanUV=TRANSFORM_TEX(v.scanUV,_ScanTex);float3 V = WorldSpaceViewDir(v.vertex);V = mul(unity_WorldToObject,V);//視方向從世界到模型坐標系的轉換o.vertColor=v.color;o.vertColor.r = dot(v.normal,normalize(V));o.vertColor.r*=sign(o.vertColor.r);float4 pos=mul(UNITY_MATRIX_MV,v.vertex);float3 normal=mul((float3x3)UNITY_MATRIX_IT_MV,v.normal);normal.z-=0.2;pos+=float4(normalize(normal),0)*(_ScanScale);o.vertex=mul(UNITY_MATRIX_P,pos);return o;}fixed4 frag_Convex (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);i.scanUV.y+=_Time.y*_ScanSpeed;fixed scanF=tex2D(_ScanTex,i.scanUV).a;if(scanF==0){discard;}col=col*i.vertColor.a*_Color*(1-i.vertColor.a);fixed fresnel=_FresnelScale+(1-_FresnelScale)*pow((1-i.vertColor.r),_RimPower);fixed fresnleAlpha=lerp(0,1,fresnel);fixed4 backCol=fixed4(_ScanColor.rgb,fresnleAlpha);fixed4 fianlColor=col+backCol+fresnleAlpha*_ScanColor;return fianlColor;}ENDCGPass{Cull OffCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbaseENDCG}Pass{CGPROGRAM#pragma vertex vert_Convex#pragma fragment frag_Convex#pragma multi_compile_fwdbaseENDCG}} }

主要思路是兩個Pass,一個渲染主體,該部分要剔除掉掃描到的部分;第二個Pass渲染掃描部分,即頂點經過偏移(向法線方向突出),該部分剔除未掃描的部分,從而實現一個動態掃描頂點偏移的效果。一開始我想的是一個Pass,在vert里進行掃描圖片(掃描圖片:一張模擬掃描效果的貼圖,類似流光貼圖)的采樣,然后將該頂點偏移,但后來發現tex2D獲取的值不能在vert里使用(我也不知道為什么,一用就報錯),最后只能用這種最簡單的方式。

第一個Pass部分

float3 V = WorldSpaceViewDir(v.vertex);V = mul(unity_WorldToObject,V);//視方向從世界到模型坐標系的轉換o.vertColor=v.color;o.vertColor.r = dot(v.normal,normalize(V));o.vertColor.r*=sign(o.vertColor.r);//取正,sign返回其符號,使其計算的漫反射系數為正不用saturate的原因是saturate將小于0的取為,而我關了剔除,這樣看到背面就是純色而沒有透明效果 i.scanUV.y+=_Time.y*_ScanSpeed;fixed scanF=tex2D(_ScanTex,i.scanUV).a;//該圖是PNG,所以通過a通道便可區分clip(-scanF);//剔除alpha大于0的像素 //菲涅爾效果fixed fresnel=_FresnelScale+(1-_FresnelScale)*pow((1-i.vertColor.r),_RimPower);fixed fresnleAlpha=lerp(0,1,fresnel);fixed4 backCol=fixed4(_RimColor.rgb,fresnleAlpha);

第二個Pass部分

進行頂點變換,在視角空間下進行沿法線方向的頂點偏移float4 pos=mul(UNITY_MATRIX_MV,v.vertex);float3 normal=mul((float3x3)UNITY_MATRIX_IT_MV,v.normal);normal.z-=0.2;pos+=float4(normalize(normal),0)*(_ScanScale);o.vertex=mul(UNITY_MATRIX_P,pos); 剔除Alpha值為零,即未掃描到的像素i.scanUV.y+=_Time.y*_ScanSpeed;fixed scanF=tex2D(_ScanTex,i.scanUV).a;if(scanF==0){discard;}

好了,這大概就是全部了,感謝你的閱讀,如有錯誤,歡迎舉正。

總結

以上是生活随笔為你收集整理的Unity Shader 实现透明护盾效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 青青草国产精品 | 亚洲涩情 | 午夜插插插 | 人人看人人草 | 成人精品视频一区二区 | 成年人免费毛片 | 精品久久中文 | 国产精品99久久久 | 国产色综合天天综合网 | 香蕉视频成人在线 | 亚洲精品一区二区在线 | 亚洲人妻一区二区三区 | 偷拍精品一区二区三区 | 国产精品一区二区网站 | www.超碰| 夜夜操天天 | 成人免费片库 | 激情文学88 | 激情小说欧美色图 | 欧美日韩一区二区三区在线电影 | 成人激情综合 | 永久免费在线观看av | jizz日韩| 国产精品综合网 | 99视频在线 | 男女黄网站| 国产亚洲精品女人久久久久久 | 国产乱码精品一区二区三区五月婷 | 麻豆视频网址 | 国产精品观看 | 无码日韩人妻精品久久蜜桃 | 好看的黄色录像 | 黑人与亚洲人色ⅹvideos | 伊人久久大香线蕉av色婷婷色 | 日本一区二区久久 | 看黄色网址 | 精品在线99 | 国产精品永久在线 | 国产男女无遮挡猛进猛出 | 一区二区三区伦理 | 亚洲精品久久久久久国产精华液 | 亚洲最新中文字幕 | 伊人久久麻豆 | 激情福利在线 | 好色综合 | 亚洲精品视频一区二区 | 放荡的美妇在线播放 | 亚洲美女屁股眼交3 | 久久天天躁狠狠躁夜夜躁 | 亚洲制服丝袜av | 99久久国产宗和精品1上映 | 日日爽 | 精品国产一区二区三区久久久久久 | www.九色 | 青青青免费在线 | 91精品国产自产精品男人的天堂 | 无人在线观看高清视频 单曲 | 日本一区二区三区在线免费观看 | 吞精囗交69激情欧美 | 国产精品1区2区 | 欧美精品一二区 | 91看片视频| 日韩欧美精品在线播放 | 91.久久| 欧美欧美欧美 | 男生把女生困困的视频 | 成人手机在线观看 | 国产精品久久久久久久午夜 | 亚洲av日韩av永久无码下载 | 理论片午午伦夜理片影院99 | 摸摸摸bbb毛毛毛片 午夜爽爽影院 | 亚洲另类自拍 | 青青青免费在线视频 | 久久久久国产视频 | av一区在线| 国产高清视频一区二区 | 亚洲四区 | 视频区小说区图片区 | 天天综合精品 | 欧美成一区二区三区 | 亚洲免费网 | 日韩av一级片| 国产97色在线 | 日韩 | 国产在线观看a | 成人免费视频国产 | 欧美精品成人一区二区在线观看 | 国产精品一区二区三区四区在线观看 | 日韩成人欧美 | 亚洲偷偷自拍 | 护士的小嫩嫩好紧好爽 | 亚洲熟妇国产熟妇肥婆 | 亚洲香蕉久久 | 91免费版在线 | 国产精品一线 | 制服丝袜国产在线 | 91福利影院 | 欧美丰满熟妇xxxxx | 野外(巨肉高h)| 午夜影院在线免费观看 |