特效常用函数实例02

函数12:DepthBlend 深度混合

Shader "Custom/NewSurfaceShader" {
    Properties {
        _color1 ("color1", Color) = (0.5,0.5,0.5,1)
        _color2 ("color2", Color) = (0.5,0.5,0.5,1)
        _ctrol ("ctrol", Range(0, 5)) = 0
        [HideInInspector]_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
    }
    SubShader {
        Tags {
            "IgnoreProjector"="True"
            "Queue"="Transparent"
            "RenderType"="Transparent"
        }
        LOD 200
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            ZWrite Off
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase
            #pragma multi_compile_fog
            #pragma only_renderers d3d9 d3d11 glcore gles 
            #pragma target 3.0
            //_CameraDepthTexture
存储深度信息的Tex,需要在Shader中声明;
            uniform sampler2D _CameraDepthTexture;
            uniform float4 _color1;
            uniform float4 _color2;
            uniform float _ctrol;
            struct VertexInput {
                float4 vertex : POSITION;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float4 projPos : TEXCOORD0;
                UNITY_FOG_COORDS(1)
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos( v.vertex );
                UNITY_TRANSFER_FOG(o,o.pos);
               // ComputeScreenPos:位于UnityCG.cginc中,用于将裁剪空间坐标范围从[-w,w]映射到[0,w](不做透视除法,直接插值),像素着色器中用的时候一般除以w映射到[0,1]作为纹理(比如深度纹理)的uv值;
                o.projPos = ComputeScreenPos (o.pos);
                //COMPUTE_EYEDEPTH计算顶点到摄像机空间的深度:距离裁剪平面的距离,线性变化;查看UnityCG可以看到:#define COMPUTE_EYEDEPTH(o) o = -UnityObjectToViewPos( v.vertex ).z
                COMPUTE_EYEDEPTH(o.projPos.z);
                return o;
            }
              //tex2Dproj:与tex2D相似,不过输入的uv一般是上面ComputeScreenPos计算出的值,用的时候要除以w做个映射;tex2D手动除以w分量就可以可以达到tex2Dproj的效果。 tex2Dproj是映射的时候自动除以w分量。
            //UNITY_PROJ_COORD:处理平台差异,一般直接返回输入的值;
            
            //接下来用 UNITY_SAMPLE_DEPTH 获取到深度值,但此时的depth是非线性的。
            //LinearEyeDepth:unity中,我们从深度图中获取的值一般不能直接使用(一般是一个与观察空间的z值倒数线性相关的值),因此需要将其转化到观察空间的z值来使用,这个函数就是这个作用;
            //_ProjectionParams float4 x=1.0(或-1.0,如果正在使用一个翻转的投影矩阵进行渲染),y=Near, z=Far, w=1.0+1.0/Far,其中Near和Far分别是近裁剪平面和远裁剪平面离摄像机的距离。_ProjectionParams.g应该就是Near?
          
            float4 frag(VertexOutput i) : COLOR {
                float sceneZ = max(0,LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)))) - _ProjectionParams.g);
                float partZ = max(0,i.projPos.z - _ProjectionParams.g);
// Lighting:
// Emissive:
                float node_2071 = saturate((sceneZ-partZ)/_ctrol);
                float3 emissive = lerp(_color1.rgb,_color2.rgb,node_2071);
                float3 finalColor = emissive;
                fixed4 finalRGBA = fixed4(finalColor,node_2071);
                UNITY_APPLY_FOG(i.fogCoord, finalRGBA);
                return finalRGBA;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
    CustomEditor "ShaderForgeMaterialInspector"
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值