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 实现透明护盾效果相关推荐
- Unity Shader 之 简单 护盾Shield 效果的实现
Unity Shader 之 简单 护盾Shield 效果的实现 目录 Unity Shader 之 简单 护盾Shield 效果的实现 一.简单介绍 二.实现原理
- Unity Shader · 科技感矩阵效果
Unity Shader · 科技感矩阵效果 前言 最近想要做一个次世代卡通渲染(伪),选的是崩崩崩的小八(我最喜欢小八了). 先放几张截图,等全部做完之后再分享用到的一些技术叭. 赶紧做完发B站,等 ...
- Unity Shader·屏幕抖音效果
Unity Shader·屏幕抖音效果 前言 最近在做一个新的MMD(用Unity来实现),其中用到了一些好看的渲染技术在这里分享一下. 视频链接 https://www.bilibili.com/v ...
- Unity Shader学习:油画效果
Unity Shader学习:油画效果 油画效果在学习浅墨大神的文章时看到的比较有趣,但是原文中也没详细的算法介绍如何实现,这里就先直接拿来用吧,UI和屏幕后处理都可以用,算法也看的不是很明白,好像是 ...
- Unity Shader 之 透明效果
本文引用 Unity Shader入门精要 开启透明混合后,一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值外,还有--透明度.透明度为1,则完全不透明,透明度为0,则完全不会显示. 在Unity ...
- unity shader 纹理透明效果
1.纹理映射基础 (1)纹理映射通过(u,v)坐标实现.注意:这句话时博主当时面试一家外企被问到的问题. (2)添加纹理属性:--MainTex("Main Tex",2D)=&q ...
- Unity Shader 实现卡通渲染效果
本文参考博客Unity Toon Shader 卡通着色器(一):卡通着色 这是我实现的最后效果 我们先一步一步来 最开始我们实现一个只有漫反射效果的Shader,效果和代码如下 Shader &qu ...
- (三十一)unity shader之——————透明和半透明材质
一.半透明材质 SSS(sub-Surface Scattering,3S)的中文意思是次表面散射或称半透明材质.它适用于表现各种有次表面反射的材质,如透明橡胶.有机玻璃或玉石等.因为实时渲染是不可能 ...
- unity Shader模拟ps渐变映射效果
美术要求程序实现一个类似photo中"渐变映射"的效果. 记录一下用unity完成的shader. 放一张路易斯 那么渐变映射的原理是什么?以下是百度的结果: 在使用时,渐变映射首 ...
最新文章
- as 关联 android源码,android studio 2.x以上关联源码
- 用JS实现人脑和计算机交互,这个厉害了
- [云炬创业管理笔记]第四章把握创业机会测试3
- boost::mp11::mp_replace_at_c相关用法的测试程序
- linux 误删除mysql表能恢复吗,Linux误删数据恢复
- 数据加载中gif_淮师大GIF加载中......
- 删除ubuntu旧内核
- 软件构建中的设计(一)
- 阶段3 2.Spring_07.银行转账案例_9 基于子类的动态代理
- UCHome全面大解析【二】----基本体系结构
- 关于AD域和Exchange邮件服务器的学习总结
- Tri-Training: Exploiting Unlabeled Data Using Three Classifiers
- 条件表达式a?b:c是什么意思
- es2015学习笔记经典入门教程
- 计算机exo乐谱,【图片】【送谱】EXO所有歌曲的谱子【吉他谱吧】_百度贴吧
- 朱一龙左娜扎右热巴,王栎鑫:我想活成你的样子
- 教你一招:Word中的文字转换成表格,把表格转换成文字
- 深入分析 Uniswap V3 流动性供应的数学原理
- 关于快速学习一项新技术或新领域的一些个人思维习惯与思想总结
- 利用谷歌语法查找网站后台和数据库