函数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"
}