这是大致的效果图,图片压得有点糊。我参考了本篇博客 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 实现透明护盾效果相关推荐

  1. Unity Shader 之 简单 护盾Shield 效果的实现

    Unity Shader 之 简单 护盾Shield 效果的实现 目录 Unity Shader 之 简单 护盾Shield 效果的实现 一.简单介绍 二.实现原理

  2. Unity Shader · 科技感矩阵效果

    Unity Shader · 科技感矩阵效果 前言 最近想要做一个次世代卡通渲染(伪),选的是崩崩崩的小八(我最喜欢小八了). 先放几张截图,等全部做完之后再分享用到的一些技术叭. 赶紧做完发B站,等 ...

  3. Unity Shader·屏幕抖音效果

    Unity Shader·屏幕抖音效果 前言 最近在做一个新的MMD(用Unity来实现),其中用到了一些好看的渲染技术在这里分享一下. 视频链接 https://www.bilibili.com/v ...

  4. Unity Shader学习:油画效果

    Unity Shader学习:油画效果 油画效果在学习浅墨大神的文章时看到的比较有趣,但是原文中也没详细的算法介绍如何实现,这里就先直接拿来用吧,UI和屏幕后处理都可以用,算法也看的不是很明白,好像是 ...

  5. Unity Shader 之 透明效果

    本文引用 Unity Shader入门精要 开启透明混合后,一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值外,还有--透明度.透明度为1,则完全不透明,透明度为0,则完全不会显示. 在Unity ...

  6. unity shader 纹理透明效果

    1.纹理映射基础 (1)纹理映射通过(u,v)坐标实现.注意:这句话时博主当时面试一家外企被问到的问题. (2)添加纹理属性:--MainTex("Main Tex",2D)=&q ...

  7. Unity Shader 实现卡通渲染效果

    本文参考博客Unity Toon Shader 卡通着色器(一):卡通着色 这是我实现的最后效果 我们先一步一步来 最开始我们实现一个只有漫反射效果的Shader,效果和代码如下 Shader &qu ...

  8. (三十一)unity shader之——————透明和半透明材质

    一.半透明材质 SSS(sub-Surface Scattering,3S)的中文意思是次表面散射或称半透明材质.它适用于表现各种有次表面反射的材质,如透明橡胶.有机玻璃或玉石等.因为实时渲染是不可能 ...

  9. unity Shader模拟ps渐变映射效果

    美术要求程序实现一个类似photo中"渐变映射"的效果. 记录一下用unity完成的shader. 放一张路易斯 那么渐变映射的原理是什么?以下是百度的结果: 在使用时,渐变映射首 ...

最新文章

  1. as 关联 android源码,android studio 2.x以上关联源码
  2. 用JS实现人脑和计算机交互,这个厉害了
  3. [云炬创业管理笔记]第四章把握创业机会测试3
  4. boost::mp11::mp_replace_at_c相关用法的测试程序
  5. linux 误删除mysql表能恢复吗,Linux误删数据恢复
  6. 数据加载中gif_淮师大GIF加载中......
  7. 删除ubuntu旧内核
  8. 软件构建中的设计(一)
  9. 阶段3 2.Spring_07.银行转账案例_9 基于子类的动态代理
  10. UCHome全面大解析【二】----基本体系结构
  11. 关于AD域和Exchange邮件服务器的学习总结
  12. Tri-Training: Exploiting Unlabeled Data Using Three Classifiers
  13. 条件表达式a?b:c是什么意思
  14. es2015学习笔记经典入门教程
  15. 计算机exo乐谱,【图片】【送谱】EXO所有歌曲的谱子【吉他谱吧】_百度贴吧
  16. 朱一龙左娜扎右热巴,王栎鑫:我想活成你的样子
  17. 教你一招:Word中的文字转换成表格,把表格转换成文字
  18. 深入分析 Uniswap V3 流动性供应的数学原理
  19. 关于快速学习一项新技术或新领域的一些个人思维习惯与思想总结
  20. 利用谷歌语法查找网站后台和数据库

热门文章

  1. LVGL8制作简易时钟
  2. 客制化PO单据模板(实例)
  3. Photoshop路径与笔刷轻松制作轻纱漫舞
  4. 张朝阳喊话俞敏洪:为什么还不退休?
  5. iOS9获取手机序列号serialNumber(UDID)
  6. java maven 编辑器,Maven compiler 插件
  7. 三、vue3--生命周期、Hook函数、 toRef和toRefs、其他的组合式API
  8. systemd wsl 测试笔记
  9. Pycharm中的红色小闪电含义
  10. MATLAB算法实战应用案例精讲-【数据分析】时序异常检测(补充篇)(附Java、R语言和python代码实现)