物体出身效果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了物体出身效果相关的知识,希望对你有一定的参考价值。

   先看下效果

技术分享

shader如下:

Shader "Esfog/Dissolve"   
{  
    Properties   
    {  
        _MainTex ("Base (RGB)", 2D) = "white" {}  
        _MainColor("MainColor",color) = (1,1,1,1)
        _NoiseTex ("NoiseTex (R)",2D) = "white"{}  
        _DissolveSpeed ("DissolveSpeed (Second)",Range(-0.77,-0.25)) = 0  
        _tex2("tex2",2D) = "white"{}
        _tex2Light("tex2Light",Range(0,5)) =1
        _tex2Color("tex2Color",color) = (1,1,1,1)
        _alpha("alpha",Range(0,1)) = 0
         _Bump ("Bump", 2D) = "bump" {}/////
        _SpecularInten ("强度", Range(0, 10)) = 10/////
        _Scale ("范围", Range(0, 1)) = 0.1/////
        _SpecularColor("SpecularColor",Color) = (1,1,1,1)/////
       
    }  
    SubShader   
    {  

    Pass  
        {  
          Tags { "queue"="Transparent" "LightMode" = "ForwardBase"}  
          //ZWrite Off
         Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
            #include "UnityCG.cginc" 
            #define UNITY_PASS_FORWARDBASE
            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #include "Lighting.cginc"
            #pragma target 3.0
               
            struct v2f
             {
                float4  pos : SV_POSITION;
                float2  uv : TEXCOORD0;
                float3  vertex:TEXCOORD1;
                float4 posWorld : TEXCOORD2;
                float3 normal : TEXCOORD3;
                float3 tangentDir : TEXCOORD4;
                float3 bitangentDir : TEXCOORD5;
                 LIGHTING_COORDS(6,7)
             } ;

            struct VertexInput {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 tangent : TANGENT;/////
                float2 uv : TEXCOORD0;
            };
sampler2D _MainTex; float4 _MainTex_ST; sampler2D _NoiseTex;
float _DissolveSpeed; float4 _MainColor; float _alpha; sampler2D _Bump; ///// float4 _Bump_ST;///// float _SpecularInten;///// float _Scale;///// float4 _SpecularColor;///// v2f vert (VertexInput v) { v2f o; o.pos = UnityObjectToClipPos (v.vertex); o.uv = TRANSFORM_TEX (v.uv, _MainTex); o.vertex = v.vertex; o.normal =( UnityObjectToWorldNormal(v.normal)); o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );/////切线方向 o.bitangentDir = normalize(cross(o.normal, o.tangentDir) * v.tangent.w);/////切线与法线的差积,双切线 o.posWorld = mul(unity_ObjectToWorld, v.vertex); TRANSFER_VERTEX_TO_FRAGMENT(o) return o; } float4 frag(v2f i):COLOR { float3 nVert =i.normal; float3x3 tangentTransform = float3x3( i.tangentDir, i.bitangentDir, nVert);///// float3 BumpMap = UnpackNormal(tex2D(_Bump,i.uv)); float3 N = normalize(mul( BumpMap.rgb, tangentTransform )); float3 V = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); float3 L = normalize(_WorldSpaceLightPos0.xyz); float3 speL = normalize(V+L); float atten = LIGHT_ATTENUATION(i); float Gloss = exp2( _Scale * 10.0+1.0); float NdotSpeL = saturate(dot (speL,N)); float4 col =tex2D(_MainTex,i.uv) *_MainColor; float3 specular0 = atten * _LightColor0.xyz * pow(NdotSpeL,Gloss) * _SpecularColor * _SpecularInten*col.a; float NdotL = saturate(dot( N, L )); float2 uv = i.vertex.yz; uv.y -=_DissolveSpeed; uv.x -= _DissolveSpeed; float noiseValue = tex2D(_NoiseTex,uv).r; if(noiseValue <0.2) { discard; } col.rgb = col.rgb *(NdotL *_LightColor0.xyz * atten + UNITY_LIGHTMODEL_AMBIENT.rgb) +specular0; col.a = _alpha; return col; } ENDCG } Pass { Tags { "queue"="Transparent" "LightMode" = "ForwardAdd"} ZWrite On Blend One One CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #define UNITY_PASS_FORWARDBASE #include "UnityCG.cginc" #include "AutoLight.cginc" #pragma multi_compile_fwdbase_fullshadows #include "Lighting.cginc" #pragma target 3.0 struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; float3 vertex:TEXCOORD1; float4 posWorld : TEXCOORD2; float3 normal : TEXCOORD3; float3 tangentDir : TEXCOORD4; float3 bitangentDir : TEXCOORD5; LIGHTING_COORDS(6,7) } ; struct VertexInput { float4 vertex : POSITION; float3 normal : NORMAL; float4 tangent : TANGENT;///// float2 uv : TEXCOORD0; }; sampler2D _MainTex; float4 _MainTex_ST; sampler2D _NoiseTex; float _DissolveSpeed; float4 _MainColor; float _alpha; sampler2D _Bump; ///// float4 _Bump_ST;///// float _SpecularInten;///// float _Scale;///// float4 _SpecularColor;///// v2f vert (VertexInput v) { v2f o; o.pos = UnityObjectToClipPos (v.vertex); o.uv = TRANSFORM_TEX (v.uv, _MainTex); o.vertex = v.vertex; o.normal =( UnityObjectToWorldNormal(v.normal)); o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );/////切线方向 o.bitangentDir = normalize(cross(o.normal, o.tangentDir) * v.tangent.w);/////切线与法线的差积,双切线 o.posWorld = mul(unity_ObjectToWorld, v.vertex); TRANSFER_VERTEX_TO_FRAGMENT(o) return o; } float4 frag(v2f i):COLOR { float3 nVert =i.normal; float3x3 tangentTransform = float3x3( i.tangentDir, i.bitangentDir, nVert);///// float3 BumpMap = UnpackNormal(tex2D(_Bump,i.uv)); float3 N = normalize(mul( BumpMap.rgb, tangentTransform )); float3 V = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); float3 L = normalize (lerp(_WorldSpaceLightPos0.xyz , _WorldSpaceLightPos0.xyz - i.posWorld.xyz , _WorldSpaceLightPos0.w)); float3 speL = normalize(V+L); float atten = LIGHT_ATTENUATION(i); float Gloss = exp2( _Scale * 10.0+1.0); float NdotSpeL = saturate(dot (speL,N)); float4 col =tex2D(_MainTex,i.uv) *_MainColor; float3 specular0 = atten * _LightColor0.xyz * pow(NdotSpeL,Gloss) * _SpecularColor * _SpecularInten*col.a; float NdotL = saturate(dot( N, L )); float2 uv = i.vertex.yz; uv.y -=_DissolveSpeed; uv.x -= _DissolveSpeed; float noiseValue = tex2D(_NoiseTex,uv).r; if(noiseValue <0.2) { discard; } col.rgb = col.rgb *(NdotL *_LightColor0.xyz * atten) +specular0; col.a = _alpha; return col; } ENDCG } Pass { Blend One One CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float3 vertex:TEXCOORD0; float3 normal:TEXCOORD1; } ; sampler2D _tex2; float _tex2Light; float4 _tex2Color; float _DissolveSpeed; struct VertexInput { float4 vertex : POSITION; float3 normal : NORMAL; float4 tangent : TANGENT;///// float2 uv : TEXCOORD0; }; v2f vert (VertexInput v) { v2f o; o.pos = UnityObjectToClipPos (v.vertex); o.vertex = v.vertex; o.normal = v.normal; return o; } float4 frag(v2f i):COLOR { half3 blend = abs(i.normal); blend /= dot(blend,1.0); float3 uv = i.vertex.xyz; uv.z -=_DissolveSpeed; uv.x -=_DissolveSpeed; uv.y -=_DissolveSpeed; fixed4 yz = tex2D (_tex2,uv.yz); fixed4 xz = tex2D (_tex2,uv.xz); float4 texColor= yz*blend.x + xz*blend.y; texColor= texColor * _tex2Light * _tex2Color; return texColor; } ENDCG } } FallBack Off }

 

  代码看上去有点长,其实比较简单,大部分代码都是在写灯光,第一个pass里做了一个裁切效果,主贴图包括法线高光等效果

第二个pass是多光源效果,第三个pass是那条高光线的叠加效果 用到的贴图如下

技术分享

  1 主贴图没什么好说的

  2 位一半黑色一半灰色 黑色部分为裁切掉的部分,这张贴图的uv做了裁切效果

  3 法线

  4 一条线 这条线用了add的方式叠加在模型上 ,跟2要配合使用,黑灰的分割线也就是这根线的位置

一起跟着uv上移就可以了

      总结:如果想提高效率的话 需要把实时灯光去掉,加上自己的模拟灯光。模拟灯光的方法会在后面的文章里写上。

 

以上是关于物体出身效果的主要内容,如果未能解决你的问题,请参考以下文章

ppt中的三维效果怎么使用

Unity三种物体溶解方法

Unity -- Animation(旧版动画组件)和Animator(新版动画器组件)

Blender制作多个动画片段时踩的坑

unity 物体颜色从一段到另一端逐渐变色,这个效果怎么做的?

炫酷 CSS 背景效果的 10 个代码片段